julienfr112
julienfr112

Reputation: 2137

How do you compile an ast.Expr?

import ast

code = '1+1'
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 <module>
    compile(ast.Expression(expr), '<string>', "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

Upvotes: 6

Views: 1967

Answers (2)

julienfr112
julienfr112

Reputation: 2137

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

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

import ast

code = 'a+1'
expr = ast.parse(code).body[0]
print(eval(compile(ast.Expression(expr.value), '<string>', "eval"), {"a": 4}, {}))

Upvotes: 4

makeMonday
makeMonday

Reputation: 2415

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>

Upvotes: 1

Related Questions