python - 为什么 python 需要 __init__.py 将目录视为包含包?

标签 python

在浏览 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/

相关文章:

python - bool 索引与沿维度的索引数组不匹配

python - 获取函数的可变默认参数

python - 在 Matplotlib 中保持绘图窗口打开

python - Python中如何指定列的范围而不是一一输入?

python - 从当前位置的模块导入自定义类时出错

python - 如何确保 Celery 任务在 Pytest 中排队?

python - 从数据框中删除单词列表

python - 如何使用循环从 Pandas 数据框中获取值?

python - 阻止用户改变焦点(Tkinter)

python - 如何在 Tkinter 中创建 20x20 的图 block 网格,然后更改特定图 block 的颜色