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

Python模块中的_name__变量是如何定义的?,python,python-module,python-internals,Python,Python Module,Python Internals,我知道:如果您直接执行一个模块,那么它的\uuuu name\uuuu全局变量定义为“\uuuu main\uuuu”。然而,在文档中,我找不到关于一般情况下如何定义\uuu name\uuu的精确描述。报告说 在模块中,模块的名称(作为字符串)作为全局变量\uuuu name\uuuu的值可用 …但“模块名称”是什么意思?它只是模块的名称(删除了.py的文件名),还是还包括完全限定的包名 Python模块中\uuu name\uu变量的值是如何确定的?为了获得额外的分数,请准确地指出在Pyth

我知道:如果您直接执行一个模块,那么它的
\uuuu name\uuuu
全局变量定义为
“\uuuu main\uuuu”
。然而,在文档中,我找不到关于一般情况下如何定义
\uuu name\uuu
的精确描述。报告说

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

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


Python模块中
\uuu name\uu
变量的值是如何确定的?为了获得额外的分数,请准确地指出在Python源代码中执行此操作的位置。

变量
\uuu\uuu
是模块的一个属性,可以通过名称访问该属性

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)

它被设置为导入时模块的绝对名称。如果将其作为
foo.bar
导入,则
\uuuu name\uuuu
设置为
'foo.bar'

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

通常,
import
语句被转换为对
\uuuuuu import\uuuuu
的调用,这是默认情况。请参阅以了解这些论点的含义。内部的相对名称已解析,因此如果需要,您可以在其中查找
名称
变量


模块的其余部分处理实际导入,通过
PyImport\u AddModuleObject
创建实际名称空间对象并设置
name
键,但您可以将该
name
值追溯回
PyImport\u ImportModuleLevelObject
。通过创建一个模块对象,它的
\uuu name\uuuuuuuuuu
值是在中设置的。

此外,
import
中的
as
子类不会改变
\uuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性。我已经看到了这个问题的各种变化,但我很高兴有人将这个主题带入了更深入的领域,
exec
是一个函数:
exec(“模块的源代码=\uuuuuu名称\uuuuuuuuuuuuuuuuuuuuuuuuu”),m.\uuuuu dict\uuuuuuu)