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

时间:2013-04-08 15:47:30

标签: python python-module python-internals

我知道the standard example:如果你直接执行一个模块,那么它的__name__全局变量被定义为"__main__"。但是,在文档中没有任何地方可以找到在一般情况下如何定义__name__的精确描述。 module documentation说......

  

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

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

如何确定Python模块中__name__变量的值?对于奖励积分,请准确指出此操作在Python源代码中的位置。

2 个答案:

答案 0 :(得分:22)

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

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

通常情况下,import语句会转换为对__import__的调用,默认情况下为implemented as a call to PyImport_ImportModuleLevelObject。请参阅__import__() documentation以了解参数的含义。已解析PyImport_ImportModuleLevelObject个相对名称,因此您可以根据需要追踪name个变量。

模块的其余部分处理实际导入,PyImport_AddModuleObject创建实际的命名空间对象并设置name键,但您可以将name值追溯回{{1 }}。通过创建模块对象,moduleobject.c object constructor中设置了PyImport_ImportModuleLevelObject值。

答案 1 :(得分: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)