python 3.3+中__init__.py的用例

max*_*max 15 python module python-3.x

现在__init__.py不再需要做出公认的软件包的目录,这是为了避免他们完全可能的话最好的做法?或者__init__.py在python 3.3+中仍有广为接受的用例?

根据我的理解,__init__.py非常常用于在模块导入时运行代码(例如,封装包的内部文件结构或执行一些初始化步骤).这些用例是否仍与python 3.3+相关?

Chr*_*ris 5

此答案中对此进行了很好的讨论,您可能应该熟悉PEP 420才能弄清楚常规包(使用__init__.py)和名称空间包(不要)之间的区别。

我提供的答案是阅读,参考和意见的结合。这里没有声称是“规范”或“ pythonic”的。

[初始化]用例是否仍与python 3.3+相关?

是的。以您的示例为用例,其中包作者希望将一些内容带入根包名称空间,以便用户不必担心其内部结构。

另一种情况是创建模块层次结构。该参考文献(O'Reilly)实际上说:

这些__init__.py文件的目的是包括可选的初始化代码,该代码在遇到不同级别的软件包时运行。

他们确实在该讨论中考虑了名称空间包,但继续:

所有事情都是平等的,__init__.py如果您只是从创建新程序包开始,请包括文件。

所以,对于第二个问题,

最好的做法__init__.py是在可能的情况下完全避免?

不可以,除非您的意图是创建名称空间包而不是常规包,在这种情况下,您不能使用__init__.py

你为什么要那样?O'Reilly参考文献中有一个最清晰的示例,说明了为什么命名空间包很酷,它能够折叠来自独立维护的单独软件包的命名空间:

foo-package/
    spam/
        blah.py

bar-package/
    spam/
        grok.py
Run Code Online (Sandbox Code Playgroud)

这使得

>>> import sys
>>> sys.path.extend(['foo-package', 'bar-package'])
>>> import spam.blah
>>> import spam.grok
>>>
Run Code Online (Sandbox Code Playgroud)

因此,任何人都可以使用自己的代码扩展名称空间。凉。