如何在“评估”模式下编译ast节点

时间:2019-09-11 21:48:19

标签: python abstract-syntax-tree

我想创建一个代码对象,以后可以与eval重用。我需要基于一些以编程方式生成的ast节点来执行此操作,因此我无法将代码作为字符串传递给compile函数。如何构造一个有效的ast节点进行编译?以下是我尝试过的几件事:

tree = ast.parse("2+2")
exe = compile(tree.body[0], filename="", mode="eval")
  

TypeError:预期的Expression节点,具有Expr

tree = ast.BinOp(left=ast.Num(n=2), right=ast.Num(n=2), op=ast.Add())
exe = compile(tree, filename="", mode="eval")
  

TypeError:预期的表达式节点,得到BinOp

tree = ast.BinOp(left=ast.Num(n=2), right=ast.Num(n=2), op=ast.Add())
expr = ast.Expression(body=[tree])
ast.fix_missing_locations(expr)
exe = compile(expr, filename="", mode="eval")
  

TypeError:expr中缺少必填字段“ lineno”

1 个答案:

答案 0 :(得分:2)

您最近的尝试已经结束,但是body中的ast.Expression应该是单个表达式,而不是表达式列表。

更改:

expr = ast.Expression(body=[tree])

收件人:

expr = ast.Expression(body=tree)

使eval(exe)返回:4