gpt4 book ai didi

python - 在自定义命名空间中调用 execfile() 会在 '__builtin__' 命名空间中执行代码

转载 作者:太空狗 更新时间:2023-10-30 02:35:45 26 4
gpt4 key购买 nike

当我调用 execfile 而不传递全局变量或局部变量参数时,它会在当前命名空间中创建对象,但如果我调用 execfile 并为全局变量(和/或局部变量)指定字典,它会在 __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'

谁能解释这种行为?谢谢

最佳答案

首先,__name__ 不是命名空间——它是对其所属模块名称的引用,即:somemod.py -> somemod.__name__ == 'somemod' 异常(exception)情况是,如果您从命令行将模块作为可执行文件运行,则 __name__ 为“__main__”。

在您的示例中,作为 main 运行的模块也被命名为 main,这是一个幸运的巧合。

Execfile 执行模块的内容而不将其作为模块导入。因此,__name__ 不会被设置,因为它不是一个模块——它只是一个已执行的代码序列。

关于python - 在自定义命名空间中调用 execfile() 会在 '__builtin__' 命名空间中执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/711066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com