python : var's namespace code eval compiled ast code

标签 python namespaces eval abstract-syntax-tree python-unittest

使用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/

相关文章:

python - 如何将 Tkinter 按钮用于两种状态?

python - ruby 相当于 python izip_longest

python - 在 Django 中随机播种

使用命名空间找不到 PHP 类

Python - Zelle 书中使用了 eval(),这是错误的吗?

python - Anaconda vs. EPD Enthought vs. Python 的手动安装

python - 无法从 'HTMLParseError' 导入名称 'html.parser'

c# - 这是斯巴达,还是?

javascript - 从安全性 Angular 来说,在js代码中使用eval()与在chrome控制台中输入js代码有什么不同?

javascript - 获取与字符串值同名的变量的值