gpt4 book ai didi

python - python 3.3+ 中 __init__.py 的用例

转载 作者:太空狗 更新时间:2023-10-29 17:08:24 29 4
gpt4 key购买 nike

现在 __init__.pyno longer required使一个目录被识别为一个包,最好的做法是尽可能完全避免它们吗?或者 python 3.3+ 中的 __init__.py 是否仍然有广为接受的用例?

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

最佳答案

this answer 中对此有很好的讨论,你应该很熟悉 PEP 420阐明常规包(使用__init__.py)和命名空间包(不使用)之间的区别。

我提供的答案是阅读、引用和意见的结合。此处没有声明是“规范的”或“Python 的”。

Are [initialization] use cases still relevant with python 3.3+?

。带上你的example作为一个用例,包作者希望将一些东西带入根包命名空间,这样用户就不必关心其内部结构。

另一种情况是创建一个 hierarchy的模块。该引用文献 (O'Reilly) 实际上说:

The purpose of the __init__.py files is to include optional initialization code that runs as different levels of a package are encountered.

他们在那次讨论中确实考虑了 namespace 包,但继续:

All things being equal, include the __init__.py files if you’re just starting out with the creation of a new package.

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

is it best practice to avoid __init__.py entirely if possible?

,除非您打算创建一个命名空间包而不是常规包,在这种情况下您不得使用__init__.py.

为什么你想要那个? O'Reilly 引用文献最清晰 example我已经了解了为什么 namespace 包很酷,它能够从单独的、独立维护的包中折叠 namespace :

foo-package/
spam/
blah.py

bar-package/
spam/
grok.py

允许

>>> import sys
>>> sys.path.extend(['foo-package', 'bar-package'])
>>> import spam.blah
>>> import spam.grok
>>>

因此任何人都可以使用自己的代码扩展命名空间。很酷。

关于python - python 3.3+ 中 __init__.py 的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40137114/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com