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

3 投票
3 回答
3988 浏览
提问于 2025-04-16 09:46

我想用一个配置文件来写一些简单的数学表达式,比如加法或减法。
举个例子:

[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

撰写回答