带有 config.py 模块的配置文件中的函数 eval

function eval in config file with config.py module

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

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

 pi:  `np.pi`

但这不是:

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

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

我不熟悉 config 模块本身,但想象一下,您可以使用内置 ConfigParser(或 configparser在 Python 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] 部分,以便在使用前定义它们。