python 需要 __init__.py 的原因是什么?

What is the reason python needs __init__.py for packages?

我知道 python 需要 __ init __.py 文件才能将目录识别为 python 包,这样我们就可以将子模块导入 program.I可以看到与 类 的相似之处,以及如何使用 init 立即执行必要的代码。

然而,在 python 文档中,这一行让我感到困惑,

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.

如此处所示https://docs.python.org/2/tutorial/modules.html#packages

有人可以澄清一下吗?

文档对此非常清楚 - 您的项目结构可能如下所示:

app
 - common
  - init.py
 - resources
 - string
 - src

如果 Python 隐式地将目录视为包,"string" 目录可能会与 Python 的内置字符串模块 (https://docs.python.org/2/library/string.html) 出现名称冲突.这意味着调用 import string 时,模块是有歧义的。

__init__.py 还添加了一些功能:初始化包时执行的代码因此可用于进行某种包设置。

如果您有一个名为 string 的目录 不是 包,在 Python 搜索模块和包的位置(例如当前工作目录),Python 不应在您执行 import string 时尝试导入它。 __init__.py 要求让 Python 知道它应该继续运行而不是将该目录视为一个包。

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.

假设您有一个在学校工作的目录,其中一些涉及 python。你有一个数学目录,你称之为数学。您还编写了一个 python 模块,因此顶级目录 "school" 已添加到 python 路径中,因此您可以在任何地方使用它

School/    
   math/
      hw1.txt
      integrate.py
   MyPythonModule/
      __init__.py
      someClass.py
      someFunc.py

以后使用python搜索MyPythonModule时,python会打开School/

然后它看到 math/MyPythonModule/ 如果你在你的 python 程序中使用数学,并且没有办法区分模块 ../lib/site-packages/math/ 和非模块 ../School/math/ 那么 python 将把你的文件 ../School/math/ 作为数学包;在你不知道为什么的情况下破解代码。