如何编译 ast.Expr?

Jul*_*nFr 6 python abstract-syntax-tree

import ast

code = '1+1'
expr = ast.parse(code).body[0]
print(type(expr))
compile(ast.Expression(expr), 'string', "eval")
Run Code Online (Sandbox Code Playgroud)

让我明白

import ast

code = '1+1'
expr = ast.parse(code).body[0]
print(type(expr))
compile(ast.Expression(expr), 'string', "eval")
Run Code Online (Sandbox Code Playgroud)
compile(expr, '<string>', "eval")
Run Code Online (Sandbox Code Playgroud)

也不起作用:

TypeError: expected Expression node, got Expr
Run Code Online (Sandbox Code Playgroud)

mak*_*day 1

关于表达式的有趣解释可以在这里找到。

但基本上,答案的第一段说明了一切:

Expr本身不是表达式的节点,而是表达式语句——即仅由表达式组成的语句。这并不完全明显,因为抽象语法使用三个不同的标识符ExprExpression、 和expr,它们的含义都略有不同。

因此,就您而言,您需要先转储 Expr:

>>> ast.dump(expr)
'Expr(value=BinOp(left=Num(n=1), op=Add(), right=Num(n=1)))'
>>> compile(ast.dump(expr), 'string', "eval")
<code object <module> at 0x1065d2ae0, file "string", line 1>
Run Code Online (Sandbox Code Playgroud)