在Python中评估if语句的条件

3

我有一个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也是一个表达式。

有什么想法吗?

1个回答

5
您拥有一个 ast.expr 子类,而不是顶层节点的 ast.Expression。
compile() 只能接受 mod 对象,因此取决于 compile() 的第三个参数,其中之一为 Module、Interactive 或 Expression。对于 '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

哦,我没看到有区别。我能否将cond传递给ast.Expression的构造函数,并使用这个对象? - user1839433
@user1839433:啊,我的错误;Expression()只接受一个expr字段,而不是它们的列表。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接