如何在Python AST中用值替换变量名?
我希望我的用户能够在命令行中以Python语法输入算术表达式,并在运行时将变量名替换为值。我不想只使用如何在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
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)