我如何延迟评估python eval表达式中的变量

时间:2016-06-23 15:28:58

标签: python

场景是我的用户可以提供表达式字符串以供评估。它可能是:

"power=(x**2+y**2)**0.5"

然后我获得带标签的数据输入流。 E.g:

x ; y ; z
1 ; 2 ; 3
1 ; 3 ; 4

我将输出如下数据流:

x ; y ; z ; power
3 ; 4 ; 3 ; 5.0 
6 ; 8 ; 4 ; 10.0

但我也会给用户使用更多“昂贵”变量的可能性,例如'和':

"mysum = sum + 5"

但我不想计算“总和”,除非需要

那么我如何最好地懒惰地评估表达式中的变量? 表现很重要,但并非过分。

清晰易懂的代码是最重要的

我之前曾试过问过这个问题 - How do I detect variables in a python eval expression。 但显然不是很简洁

我目前正在使用eval和namespace。其他方法也欢迎。

另一种可以提供更好性能的方法是检测用户表达式中所有包含的变量,以便事先知道需要哪些预先计算的变量。

对此的好答案也将受到赞赏

1 个答案:

答案 0 :(得分:0)

该问题的最佳解决方案也发布在链接问题中:

import ast
def varsInExpression(expr):
    st = ast.parse(expr)
    return set(node.id for node in ast.walk(st) if type(node) is ast.Name)

这是由AndréLaszlo发布的

它允许我在接收任何数据之前初始化所需的变量和函数,并且只预先计算使用的“智能”变量

懒惰的评估部分尚未收到好的答案