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 文档中的语法的表达式。
有任何想法吗?
你有一个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)
| 归档时间: |
|
| 查看次数: |
1888 次 |
| 最近记录: |