为了组织好模块,会将多个模块分为包。Python 处理包也是至关方便的。简单来讲,包就是文件夹,但该文件夹下必须存在 __init__.py 文件。函数
常见的包结构以下:spa
最简单的状况下,只须要一个空的 __init__.py 文件便可。固然它也能够执行包的初始化代码,或者定义稍后介绍的 __all__ 变量。固然包底下也能包含包,这和文件夹同样,仍是比较好理解的。设计
包的导入仍使用 import 、 from ... import 语句,使用 “圆点模块名” 的结构化模块命名空间。 下面来看一个包的例子来了解下具体的运做。(官方文档中的例子)code
假设你如今想要设计一个模块集(一个“包”)来统一处理声音文件和声音数据。存在几种不一样的声音格式(一般由它们的扩展名来标识,例如: .wav, .aiff, .au )因而,为了在不一样类型的文件格式之间转换,你须要维护一个不断增加的包集合。可能你还想要对声音数据作不少不一样的操做(例如混音,添加回声,应用平衡 功能,建立一我的造效果)因此你要加入一个无限流模块来执行这些操做。你的包可能会是这个样子(经过分级的文件体系来进行分组):orm
用户能够每次只导入包里的特定模块,例如: import sound.efforts.echo 这样就导入了 sound.effects.echo 子模块。它必须经过完整的名称来引用:blog
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
索引
导入包时有一个能够选择的方式: from sound.effects import echo 这样就加载了 echo 子模块,而且使得它在没有包前缀的状况下也可使用,因此它能够以下方式调用:文档
echo.echofilter(input, output, delay=0.7, atten=4) input
还有另外一种变体用于直接导入函数或变量: from sound.effects.echo import echofilter 这样就又一次加载了 echo 字模块,但这样就能够直接调用它的 echofilter() 函数:it
echo.echofilter(input, output, delay=0.7, atten=4)
须要注意的是 from package import item 方式导入包时,这个子项(item)既能够是子包也能够是其余命名,如函数、类、变量等。若无,会引起ImportError异常。
而用相似 import item.subitem.subsubitem 这样的语法时,这些子项必须是包,最后的子项能够是包或模块,但不能是类、函数、变量等。
从 * 导入包
import * 这样的语句理论上是但愿文件系统找出包中全部的子模块,而后导入它们。这可能会花长时间,并出现边界效应等。Python 解决方案是提供一个明确的包索引。
这个索引由 __init__.py 定义 __all__ 变量,该变量为一列表,如上例 sound/effects 下的 __init__.py 中,可定义 __all__ = ["echo","surround","reverse"]
这意味着, from sound.effects import * 会从对应的包中导入以上三个子模块; 尽管提供 import * 的方法,仍不建议在生产代码中使用这种写法。
包内引用
若是是子包内的引用,能够按相对位置引入子模块 以 echo 模块为例,能够引用以下:
1 from . import reverse # 同级目录 导入 reverse 2 from .. import frormats # 上级目录 导入 frormats 3 from ..filters import equalizer # 上级目录的filters模块下 导入 equalizer
多重目录包搜索
包支持一个更为特殊的特性, __path__ 在包的 __init__.py 文件代码执行前,该变量初始化一个目录名列表。做用于子包和模块的搜索功能。 该功能能够用于扩展包中的模块集,不过不经常使用。