max*_*max 15 python module python-3.x
现在__init__.py
是不再需要做出公认的软件包的目录,这是为了避免他们完全可能的话最好的做法?或者__init__.py
在python 3.3+中仍有广为接受的用例?
根据我的理解,__init__.py
非常常用于在模块导入时运行代码(例如,封装包的内部文件结构或执行一些初始化步骤).这些用例是否仍与python 3.3+相关?
在此答案中对此进行了很好的讨论,您可能应该熟悉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)
因此,任何人都可以使用自己的代码扩展名称空间。凉。