How do you compile an ast.Expt?

2019-07-26 00:12发布

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

gets me

class '_ast.Expr'

Traceback (most recent call last): File "test_ast.py", line 6, in compile(ast.Expression(expr), '', "eval") TypeError: expected some sort of expr, but got <_ast.Expr object at> 0x7fe89442d9e8>

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

does not works either:

TypeError: expected Expression node, got Expr

2条回答
Root(大扎)
2楼-- · 2019-07-26 00:33

An interesting explanation about Expressions can be found here.

But basically, the answer's first paragraph says it all:

Expr is not the node for an expression per se but rather an expression-statement --- that is, a statement consisting of only an expression. This is not totally obvious because the abstract grammar uses three different identifiers Expr, Expression, and expr, all meaning slightly different things.

So, in your case, you would need to dump the Expr first:

>>> 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>
查看更多
走好不送
3楼-- · 2019-07-26 00:52

TLDR : replace expr by ast.Expression(expr.value)

A comment on this Convert ast node into python object and makeMonday answer gave me the solution:

code = 'a+1'
import ast
expr = ast.parse(code).body[0]
print(eval(compile(ast.Expression(expr.value), '<string>', "eval"), {"a": 4}, {}))
查看更多
登录 后发表回答