How Do You Compile An Ast.expr?
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)
Solution 1:
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}, {}))
Solution 2:
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 identifiersExpr
,Expression
, andexpr
, 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>
Post a Comment for "How Do You Compile An Ast.expr?"