【问题标题】:What is the reason python needs __init__.py for packages? [duplicate]python 需要 __init__.py 包的原因是什么? [复制]
【发布时间】:2015-07-13 03:17:27
【问题描述】:
【问题讨论】:
标签:
python
module
package
init
【解决方案1】:
文档对此非常清楚 - 您的项目结构可能如下所示:
app
- common
- init.py
- resources
- string
- src
如果 Python 将目录隐式视为包,“字符串”目录可能会与 Python 的内置字符串模块 (https://docs.python.org/2/library/string.html) 出现名称冲突。这意味着当调用import string 时,模块是模棱两可的。
__init__.py 还添加了一些功能:代码在初始化包时执行,因此可用于进行某种包设置。
【解决方案2】:
这样做是为了防止具有通用名称(例如字符串)的目录无意中隐藏模块搜索路径中稍后出现的有效模块。
假设您有一个为学校工作的目录,其中一些涉及 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/ 视为数学包;在你不知道为什么的情况下破坏代码。
【解决方案3】:
如果你有一个名为string 的目录不是一个包,在 Python 搜索模块和包的位置(例如当前工作目录),Python 不应该尝试在您执行import string 时导入它。 __init__.py 要求让 Python 知道它应该继续运行,而不是将该目录视为一个包。