使用config.py模块在配置文件中使用eval函数

时间:2016-10-25 19:06:22

标签: python configuration config

我有一个配置文件,其参数是sin和cos的函数。为方便起见,我可以简单地将这些参数编码为定义它们的表达式而不是结果值。

如果我使用.py配置文件,显然支持这一点,但我正在研究使用config.py Python模块。但是,看起来虽然此模块允许使用自定义命名空间,但它只允许评估命名空间中的属性,而不是函数调用。例如,如果我将numpy名称空间添加为np,则允许这样做:

 pi:  `np.pi`

但这不是:

 x: 0.1
 sin_of_x: `np.sin($x)`

我猜这是出于安全原因,因此恶意用户无法通过添加带有恶意功能的命名空间来插入恶意代码。有没有办法解决这个问题,或者python作为配置文件是唯一的选择吗?

1 个答案:

答案 0 :(得分:1)

我对config模块本身并不熟悉,但想象您可以使用内置的ConfigParser(或Python中的configparser轻松地执行类似于下面所示的操作3)模块。

鉴于此配置文件:

[Section1]
x: 0.1
sin_of_x: math.sin(x)

这段代码:

import ConfigParser
import math

parser = ConfigParser.ConfigParser()
parser.read('eval_config.cfg')

namespace = {'__builtins__': None, 'math': math}
for name, value in parser.items('Section1'):
    value = eval(value, namespace)
    print('{!r} = {!r}'.format(name, value))
    namespace[name] = value

输出:

'x' = 0.1
'sin_of_x' = 0.09983341664682815

如果您不想对模块名称进行硬编码,可以在配置文件中添加单独的[Modules]部分,以便在使用前对其进行定义。