既然__init__.py
是no longer required才能将目录识别为包,那么最好是尽可能完全避免使用它们吗?或者在python 3.3 +中是否仍有__init__.py
广泛接受的用例?
据我所知,__init__.py
非常常用于在模块导入时运行代码(for example以封装包的内部文件结构或执行一些初始化步骤)。这些用例是否仍然与python 3.3 +相关?
答案 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
所以任何人都可以使用自己的代码扩展命名空间。凉。