__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
对象构造函数中设置。
import
语句中的as
子句不会改变__name__
属性。 - andy__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)
exec
是一个函数:`exec("source_of_module = __name__", m.__dict__)`
- Mihai Capotă