我有一个Python程序的抽象语法树(AST),想手动评估if语句的条件。
cond = node.test
b = eval(compile(cond,"<string>","eval"))
print b
当节点是If-Node时,会给我TypeError: expected Expression node, got Compare的错误提示,即使根据Python ast文档中的语法规则,Compare也是一个表达式。
有什么想法吗?
我有一个Python程序的抽象语法树(AST),想手动评估if语句的条件。
cond = node.test
b = eval(compile(cond,"<string>","eval"))
print b
当节点是If-Node时,会给我TypeError: expected Expression node, got Compare的错误提示,即使根据Python ast文档中的语法规则,Compare也是一个表达式。
有什么想法吗?
expr = ast.Expression(cond)
因为抽象语法将其定义为:
Expression(expr body)
你可以编译这个:
compile(expr, '<file>', 'eval')
演示:
>>> import ast
>>> code = "if foo == 'bar': pass"
>>> tree = ast.parse(code, '<file>', 'exec')
>>> cond = tree.body[0].test
>>> expr = ast.Expression(cond)
>>> compile(expr, '<file>', 'eval')
<code object <module> at 0x1067f6230, file "<file>", line 1>
>>> foo = 'baz'
>>> eval(compile(expr, '<file>', 'eval'))
False
>>> foo = 'bar'
>>> eval(compile(expr, '<file>', 'eval'))
True
Expression()
只接受一个expr
字段,而不是它们的列表。 - Martijn Pieters