您如何编译ast.Expt?

时间:2018-10-15 15:24:07

标签: python abstract-syntax-tree

code='1+1'
import ast
expr = ast.parse(code).body[0]
print(type(expr))
compile(ast.Expression(expr), 'string', "eval")

得到我

  

“ _ ast.Expr”类

     

回溯(最近通话最近):文件   第6行中的“ test_ast.py”       compile(ast.Expression(expr),'',“ eval”)TypeError:期望某种形式的expr,但在 0x7fe89442d9e8>

compile(expr, '<string>', "eval")

也不起作用:

  

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

2 个答案:

答案 0 :(得分:1)

here中提供了有关表达式的有趣解释。

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

  

Expr本身不是表达式的节点,而是表达式语句---即仅由表达式组成的语句。这并不是很明显,因为抽象语法使用了三个不同的标识符ExprExpressionexpr,它们的含义都稍有不同。

因此,在您的情况下,您需要先转储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>

答案 1 :(得分:0)

TLDR:用ast.Expression(expr.value)替换expr

对此Convert ast node into python object的评论和makeMonday的回答为我提供了解决方案:

(gdb) x/80d 0x602000
0x602000:       0       0       0       0       0       0       0       0
0x602008:       33      0       0       0       0       0       0       0
0x602010:       111     0       0       0       0       0       0       0
0x602018:       -34     0       0       0       0       0       0       0
0x602020:       77      1       0       0       0       0       0       0
0x602028:       -31     15      2       0       0       0       0       0
0x602030:       0       0       0       0       0       0       0       0
0x602038:       0       0       0       0       0       0       0       0
0x602040:       0       0       0       0       0       0       0       0
0x602048:       0       0       0       0       0       0       0       0
(gdb)