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)
但基本上,答案的第一段说明了一切:
Expr本身不是表达式的节点,而是表达式语句——即仅由表达式组成的语句。这并不完全明显,因为抽象语法使用三个不同的标识符Expr、Expression、 和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)