Python编译了eval?

时间:2013-12-09 20:52:30

标签: python dsl

我的情况如下:

  1. 我有一个像object这样的大表,可以用字符串键和整数索引访问;即查找是这样的: value = table.get("Key", index)
  2. 我想让用户有机会输入涉及字符串键的任意代数表达式。然后,代码应迭代第二个索引并重复计算表达式。
  3. 所以对于这样的用户输入:"KeyA + 2*math.abs(KeyC)"我想运行类似的python代码:

    for index in index_list:
        answer = table.get("KeyA", index) + 2*math.abs(table.get("Keyc",index))
    

    我想我可以使用我在互联网上找到的一个Python Parser库来解析表达式,但我并不清楚实际上是如何“运行”解析的代码。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果最终用户可以在图括号{..}中输入变量,则可以使用str.format格式化字符串

>>> expression = '{a}*{b}'
>>> values = {'a': 10, 'b': 20, 'c': 30} 
>>> expression.format(**values)
'10*20'

对于在表达式中找到的所有键,这里的值字典可能会填充table.get,例如使用正则表达式:

>>> import re
>>> regexp = re.compile('{(.*?)}')
>>> keys = regexp.findall(expression)
>>> keys
['a', 'b']
>>> table_get = lambda *x: np.random.randint(5)
>>> values = {k: table_get(k) for k in keys}
>>> expression.format(**values)
'1*4'

然后,您可以参考Safe way to parse user-supplied mathematical formula in Python获取安全表达式解析和评估。