在python中评估if的条件

use*_*433 3 python eval abstract-syntax-tree

我有一个 python 程序的 AST,想手动评估 if 语句的条件。

cond = node.test
b = eval(compile(cond,"<string>","eval"))
print b
Run Code Online (Sandbox Code Playgroud)

其中 node 是 If-Node,给我TypeError: expected Expression node, got Compare,即使 Compare 是根据 ast 的 python 文档中的语法的表达式。

有任何想法吗?

Mar*_*ers 5

你有一个ast.expr子类,不是一个ast.Expression顶级节点。

compile()只能接受一个mod对象,因此Module,Interactive或 之一Expression,取决于 的第三个参数compile()。对于'eval',使用ast.Expression()

您可以创建一个包含ast.Compare节点:

expr = ast.Expression(cond)
Run Code Online (Sandbox Code Playgroud)

因为抽象语法将其定义为:

Expression(expr body)
Run Code Online (Sandbox Code Playgroud)

这你可以编译:

compile(expr, '<file>', 'eval')
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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
Run Code Online (Sandbox Code Playgroud)