31

我知道标准示例:如果您直接执行一个模块,那么它的__name__全局变量定义为"__main__". 但是,我无法在文档中找到__name__在一般情况下如何定义的精确描述。模块文档说...

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

...但是“模块的名称”是什么意思?它只是模块的名称(已.py删除的文件名),还是包含完全限定的包名称?

__name__Python模块中变量的值是如何确定的?对于加分,请准确指出在 Python 源代码中执行此操作的位置。

4

2 回答 2

31

它设置为导入的模块的绝对名称。如果您将其导入为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对象构造函数中设置。

于 2013-04-08T15:54:59.220 回答
2

__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'

来自类型模块的行:

import sys
ModuleType = type(sys)
于 2013-04-08T15:53:57.160 回答