关于模块:为什么python需要包的__init__.py?

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

本问题已经有最佳答案,请猛点这里访问。

我知道python需要__ init __.py文件才能将目录识别为python包,这样我们就可以将子模块导入到我们的程序中。我可以看到类的相似性以及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包

有人能解释一下吗?


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

1
2
3
4
5
6
app
 - common
  - init.py
 - resources
 - string
 - src

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

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


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路径中,所以您可以在任何地方使用它。

1
2
3
4
5
6
7
8
School/    
   math/
      hw1.txt
      integrate.py
   MyPythonModule/
      __init__.py
      someClass.py
      someFunc.py

当您稍后使用python并搜索mypythonmodule时,python将打开School/

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


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