如何评估配置文件中的简单数学表达式

时间:2011-01-11 13:19:32

标签: python configuration-files configparser

我想使用带有一些简单数学表达式的配置文件,例如添加或减少 例如:

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

有没有办法使用ConfigParser模块执行此操作?我发现了一些在配置文件中使用字符串作为变量的例子,但如果我使用它,我会得到一个未计算的字符串(我必须在我的python代码中解析它)。

如果在ConfigParser中无法推荐您推荐的模块吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

某些项目使用的一种方法是使配置文件成为Python模块。然后只需导入它(或使用exec)来运行内容。这给了你很多权力,虽然显然存在一些安全问题,具体取决于你使用它的位置(“只需将这些行粘贴到.whateverrc.py文件......”)。

答案 2 :(得分: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