[英]usage of __init__.py
当我使用from myprojects.something import blabla
时,我使用__init__.py
运行检查。
今天我开始使用pyzmq
,我想看看幕后发生了什么。 所以我浏览了github中的代码,我发现(对我来说) __init__.py
一些奇怪的用法,我无法解释自己。
例如zmq/core/__init__.py
。 在zmq.core.__all__
中添加zmq.core.constants, zmq.core.error, zmq.core.message, etc.
的__all__
值是zmq.core.constants, zmq.core.error, zmq.core.message, etc.
?
在zmq/__init__.py
我最后看到了
__all__ = ['get_includes'] + core.__all__
其中get_includes
是一个函数,它基本上返回一个列表,其中包含模块目录和父目录中的utils目录。
那是什么意思? 这样做有什么__init.py__
?
__all__
适用于某人from module import *
,如此处所述 。
唯一的解决方案是让包作者提供包的显式索引。 import语句使用以下约定:如果包的
__init__.py
代码定义了名为__all__
的列表,则它将被视为遇到包import *时应导入的模块名称列表。 在发布新版本的软件包时,由软件包作者决定是否保持此列表的最新状态。 如果包装作者没有看到从包装中导入*的用途,他们也可能决定不支持它。 例如,文件sounds/effects/__init__.py
可能包含以下代码:
__all__ = ["echo", "surround", "reverse"]
这意味着
from sound.effects import *
将导入声音包的三个命名子模块。
__all__
一个用途是用于包构建器的工具,允许它们以适合它们的方式构造它们的包,同时使用户方便。 特别是在pyzmq的情况下,它允许您编写如下代码:
import zmq
print zmq.zmq_version()
而不是必须使用完整的虚线模块名称:
print zmq.core.version.zmq_version()
pyzmq的包设计者使用__all__
将命名空间元素从嵌套模块提升到其命名空间的顶层,这样用户就不会被包的结构所困扰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.