Skip to content Skip to sidebar Skip to footer

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 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>

Post a Comment for "How Do You Compile An Ast.expr?"