Python 的 eval() 和 globals()
我正在尝试使用 eval() 执行许多函数,并且我需要为它们创建某种运行环境。 文档中说您可以将全局变量作为第二个参数传递给 eval()。
但它似乎不适用于我的情况。 这是简化的示例(我尝试了两种方法,声明变量全局和使用 globals(),但两者都不起作用):
文件 script.py:
import test
global test_variable
test_variable = 'test_value'
g = globals()
g['test_variable'] = 'test_value'
eval('test.my_func()', g)
文件 test.py:
def my_func():
global test_variable
print repr(test_variable)
我得到:
NameError:未定义全局名称“test_variable”。
我应该如何将该 test_variable
传递到 my_func()
中? 假设我无法将它作为参数传递。
I'm trying to execute a number of functions using eval(), and I need to create some kind of environment for them to run. It is said in documentation that you can pass globals as a second parameter to eval().
But it seems to not work in my case. Here's the simpified example (I tried two approaches, declaring variable global and using globals(), and both do not work):
File script.py:
import test
global test_variable
test_variable = 'test_value'
g = globals()
g['test_variable'] = 'test_value'
eval('test.my_func()', g)
File test.py:
def my_func():
global test_variable
print repr(test_variable)
And I'm getting:
NameError: global name 'test_variable' is not defined.
What should I do to pass that test_variable
into my_func()
? Assuming I can't pass it as a parameter.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
test_variable 在 test.py 中应该是全局的。 您收到名称错误是因为您尝试声明尚不存在的全局变量。
因此,您的 my_test.py 文件应如下所示:
从命令提示符运行此文件:
一般来说,使用 eval() 和全局变量是不好的形式,因此请确保您知道自己在做什么。
test_variable should be global in test.py. You're getting a name error because you're trying to declare a variable global that doesn't yet exist.
So your my_test.py file should be like this:
And running this from the command prompt:
Generally it's bad form to use eval() and globals, so make sure you know what your doing.
如有错误,请Python专家指正。 我也在学习Python。 以下是我目前对为什么会抛出
NameError
异常的理解。在Python中,如果不指定模块名称,就无法创建可以跨模块访问的变量(即访问全局变量)模块
mod1
中的变量test
,当您在模块mod2
中时,需要使用mod1.test
)。 全局变量的范围几乎仅限于模块本身。因此,当您在
test.py
中有以下内容时:这里的
test_variable
指的是test.test_variable
(即test_variable
test
模块命名空间)。因此,在
script.py
中设置test_variable
会将变量放入__main__
命名空间中(__main__
因为这是顶部- 您提供给Python解释器执行的模块/脚本)。 因此,此test_variable
将位于不同的命名空间中,而不是位于所需的test
模块命名空间中。 因此,Python 会生成NameError
,因为在搜索test
模块全局命名空间和内置命名空间后找不到变量(由于本地函数命名空间被跳过)全局
声明)。因此,要使
eval
正常工作,您需要在script.py
的test
模块命名空间中设置test_variable
:有关 Python 作用域和命名空间的更多详细信息,请参阅:http: //docs.python.org/tutorial/classes.html#python-scopes-and-name-spaces
Please correct me Python experts if I am wrong. I am also learning Python. The following is my current understanding of why the
NameError
exception was thrown.In Python, you cannot create a variable that can be access across modules without specifying the module name (i.e. to access the global variable
test
in modulemod1
you need to usemod1.test
when you in modulemod2
). The scope of the global variable is pretty much limited to the module itself.Thus when you have following in
test.py
:The
test_variable
here refers totest.test_variable
(i.e.test_variable
in thetest
module namespace).So setting
test_variable
inscript.py
will put the variable in the__main__
namespace (__main__
because this is the top-level module/script you provided to the Python interpreter to execute). Thus, thistest_variable
will be in a different namespace and not in thetest
module namespace where it is required to be. Hence, Python generates aNameError
because it cannot find the variable after searching thetest
module global namespace and built-in namespace (local function namespace is skipped because of theglobal
statement).Therefore, for
eval
to work, you need to settest_variable
in thetest
module namespace inscript.py
:For more details about Python’s scope and namespaces see: http://docs.python.org/tutorial/classes.html#python-scopes-and-name-spaces