5.4.4. 导入相关的模块属性

导入机制会在加载期间会根据模块的规格说明填充每个模块对象的这些属性,并在加载器执行模块之前完成。

__name__

__name__ 属性必须被设为模块的完整限定名称。 此名称被用来在导入系统中唯一地标识模块。

__loader__

__loader__ 属性必须被设为导入系统在加载模块时使用的加载器对象。 这主要是用于内省,但也可用于额外的加载器专用功能,例如获取关联到加载器的数据。

__package__

模块的 __package__ 属性必须设定。 其取值必须为一个字符串,但可以与 __name__ 取相同的值。 当模块是包时,其 __package__ 值应该设为其 __name__ 值。 当模块不是包时,对于最高层级模块 __package__ 应该设为空字符串,对于子模块则应该设为其父包名。 更多详情可参阅 PEP 366

该属性取代 __name__ 被用来为主模块计算显式相对导入,相关定义见 PEP 366。 预期它与 __spec__.parent 具有相同的值。

在 3.6 版更改: __package__ 预期与 __spec__.parent 具有相同的值。

__spec__

__spec__ 属性必须设为在导入模块时要使用的模块规格说明。 对 __spec__ 的正确设定将同时作用于 解释器启动期间初始化的模块。 唯一的例外是 __main__,其中的 __spec__在某些情况下设为 None.

__package__ 未定义时, __spec__.parent 会被用作回退项。

3.4 新版功能.

在 3.6 版更改: 当 __package__ 未定义时,__spec__.parent 会被用作回退项。

__path__

如果模块为包(不论是正规包还是命名空间包),则必须设置模块对象的 __path__ 属性。 属性值必须为可迭代对象,但如果 __path__ 没有进一步的用处则可以为空。 如果 __path__ 不为空,则在迭代时它应该产生字符串。 有关 __path__ 语义的更多细节将在 下文 中给出。

不是包的模块不应该具有 __path__ 属性。

__file__

__cached__

__file__ 是可选项。 如果设置,此属性的值必须为字符串。 导入系统可以选择在其没有语法意义时不设置 __file__ (例如从数据库加载的模块)。

如果设置了 __file__,则也可以再设置 __cached__ 属性,后者取值为编译版本代码(例如字节码文件)所在的路径。 设置此属性不要求文件已存在;该路径可以简单地指向应该存放编译文件的位置 (参见 PEP 3147)。

当未设置 __file__ 时也可以设置 __cached__。 但是,那样的场景很不典型。 最终,加载器会使用 __file__ 和/或 __cached__。 因此如果一个加载器可以从缓存加载模块但是不能从文件加载,那种非典型场景就是适当的。