在浏览 python manual 的 6.4 包部分时我遇到了以下行:
The
__init__.py
files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path.
我知道 __init__.py
需要将目录标记为包含包,但我不明白 防止具有通用名称的目录...从无意中隐藏是什么意思有效模块...
。
有人可以解释为什么需要 __init__.py
吗?
最佳答案
假设您有一个项目,其中包含一个名为 math
的目录,其中包含一些数字数据。如果不需要 __init__.py
,那么当您执行 import math
时,它会尝试导入该目录而不是真正的 math
模块。但是由于您的目录只包含数据而不是实际的 Python 代码,因此导入会失败。因此,您的 math
目录会阻止您从标准库中导入真正的 math
模块,即使您的 math
目录不包含 Python 代码完全没有。
__init__.py
就像一个确认,目录说“是的,我真的是一个 Python 包,而不仅仅是一个充满文件的目录。导入我是有意义的。”任何不以这种方式“宣布”自己的目录都会被跳过,因为 Python 知道它们不能被导入。这很好,因为 Python 标准库的模块有很多通用名称(os、math、time、symbol、resource 等)。如果没有 __init__.py
要求,您将永远无法将这些名称中的任何一个用于 Python 路径上的任何目录——甚至不能存储与以下文件无关的数据或文件 python 。
string
实际上不是这种情况下的最佳示例。有一个名为 string
的模块,但现在它不是很有用,因为它的大部分功能都可以作为 str
类型的方法使用。但是,正如我提到的,还有许多其他模块具有通用名称。
关于python - 为什么 python 需要 __init__.py 将目录视为包含包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147990/