python基础教程:包的创建及导入

  • 时间:
  • 浏览:2
  • 来源:uu直播快3_UU快3直播平台

虽然许多模块被设计为在使用 import * 时只导出遵循许多模式的名称,但在生产代码中它仍然被认为是不好的做法。

假设你想为声音文件和声音数据的统一避免,设计有有一4个多模块集合(有有一4个多“包”)。有已经 存在许多不同的声音文件格式(通常由它们的扩展名来识别,这类:.wav, .aiff, .au),有已经 为了不同文件格式间的转换,你有已经 需用创建和维护有有一4个多不断增长的模块集合。 你有已经 还想对声音数据还做许多不同的避免(这类,混声,加上回声,使用均衡器功能,创造人工立体声效果), 有已经 为了实现那些避免,你将另外写有有一4个多无穷尽的模块流。这遇见你的包的有已经 形状(以分层文件系统的形式表示):

你还不能使用import一段话的 from module import name 形式编写相对导入。那些导入使用前导点来指示相对导入中涉及的当前包和父包。这类,从 surround 模块,要我使用:

在你你这名例子中, echo 和 surround 模块是在执行 from...import 一段话时导入到当前命名空间中的,有已经 它们定义在 sound.effects 包中。(这在定义了 all 时都不 效。)

[1] 实际上,函数定义也是“被执行”的“一段话”;模块级函数定义的执行在模块的全局符号表中输入该函数名。

请记住,使用 from Package import specific_submodule 这么 任何难题图片!实际上,除非导入模块需用使用来自不同包的同名子模块,有已经 这是推荐的表示法。

当用户写 from sound.effects import * 会存在那些?理想状态下,亲戚让我门歌词 希望这会以一种方法 传递给文件系统,找到包中存在那些子模块,并将它们完正导入。这有已经 需用很长时间,导入子模块有已经 会产生何必 要的副作用,你你这名副作用必须在显式导入子模块时才会存在。

另一种形式是直接导入所需的函数或变量:

相反,当使用 import item.subitem.subsubitem 原本的语法时,除了最后一项之外的每一项都需用是有有一4个多包;最后一项可否是模块或python包,但必须是前一项中定义的类或函数或变量。

包的用户不能从包中导入单个模块,这类:

脚注

子包参考

从包中导入 *

这会加载子模块 sound.effects.echo 。但引用它需用用使用它的全名。

虽然通常不需用此功能,但它可用于扩展任务管理器包中的模块集。

导入子模块的另一种方法 是

当导入你你这名包时,Python搜索 sys.path 里的目录,查找包的子目录。

有已经 这么 定义 __all__,from sound.effects import * 一段话 不 会从包 sound.effects 中导入所有子模块到当前命名空间;它只确保导入了包 sound.effects (有已经 运行任何在 __init__.py 中的初始化代码),有已经 导入包中定义的任何名称。这包括 __init__.py` 定义的任何名称(以及显式加载的子模块)。它还包括由以前 的 import 一段话显式加载的包的任何子模块。思考下面的代码:

多个目录中的包

包支持原本特殊属性, path 。它被初始化为有有一4个多列表,其饱含有在执行该文件中的代码以前 保存包的文件 __init__.py 的目录的名称。你你这名变量不能修改;原本做会影响将来对包饱含有的模块和子包的搜索。

The init__.py files are required to make Python treat directories containing the file as packages. This prevents directories with a common name, such as string, unintentionally hiding valid modules that occur later on the module search path. In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all variable, described later.

这原应着 from sound.effects import * 将导入 sound 包的有有一4个多命名子模块。

唯一的避免方案是让包作者提供有有一4个多包的显式索引。import 一段话使用下面的规范:有已经 有有一4个多包的 init__.py 代码定义了有有一4个多名为 __all 的列表,它会被视为在遇到 from package import 时应该导入的模块名列表。在发布该包的新版本时,包作者不能决定否是是让此列表保持更新。包作者有已经 认为从让我门歌词 的包中导入 的操作这么 必要被使用,也不能决定不支持此列表。这类,文件 sound/effects/__init__.py 不能饱含以下代码:

包是一种通过用“带点号的模块名”来构造 Python 模块命名空间的方法 。 这类,模块名 A.B 表示 A 包中名为 B 的子模块。正如模块的使用使得不同模块的作者何必 担心彼此的全局变量名称一样,使用加点的模块名不能使得 NumPy 或 Pillow 等多模块软件包的作者何必 担心彼此的模块名称一样。

这也会加载子模块 echo ,并使其在这么 包前缀的状态下可用,有已经 不能按如下方法 使用:

请注意,相对导入是基于当前模块的名称进行导入的。有已经 主模块的名称老会 "__main__" ,有已经 用作Python应用任务管理器主模块的模块需用始终使用绝对导入。

同样,这也会加载子模块 echo,但这会使其函数 echofilter() 直接可用:

请注意,当使用 from package import item 时,item可否是包的子模块(或子包),也可否是包中定义的许多名称,如函数,类或变量。 import 一段话首先测试否是是在包中定义了item;有已经 这么 ,它假定它是有有一4个多模块并尝试加载它。有已经 找必须它,则引发 ImportError 异常。

当包被构造成子包时(与示例中的 sound 包一样),要我使用绝对导入来引用兄弟包的子模块。这类,有已经 模块 sound.filters.vocoder 需用在 sound.effects 包中使用 echo 模块,它不能使用 from sound.effects import echo 。