2011-01-11 37 views
3

設定ファイルに、加算や減算などの簡単な数式を使用したいとします。たとえば
設定ファイルで簡単な数式を評価する方法

[section] 
a = 10 
b = 15 
c = a-5 
d = b+c 

のConfigParserモジュールを使用してこれを行うにはどのような方法がありますか?私は、設定ファイルの変数の一種として文字列を使用するいくつかの例を見つけましたが、私はそれを使用している場合、私は(と私は私のpythonコードで解析する必要があります)文字列を評価されません。

ConfigParserでは、お勧めのモジュールはありませんか?

+5

計算何の設定ファイルではありませんのためです。 – SilentGhost

+1

@SilentGhost:あまりにも多くの処理を行うべきではありませんが、「xはyよりも大きく」、yを変更できるという状況があります。これは、x_diffを指定して優先ルールをソートするなどの方法よりもはるかに簡単です。 –

+0

comp.lang.python [ConfigParserShootout](http://www.red-dove.com/config-doc)のVinay Sajipの['config'モジュール](http:// wiki)を使うことができます。 python.org/moin/ConfigParserShootout)を使用して、設定ファイルで[式の使用](http://www.red-dove.com/config-doc/#using-expressions)を許可します。また、[pyparsing - Examples](http:// pyparsing)のSteven Siewの[SimpleCalc.py](http://pyparsing.wikispaces.com/file/view/SimpleCalc.py)を利用すれば、 wikispaces.com/Examples)ページ。 – martineau

答えて

9

なぜConfigParserを使用するのですか?なぜちょうど

config.pyない:

a = 10 
b = 15 
c = a-5 
d = b+c 

script.py:いくつかのプロジェクトが使用

import config 
print(config.c) 
# 5 
print(config.d) 
# 20 
2

一つのアプローチは、コンフィギュレーション・ファイルPythonモジュールを作ることです。次に、コンテンツをインポートするには(またはexecを使用して)インポートします。それはあなたに多くの力を与えますが、明らかに、あなたがそれをどこで使うかによってセキュリティ上の懸念があります(「.whateverrc.pyファイルにこれらの行を貼り付けてください...」)。

+0

'exec'を使用する利点の1つは、ファイルに拡張子を付けることができます。インポートするには* .pyという名前を付ける必要があると思います。 – martineau

+0

@martineau:それはPYTHONPATHにある必要はありません。 IPythonの新しい設定システムは 'exec'を使っています(ただしファイルには拡張子が.pyしかありませんが、それが何であるかを明確にするためではありません)。 –

2

あなたはこのような何かを行うことができなければならない場合:

あるexample.conf:

import ConfigParser 

config = ConfigParser.SafeConfigParser() 
config.readfp(open('example.conf')) 

print config.get('section', 'a') 
# '10' 
print config.get('section', 'b') 
# '15' 
print config.get('section', 'c') 
# '10+15' 
print config.get('section', 'd') 
# '15+10+15' 

を、あなたが式をevalのことができます。

[section] 
a = 10 
b = 15 
c = %(a)s+%(b)s 
d = %(b)s+%(c)s 

とスクリプトにあなたが行うことができます

print eval(config.get('section', 'c')) 
# 25 
print eval(config.get('section', 'd')) 
# 40 

私はConfigParserモジュールクラスは、このような機能が欠けていると思い示唆することができる場合、私はget()方法は、式をevalします機能を渡すことができるようにすべきだと思う:

def my_get(self, section, option, eval_func=None): 

    value = self.get(section, option) 
    return eval_func(value) if eval_func else value 

setattr(ConfigParser.SafeConfigParser, 'my_get', my_get) 


print config.my_get('section', 'c', eval) 
# 25 

# Method like getint() and getfloat() can just be writing like this: 

print config.my_get('section', 'a', int) 
# 10 
+0

あなたの設定ファイルのオプションでevalを無作為に呼び出すことは、おそらく習慣ではありません。あなたが実行可能であると期待できるPythonファイルですが、内部の設定ファイルから任意の命令を実行することは期待していません。 –

+0

私はセミ実行可能な設定ファイルの考え方が気に入っていますが、私はこのアプローチが必要とする '%(...)s'表記についてはあまり気にしません。 – martineau

関連する問題