【发布时间】:2019-04-08 20:18:38
【问题描述】:
我希望我的用户能够在命令行中以 Python 语法输入算术表达式,并在运行时将变量名替换为值。我不想只使用eval,我想使用Abstract Syntax Trees。
例如,假设我想用值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))
我希望它打印7.0,但我得到了以下错误。
o = compile(tree, '<string>', 'eval')
TypeError: expected Expression node, got Module
我了解关于 Expression 与 Expr 的 AST 令人困惑的命名法,但我无法找到如何对此进行排序的示例。我尝试了compile 的各种参数,包括在tree 的各个子节点上运行它,认为其中一个可能是我需要的表达式,但到目前为止没有成功。
什么是使这个工作的示例代码?
【问题讨论】:
-
你调用
ast.parse()错误 - 模式(如果你要在 'eval' 模式下编译修改后的 AST 必须是 'eval')是第三个参数,而不是第二个. -
是的。如果我将行更改为
tree = ast.parse('a + b', '', 'eval')它可以工作。您应该将此添加为答案,以便我可以将问题标记为已解决。
标签: python abstract-syntax-tree