如何在Python AST中用值替换变量名?

如何在Python AST中用值替换变量名?,python,abstract-syntax-tree,Python,Abstract Syntax Tree,我希望我的用户能够在命令行中以Python语法输入算术表达式,并在运行时将变量名替换为值。我不想只使用eval,我想使用 例如,假设我想用值3.5重写AST中的每个变量,然后对其求值。通过阅读文档,我想到了这个 import ast class RewriteName(ast.NodeTransformer): def visit_Name(self, node): return ast.copy_location(ast.Num(n=3.5, ctx=node.ct

我希望我的用户能够在命令行中以Python语法输入算术表达式,并在运行时将变量名替换为值。我不想只使用
eval
,我想使用

例如,假设我想用值
3.5
重写AST中的每个变量,然后对其求值。通过阅读文档,我想到了这个

import ast

class RewriteName(ast.NodeTransformer):

    def visit_Name(self, node):
        return ast.copy_location(ast.Num(n=3.5, ctx=node.ctx), node)

tree = ast.parse('a + b', 'eval')
tree = RewriteName().visit(tree)
ast.fix_missing_locations(tree)
o = compile(tree, '<string>', 'eval')
print(eval(o))
我知道
Expression
Expr
之间的术语比较混乱,但我还没有找到一个如何排序的例子。我尝试了各种参数来编译,包括在树的不同子节点上运行它,认为其中一个可能是我需要的表达式,但迄今为止没有成功


是什么样的示例代码使这一点起作用?

我用错误的参数调用了
ast.parse
。正确的电话是

tree = ast.parse('a+b', '', eval)

(请参阅上面的注释。)

您调用的是
ast.parse()
错误-模式(如果要在“eval”模式下编译修改后的ast,则必须是“eval”)是第三个参数,而不是第二个参数。是的。如果我将行更改为
tree=ast.parse('a+b',''eval')
它会工作。你应该加上这个作为答案,这样我就可以标记问题已解决。
tree = ast.parse('a+b', '', eval)