python 中的 __name__ 与 __package__

FI-*_*nfo -1 python python-3.x

__package__如果我的理解是正确的,则和变量之间的区别__name__是:

  • 对于文件来说,它们是相同的__init__.py
  • 对于任何其他文件,__name__将是完整路径,并将__package__是其目录。

它是否正确?如果是这样,为什么 python 有必要在作用域中添加一个额外的变量,以便__package__有人也可以从中获取它__name__

例如,对于一个models.py文件:

  • __name__==> apps.main.models
  • __module__==> 应用程序.main

use*_*ica 7

__package____name__文件、路径或目录无关。如果您需要有关文件、路径和目录的信息,可以通过以下方式给出__file__,它存储 Python 查找模块文件的相对或绝对文件系统路径。

如导入系统文档中所述,__name__存储模块的完全限定名称,并__package__用于支持主模块的相对导入。无论哪个模块作为 Python 的入口点运行,都会获得 name '__main__',因此__name__对于那里的相对导入来说是无用的。__package__说明在这种情况下基于哪个包进行相对导入。

例如,

  • random.__package__'',不是目录,因为random是(非包)顶级模块,并且内部有相对导入random不允许在内部进行相对导入。
  • 跨多个目录存在的隐式名称空间包仍然具有单个值 和__package____name__因为__package____name__与文件系统无关。它没有__file__,因为文件系统中没有用于隐式命名空间包的文件。
  • 如果你有一个目录foo和文件and __init__.py,并且你从上面的目录运行,那么将作为一个模块运行和。bar.pyfoopython -m foo.barfoofoo/bar__name__ == '__main__'__package__ == 'foo'