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



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

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

 pi:  `np.pi`

但这不是:

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

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

我不熟悉config模块本身,但是想象一下,您可以轻松地使用内置的ConfigParser(或Python 3中的configparser)模块做类似于下面所示的事情。

给定这个配置文件:

[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]部分,以便在使用之前定义它们。

最新更新