我知道the standard example:如果你直接执行一个模块,那么它的__name__
全局变量被定义为"__main__"
。但是,在文档中没有任何地方可以找到在一般情况下如何定义__name__
的精确描述。 module documentation说......
在模块中,模块的名称(作为字符串)可用作全局变量
__name__
的值。
......但“模块名称”是什么意思?它只是模块的名称(删除了.py
的文件名),还是包含完全限定的包名?
如何确定Python模块中__name__
变量的值?对于奖励积分,请准确指出此操作在Python源代码中的位置。
答案 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)