我想使用带有一些简单数学表达式的配置文件,例如添加或减少 例如:
[section]
a = 10
b = 15
c = a-5
d = b+c
有没有办法使用ConfigParser模块执行此操作?我发现了一些在配置文件中使用字符串作为变量的例子,但如果我使用它,我会得到一个未计算的字符串(我必须在我的python代码中解析它)。
如果在ConfigParser中无法推荐您推荐的模块吗?
答案 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