使用python3.4并测试ast解析。这是测试代码。
import ast
import unittest
class TestAST(unittest.TestCase):
def test_ast(self):
#compileobj = compile(ast.parse("x=42"), '<input>', mode="exec")
#compile(ast.parse("x=42"), '<input>', mode="exec")
eval(compile(ast.parse("x=42"), '<input>', mode="exec"))
self.assertTrue(x == 42)
pass
if __name__ == '__main__':
unittest.main()
python test.py 我收到这样的错误:
Traceback (most recent call last):
File "qocean\test\test_ast.py", line 13, in test_ast
self.assertTrue(x == 42)
NameError: name 'x' is not defined
在 ipython 中对其进行评估时:x 可以如下所示:
In [3]: eval(compile(ast.parse("x=42"), '<input>', mode="exec"))
In [4]: x
Out[4]: 42
所以问题是,虽然我不能使用 var "x",因为源代码和 ipython eval environemt 中的 eval 代码是相同的。有什么区别?
############################################## #
更新:似乎是与unittest模块有关的东西,更改main()中的测试代码,它会成功。
if __name__ == '__main__':
eval(compile(ast.parse("x=42"), '<input>', mode="exec"))
print (x)
运行后。它显示 42 。
更详细一点,在func中调用这个也失败
def test_eval():
eval(compile(ast.parse("y=42"), '<input>', mode="exec"))
print ("y is ", y)
if __name__ == '__main__':
#unittest.main()
test_eval()
最佳答案
在 Python 3 中,您无法动态创建新的本地名称。这些是在函数编译为字节码时嵌入的。相反,您需要将字典传递给 exec
以便在该语句中用作本地变量。
def test_ast(self):
localvars = {}
eval(compile(ast.parse("x=42"), '<input>', mode="exec"), localvars)
self.assertTrue(localvars["x"] == 42)
关于 python : var's namespace code eval compiled ast code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23892260/