【问题标题】:What is the reason python needs __init__.py for packages? [duplicate]python 需要 __init__.py 包的原因是什么? [复制]
【发布时间】:2015-07-13 03:17:27
【问题描述】:

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

但是,在 python 文档中,这一行让我感到困惑,

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

在这里看到https://docs.python.org/2/tutorial/modules.html#packages

有人可以澄清一下吗?

【问题讨论】:

  • 您专门链接到 Python 2,但您可能对不能包含 __init__.py 的 Python 3 命名空间包感兴趣。见python.org/dev/peps/pep-0420

标签: 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 知道它应该继续运行,而不是将该目录视为一个包。

      【讨论】:

      • 谢谢,现在这很有意义。
      猜你喜欢
      • 1970-01-01
      • 2016-09-05
      • 2013-05-08
      • 2020-05-07
      • 2015-05-26
      • 2015-09-28
      • 2010-12-04
      • 2021-06-08
      相关资源
      最近更新 更多