评估Python中if的条件

3 投票
1 回答
2326 浏览
提问于 2025-04-18 14:27

我有一个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 对象,所以它可以是 ModuleInteractiveExpression,这取决于你传给 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

撰写回答