__init__.py的用法

Pab*_*blo 6 python

我用它__init__.py来运行检查from myprojects.something import blabla.

今天我开始使用pyzmq,我想看看幕后发生了什么.所以我浏览了github中的代码,我发现(对我来说)__init__.py那里的一些奇怪的用法,我无法解释自己.

例如zmq/core/__init__.py.是什么在加点zmq.core.__all____all__中的价值zmq.core.constants, zmq.core.error, zmq.core.message, etc.

在最后zmq/__init__.py我看到了

__all__ = ['get_includes'] + core.__all__
Run Code Online (Sandbox Code Playgroud)

where get_includes是一个函数,它基本上返回一个列表,其中包含模块的目录和父目录中的utils目录.

那是什么意思?有什么__init.py__做的是实现?

Joh*_*Jr. 13

__all__是,当有人不用于from module import *作为记录在这里.

唯一的解决方案是让包作者提供包的显式索引.import语句使用以下约定:如果包的__init__.py代码定义了一个名为list的列表 __all__,则它将被视为遇到包import*时应导入的模块名称列表.在发布新版本的软件包时,由软件包作者决定是否保持此列表的最新状态.如果包装作者没有看到从包装中导入*的用途,他们也可能决定不支持它.例如,该文件sounds/effects/__init__.py可能包含以下代码:

__all__ = ["echo", "surround", "reverse"]
Run Code Online (Sandbox Code Playgroud)

这意味着from sound.effects import *将导入声音包的三个命名子模块.

一个用途__all__是用于包构建器的工具,以允许它们以适合它们的方式构造它们的包,同时使其便于用户.特别是在pyzmq的情况下,它允许您编写如下代码:

import zmq
print zmq.zmq_version()
Run Code Online (Sandbox Code Playgroud)

而不是必须使用完整的虚线模块名称:

print zmq.core.version.zmq_version()
Run Code Online (Sandbox Code Playgroud)

pyzmq的包设计者用于将__all__命名空间元素从嵌套模块升级到其命名空间的顶层,这样用户就不会受到包的结构的困扰.