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

25 python python-module python-internals

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

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

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

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

Mar*_*ers 25

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

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

通常,import语句被转换为调用__import__,默认情况下实现为调用PyImport_ImportModuleLevelObject.请参阅__import__()文档以了解参数的含义.在PyImport_ImportModuleLevelObject相对名称内被解析,因此您可以name根据需要在那里追逐变量.

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

  • 另外,`import`中的`as`子句不会改变`__name__` attibute. (2认同)