python中if的求值条件

python中if的求值条件,python,eval,abstract-syntax-tree,Python,Eval,Abstract Syntax Tree,我有一个python程序的AST,希望手动计算if语句的条件 cond = node.test b = eval(compile(cond,"<string>","eval")) print b cond=node.test b=eval(编译(cond,“,”eval“) 打印b 其中node是If节点,给我TypeError:expected Expression节点,got Compare,即使Compare是一个符合ast的python文档语法的表达式 有什么想法吗?您有

我有一个python程序的AST,希望手动计算if语句的条件

cond = node.test
b = eval(compile(cond,"<string>","eval"))
print b
cond=node.test
b=eval(编译(cond,“,”eval“)
打印b
其中node是If节点,给我TypeError:expected Expression节点,got Compare,即使Compare是一个符合ast的python文档语法的表达式


有什么想法吗?

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

compile()
只能接受
mod
对象,因此
模块
交互式
表达式
中的一个,具体取决于
compile()
的第三个参数。对于
'eval'
,请使用
ast.Expression()

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

expr = ast.Expression(cond)
因为它被定义为:

Expression(expr body)
您可以编译:

compile(expr, '<file>', 'eval')
compile(expr','eval')
演示:

导入ast >>>code=“如果foo=='bar':通过” >>>tree=ast.parse(代码,,'exec') >>>cond=tree.body[0]。测试 >>>expr=ast.表达式(cond) >>>编译(expr,,“eval”) <0x1067f6230处的编码对象模块,文件“file”,第1行> >>>foo='baz' >>>eval(编译(expr,,'eval')) 假的 >>>foo='bar' >>>eval(编译(expr,,'eval')) 真的
哦,我没看到有什么不同。我能把cond传递给ast.Expression的构造函数并使用这个对象吗?@user1839433:啊,我错了
Expression()
接受一个
expr
字段,而不是它们的列表。
>>> 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