评估Python中if的条件
我有一个Python程序的抽象语法树(AST),想要手动评估一个if语句的条件。
cond = node.test
b = eval(compile(cond,"<string>","eval"))
print b
这里的node是if节点,但我遇到了一个错误:TypeError: expected Expression node, got Compare。虽然根据Python的AST文档,Compare是一个表达式。
有没有什么想法?
1 个回答
5
你有一个 ast.expr
的子类,而不是一个顶层的 ast.Expression
节点。
compile()
只能接受一个 mod
对象,所以它可以是 Module
、Interactive
或 Expression
,这取决于你传给 compile()
的第三个参数。如果你要使用 'eval'
,就要用 ast.Expression()
。
你可以创建一个包含 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