如何在配置文件中评估简单的数学表达式
我想用一个配置文件来写一些简单的数学表达式,比如加法或减法。
举个例子:
[section]
a = 10
b = 15
c = a-5
d = b+c
有没有办法用ConfigParser模块来实现这个?我看到一些例子是把字符串当作变量放在配置文件里,但如果我这样做,就会得到未计算的字符串(然后我还得在我的Python代码里自己解析它)。
如果在ConfigParser里做不到,你有什么其他模块推荐吗?
3 个回答
1
有些项目会把配置文件做成一个Python模块。这样你只需要导入它(或者用exec
命令)来运行里面的内容。这种做法给你带来了很大的灵活性,不过要注意安全问题,特别是你在什么地方使用它的时候(比如“只需把这些代码粘贴到你的.whateverrc.py文件里...”)。
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
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