繁体   English   中英

__init__.py的用法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM