python 3.3+中__init__.py的用例

时间:2016-10-19 16:40:04

标签: python python-3.x module

既然__init__.pyno longer required才能将目录识别为包,那么最好是尽可能完全避免使用它们吗?或者在python 3.3 +中是否仍有__init__.py广泛接受的用例?

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

1 个答案:

答案 0 :(得分:3)

this answer中对此进行了非常好的讨论,您应该熟悉PEP 420以澄清和常规包之间的区别(使用{ {1}})和命名空间包(不要)。

我通过答案提供的是阅读,参考和意见的组合。没有声称自己是"规范"或" pythonic"这里。

  

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

相关

即可。以example作为用例,程序包作者希望将多个内容放入根程序包命名空间中,这样用户就不必关心其内部结构。

另一种情况是创建hierarchy个模块。那个参考(O' Reilly)实际上说:

  

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

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

  

在所有条件相同的情况下,如果您刚刚开始创建新软件包,请包含__init__.py个文件。

所以,对于你的第二个问题,

  

最好是尽可能完全避免__init__.py吗?

,除非您打算创建命名空间包而不是常规包,在这种情况下,不得使用{{ 1}}。

为什么你想要那个? O' Reilly引用具有最清晰的example我已经看到了为什么命名空间包很酷,它能够从独立的,独立维护的包中崩溃命名空间:

__init__.py

允许

__init__.py

所以任何人都可以使用自己的代码扩展命名空间。凉。