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

时间:2015-05-03 19:14:47

标签: python module package init

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

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

  

这样做是为了防止具有通用名称的目录,例如   字符串,无意中隐藏了稍后出现的有效模块   模块搜索路径。

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

请有人澄清一下吗?

3 个答案:

答案 0 :(得分:5)

文档非常明确 - 您的项目结构可能如下所示:

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

  

这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上出现的有效模块。

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

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/视为包数学;在你不知道原因的情况下打破代码。