3

加算や減算などの簡単な数式を含む構成ファイルを使用したいと考えています。
例えば:

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

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

ConfigParser でそれができない場合、お勧めのモジュールはありますか?

4

3 に答える 3

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
于 2011-01-11T13:29:40.747 に答える
2

必要に応じて、次のようなことができます。

example.conf :

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

スクリプトで次のことができます。

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'

式を評価できます:

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

ConfigParserモジュールのクラスにこのような関数が欠落していると思われる場合は、 get()メソッドで式を評価する関数を渡すことができるようにする必要があると思います。

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
于 2011-01-11T13:55:25.867 に答える
2

一部のプロジェクトで使用されるアプローチの 1 つは、構成ファイルを Python モジュールにすることです。次に、それをインポート (または を使用exec) してコンテンツを実行します。これにより多くのパワーが得られますが、使用する場所によっては明らかにセキュリティ上の懸念があります (「これらの行を .whateverrc.py ファイルに貼り付けるだけです...」)。

于 2011-01-11T13:29:55.870 に答える