Python模块中的__name__变量是如何定义的?

32
我知道 标准示例:如果直接执行模块,则其__name__全局变量被定义为"__main__"。然而,在文档中我找不到对于一般情况下如何定义__name__的精确描述。 模块文档说...

在模块内,模块的名称(作为字符串)可以作为全局变量__name__的值使用。

但是,“模块的名称”指的是什么?它只是模块的名称(去掉.py的文件名),还是包括完整限定的包名?
Python模块中__name__变量的值如何确定?为了加分,请精确指出Python源代码中执行此操作的位置。

1
我看到过这个问题的不同变体,但很高兴有人能够更深入地探讨这个主题。 - Nathan Basanese
2个回答

34

__name__是导入的模块的绝对名称。如果您将其导入为foo.bar,则__name__设置为'foo.bar'

名称在import.c模块中确定,但由于该模块处理各种不同类型的导入(包括zip导入、仅字节码导入和扩展模块),因此需要追踪多个代码路径。

通常,import语句被转换为对__import__的调用,该函数默认实现为调用PyImport_ImportModuleLevelObject。请参见 __import__()文档以了解参数的含义。在PyImport_ImportModuleLevelObject中解析相对名称,因此您可以在此处跟踪name变量。

模块的其余部分处理实际导入,PyImport_AddModuleObject创建实际的命名空间对象并设置name键,但您可以将该 name 值追溯到 PyImport_ImportModuleLevelObject 。通过创建模块对象,它的__name__值在moduleobject.c对象构造函数中设置。


3
此外,import语句中的as子句不会改变__name__属性。 - andy

3
__name__ 变量是模块的一个属性,可以通过名称访问。
import os
assert os.__name__ == 'os'

以下是一个示例自创建的模块,它勾勒了导入机制:

>>> import types
>>> m = types.ModuleType("name of module") # create new module with name
>>> exec "source_of_module = __name__" in m.__dict__ # execute source in module
>>> m.source_of_module
'name of module'

来自types模块的代码行:

import sys
ModuleType = type(sys)

1
请注意,在Python 3中,exec是一个函数:`exec("source_of_module = __name__", m.__dict__)` - Mihai Capotă

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接