Python 如何计算配置文件中的简单数学表达式

Python 如何计算配置文件中的简单数学表达式,python,configuration-files,configparser,Python,Configuration Files,Configparser,我想将配置文件与一些简单的数学表达式(如加法或减法)一起使用。 例如: [section] a = 10 b = 15 c = a-5 d = b+c 使用ConfigParser模块有什么方法可以做到这一点吗?我在配置文件中找到了一些使用字符串作为变量的例子,但是如果我使用它,我会得到一个未计算的字符串(我必须在python代码中解析它) 如果在ConfigParser中不可能,您是否建议使用任何模块?为什么要使用ConfigParser?为什么不 config.py: a = 10 b =

我想将配置文件与一些简单的数学表达式(如加法或减法)一起使用。
例如:

[section]
a = 10
b = 15
c = a-5
d = b+c
使用ConfigParser模块有什么方法可以做到这一点吗?我在配置文件中找到了一些使用字符串作为变量的例子,但是如果我使用它,我会得到一个未计算的字符串(我必须在python代码中解析它)


如果在ConfigParser中不可能,您是否建议使用任何模块?

为什么要使用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

一些项目使用的一种方法是将配置文件设置为Python模块。然后只需导入它(或使用
exec
)即可运行内容。这为您提供了很大的功能,尽管根据您使用它的位置显然存在一些安全问题(“只需将这些行粘贴到您的.whateverrc.py文件…”)。

如果必须,您可以执行以下操作:

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
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

如果我可以建议,我认为模块类缺少这样一个函数,我认为该方法应该允许传递一个函数来计算表达式:

print eval(config.get('section', 'c'))
# 25
print eval(config.get('section', 'd'))
# 40
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

计算不是配置文件的用途。@SilentGhost:您不应该做太多的处理,但在某些情况下,您希望在能够更改y的同时说“x比y大5”。这比指定x_ydiff和排序优先级规则等要简洁得多。您可以使用Vinay Sajip,这是他在comp.lang.python中的条目,允许在配置文件中使用。或者,你也可以利用页面上的Steven Siew轻松地将其组合在一起。不过,在配置文件中随机调用eval on选项可能不是一种习惯。一个python文件,你可以期望它是可执行的,但你不能期望它从配置文件内部运行任意指令。虽然我喜欢半可执行配置文件的整个概念,但我不太喜欢
%(…)使用
exec
的一个优点是文件可以有任何扩展名,也可以没有扩展名。我相信它必须命名为*.py才能导入。@martineau:它也不必在PYTHONPATH中。IPython的新配置系统使用了
exec
(尽管文件的扩展名仍然是.py,这不仅仅是为了清楚它是什么)。