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
答案 0 :(得分:1)
here中提供了有关表达式的有趣解释。
但基本上,答案的第一段说明了一切:
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>
答案 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)