【发布时间】:2010-10-17 04:47:24
【问题描述】:
当我在不传递 globals 或 locals 参数的情况下调用 execfile 时,它会在当前命名空间中创建对象,但如果我调用 execfile 并为 globals(和/或 locals)指定一个 dict,它会在 __builtin__ 命名空间中创建对象。
举个例子:
# exec.py
def myfunc():
print 'myfunc created in %s namespace' % __name__
exec.py 是从 main.py 执行的文件,如下所示。
# main.py
print 'execfile in global namespace:'
execfile('exec.py')
myfunc()
print
print 'execfile in custom namespace:'
d = {}
execfile('exec.py', d)
d['myfunc']()
当我从命令行运行 main.py 时,我得到以下输出。
execfile in global namespace:
myfunc created in __main__ namespace
execfile in custom namespace:
myfunc created in __builtin__ namespace
为什么在第二种情况下它在__builtin__命名空间中运行?
此外,如果我尝试从 __builtins__ 运行 myfunc,我会收到 AttributeError。 (这是我希望发生的事情,但是为什么__name__ 设置为__builtin__?)
>>> __builtins__.myfunc()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'myfunc'
谁能解释这种行为? 谢谢
【问题讨论】:
标签: python namespaces