【发布时间】:2014-07-12 10:53:49
【问题描述】:
我正在尝试在 project 中使用 Python 的 exec 来执行嵌入的 Python 代码。
我遇到的问题是,在exec 语句中的模块级别 创建的变量无法从同一模块中定义的函数中访问。 p>
假设您有以下 Python 程序:
x = 5
def foo():
print x
foo()
如果你把上面四行放在一个文件里运行,就没有问题了。
但是,如果您尝试在 exec 语句中运行同一段代码,它将不起作用。
这是我们之前的程序,在 exec 语句中:
import __builtin__
global_env = {'__builtins__': __builtin__}
local_env = dict()
exec """
x = 5
def foo():
print x
foo()
""" in global_env, local_env
在执行时,它会产生以下错误,而不是正常工作:
Traceback (most recent call last):
File "lab.py", line 94, in <module>
""" in global_env, local_env
File "<string>", line 5, in <module>
File "<string>", line 4, in foo
NameError: global name 'x' is not defined
我认为模块级变量是全局存储的,但似乎至少在exec 中,它们不是。
例如,在前面的示例中,如果您将对 foo() 的调用替换为:
print global_env
print local_env
你得到:
{'__builtins__': <module '__builtin__' (built-in)>}
{'x': 5, 'foo': <function foo at 0x102c12938>}
因此,在模块级别定义的任何内容(包括x)都存储在locals() 中。
但是除了模块级别(exec 语句的)之外,不可能从任何地方访问x。特别是,正如我们在上面看到的,x 的本地范围对于在同一 exec 语句中定义的函数是不可见的。
解决方法
我找到了两种解决此问题的方法,并让 x 再次可访问。
第一个是在函数中使用global关键字:
exec """
x = 5
def foo():
global x
print x
foo()
""" in global_env, local_env
第二个是在exec 中为globals() 和locals() 使用相同的字典:
exec """
x = 5
def foo():
print x
foo()
""" in global_env
但是,这些只是未解决原始问题的半修复/解决方法。
所以我的问题是:为什么 exec 中的模块级变量存储在本地,为什么除了模块级之外的任何地方都无法访问?
一些密切相关的 StackOverflow 帖子:
【问题讨论】:
-
您可能会充其量猜测“为什么”的问题。我从来没有见过 Guido 回答过这样的问题,即为什么某些东西在 Python 中是这样的,而且我认为其他核心开发人员通常也不会回答这些问题。
标签: python