如何在python eval表达式中对变量进行惰性求值

如何在python eval表达式中对变量进行惰性求值,python,Python,该场景是,我的用户可以提供一个表达式字符串进行计算。它可以是: "power=(x**2+y**2)**0.5" 然后我得到一个带有标签的输入数据流。例如: x ; y ; z 1 ; 2 ; 3 1 ; 3 ; 4 我将输出如下数据流: x ; y ; z ; power 3 ; 4 ; 3 ; 5.0 6 ; 8 ; 4 ; 10.0 但我也会让用户可以使用更“昂贵”的变量,例如“sum”: "mysum = sum + 5" 但我不想计算“总和”,除非需要 那么,如何最好地计算表

该场景是,我的用户可以提供一个表达式字符串进行计算。它可以是:

"power=(x**2+y**2)**0.5"
然后我得到一个带有标签的输入数据流。例如:

x ; y ; z
1 ; 2 ; 3
1 ; 3 ; 4
我将输出如下数据流:

x ; y ; z ; power
3 ; 4 ; 3 ; 5.0 
6 ; 8 ; 4 ; 10.0
但我也会让用户可以使用更“昂贵”的变量,例如“sum”:

"mysum = sum + 5"
但我不想计算“总和”,除非需要

那么,如何最好地计算表达式中的变量呢? 性能很重要,但并不过分

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

我以前试过问这个问题-。 但显然不是很简洁

我目前正在使用eval和名称空间。其他方法也受欢迎

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


如果您能给出一个很好的答案,我们将不胜感激。

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

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)
这是安德烈·拉兹洛发布的

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


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

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

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)
这是安德烈·拉兹洛发布的

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


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

这是一个错误。当你问最后一个问题时,这是一个XY问题。除非你停止谈论Y,开始谈论X,否则你不会得到好的答案,你会一直吸引接近票数的人。写一个翻译。这涉及到将输入字符串解析为表示表达式的抽象语法树,然后编写一个函数,在绑定到其值的变量上下文中计算AST。当你问最后一个问题时,这是一个XY问题。除非你停止谈论Y,开始谈论X,否则你不会得到好的答案,你会一直吸引接近票数的人。写一个翻译。这涉及到将输入字符串解析为表示表达式的抽象语法树,然后编写一个函数,在绑定到其值的变量上下文中计算AST。