【问题标题】:function eval in config file with config.py module带有 config.py 模块的配置文件中的函数 eval
【发布时间】:2017-03-07 23:09:58
【问题描述】:

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

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

 pi:  `np.pi`

但这不是:

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

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

【问题讨论】:

    标签: python configuration config


    【解决方案1】:

    我对 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] 部分以在使用前对其进行定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2018-05-31
      • 2021-05-05
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2012-09-12
      相关资源
      最近更新 更多