Python 的 eval() 和 globals()

发布于 2024-07-16 08:58:59 字数 655 浏览 4 评论 0原文

我正在尝试使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北方的韩爷 2024-07-23 08:58:59

test_variable 在 test.py 中应该是全局的。 您收到名称错误是因为您尝试声明尚不存在的全局变量。

因此,您的 my_test.py 文件应如下所示:

test_variable = None

def my_func():
    print test_variable

从命令提示符运行此文件:

>>> import my_test
>>> eval('my_test.my_func()')
None
>>> my_test.test_variable = 'hello'
>>> my_test.test_variable
'hello'
>>> eval('my_test.my_func()')
hello

一般来说,使用 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:

test_variable = None

def my_func():
    print test_variable

And running this from the command prompt:

>>> import my_test
>>> eval('my_test.my_func()')
None
>>> my_test.test_variable = 'hello'
>>> my_test.test_variable
'hello'
>>> eval('my_test.my_func()')
hello

Generally it's bad form to use eval() and globals, so make sure you know what your doing.

小…楫夜泊 2024-07-23 08:58:59

如有错误,请Python专家指正。 我也在学习Python。 以下是我目前对为什么会抛出NameError异常的理解。

在Python中,如果不指定模块名称,就无法创建可以跨模块访问的变量(即访问全局变量)模块mod1中的变量test,当您在模块mod2中时,需要使用mod1.test)。 全局变量的范围几乎仅限于模块本身。

因此,当您在 test.py 中有以下内容时:

def my_func():
    global test_variable
    print repr(test_variable)

这里的 test_variable 指的是 test.test_variable (即 test_variable test 模块命名空间)。

因此,在 script.py 中设置 test_variable 会将变量放入 __main__ 命名空间中(__main__ 因为这是顶部- 您提供给Python解释器执行的模块/脚本)。 因此,此 test_variable 将位于不同的命名空间中,而不是位于所需的 test 模块命名空间中。 因此,Python 会生成 NameError,因为在搜索 test 模块全局命名空间和内置命名空间后找不到变量(由于 本地函数命名空间被跳过)全局声明)。

因此,要使 eval 正常工作,您需要在 script.pytest 模块命名空间中设置 test_variable

import test
test.test_variable = 'test_value'
eval('test.my_func()')

有关 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 module mod1 you need to use mod1.test when you in module mod2). The scope of the global variable is pretty much limited to the module itself.

Thus when you have following in test.py:

def my_func():
    global test_variable
    print repr(test_variable)

The test_variable here refers to test.test_variable (i.e. test_variable in the test module namespace).

So setting test_variable in script.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, this test_variable will be in a different namespace and not in the test module namespace where it is required to be. Hence, Python generates a NameError because it cannot find the variable after searching the test module global namespace and built-in namespace (local function namespace is skipped because of the global statement).

Therefore, for eval to work, you need to set test_variable in the test module namespace in script.py:

import test
test.test_variable = 'test_value'
eval('test.my_func()')

For more details about Python’s scope and namespaces see: http://docs.python.org/tutorial/classes.html#python-scopes-and-name-spaces

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文