Python3.2官方文档教程--包

2024-03-02 20:48
文章标签 文档 教程 官方 python3.2

本文主要是介绍Python3.2官方文档教程--包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4.4 

包是一种通过“点模块名称”来创建模块命名空间的一种方法。例如,模块A.B表示在A的包下设计了一个子包B。就像模块的应用保存不同模块的作者,这些不同的模块需要考虑相互的全局变量名称。但是点模块名称让多个模块包的作者无需担心彼此的模块名称(冲突),就像Numpypython图像库。

 

假设你为了统一操作音频文件和音频数据,你可以定义一个多模块(包)的集合。在里面可能有不同音频文件的格式(通常用它们的扩展名来区别,例如.wav, .aiff, .au)因此你需要创建和维护很多的模块结合来实现不同文件格式之间的转换。也有可能你针对不同的文件格式有不同的操作(例如混音,添加回声,应用均衡器,创建人造立体声等等)。因此,为了进行这些操作你还需要另外编写一个永远也玩不成的模块。这里是你的包的一种可能的结构。

sound/ Top-level package 最顶层文件

__init__.py Initialize the sound package  初始化音频包

formats/ Subpackage for file format conversions 文件格式转换的子包

__init__.py

wavread.py

wavwrite.py

aiffread.py

aiffwrite.py

6.4. Packages 43

Python Tutorial, Release 3.2.3

auread.py

auwrite.py

...

effects/ Subpackage for sound effects  声音效果的子包 

__init__.py

echo.py

surround.py

reverse.py

...

filters/ Subpackage for filters 过滤器的子包

__init__.py

equalizer.py

vocoder.py

karaoke.py

...

当导入包后,python会通过sys.path的目录寻找包的子路径。

_init_.py文件将被要求让python认为目录中包含包。这是为了避免一个含有烂俗名字的目录无意中隐藏了稍后在模块搜索路径中出现的有限模块,比如string,最简单的情况下,只需要一个_init_.py文件即可。当然它为包执行初始化代码或者设置_all_变量。

用户每次只能从包中特定的导入模块。例如:

import sound.effects.echo

这种方法加载子模块sound.effects.echo. 必须用全名来引用。 

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)

另一种直接导入期望的方法和变量方法:

from sound.effects.echo import echofilter

同时这种方法加载了子模块echo,但是这种方法可以直接调用函数echofilter();

echofilter(input, output, delay=0.7, atten=4)

注意使用from package impport item这种方法时, the item既可是一个子模块或者是在包中定义的其他名称,像函数,类,或者变量。Import语句首先就会检测是否定义在包中。如果没有,它就会假设是个模块然后去加载。如果没有找到,就会报ImportError异常。

相反地,当用表达式import item.subitem.subsubitem,除了最后一个子项其他都是包。最后一个可以使一个模块或者包,但不允许是在定义在模块中的类或者函数或者变量。

6.4.1 从包中导入* 

当用户写from sound.effects import * 会发生什么? 理论上,他预期以某种方式友好地对待文件系统,寻找在包下的所有子模块,并且把它们都导入进来。它可能会花费更多的时间,导入子模块可能不希望出现的负面影响,这种负面影响仅仅在子模块被明确导入时候才会出现的。

对包作者而来,唯一的解决办法就是提供了一个关于包的准确索引。 Import语句会用如下的转换。如果一个包的_init_.py代码定义了一个名为_all_的列表,当使用form package import * 时它被当做应该被导入的模块名称的列表。 当发布包的一个新版本时,应该由 包作者负责这个列表时最新的。如果包作者在包中没有发现导入的用法。那么他们可以决定不去做这些。例如:

Sound/effects/_init_.py文件有如下代码: 

__all__ = ["echo", "surround", "reverse"]

这将意外着from sound.effects. Import * 将会导入在sound包下三个名为显示的子模块。

如果_all_没有定义, 语句form sound.effects import * 不会从包sound.effects导入所有子包到当前的命名空间。它仅仅确保包sound.effects 已经导入。然后导入包中定义的任何名称。 

这会引入_init_.py文件中定义的所有名称(及明确加载的模块)。它同样会引入通过之前导入语句明确加载额的包中的所有模块,思考如下代码: 

import sound.effects.echo

import sound.effects.surround

from sound.effects import*

在这个例子中,echosurround模块也会导入到当前命名空间下,因为当from...import执行时他们也定义在sound.effects包中。(这也可以当_all定义时实现)

注意: 通常从包或者模块中导入的习惯是不被推荐的,因为他经常会让代码难以阅读,不过,在交互会话中使用它来减少输入是不会有问题的,并且有些模块被设计只能通过特性方法导入。

记住: from package import specific_submodule 永远那是不会错的。事实上,这是被推荐使用的方法,除非在不同包中导入的模块使用了相同的名字。 

4.4.2 包内引用

当包设计成好几个子包时(就像在例子中的sound包),你可用绝对导入来指定到子模块或者相应的包。例如,如果模块sound.filters.vocoder 需要用在sound.effects 包中echo模块,它可用from sound.effects import echo. 

你也可以写用from module import name 形式导入语句写相关导入。这些导入用.. 来描述涉及到相关导入的当前路径和父包。例如,从surrond模块导入:

from . import echo

from .. import formats

from ..filters import equalizer

注意:相对导入是以当前模块名称为基础的,因为主模块的名称总是_main_,所以以python程序中打算用作主模块的模块必须使用绝对导入。 

4.4.3 跨目录的包

包支持一个特殊熟悉,_path_。这会在那个文件执行之前,初始化为一个包含包中_init_路径下的名称列表。这个变量可以修改用来影响对包中包含的子包和模块的搜索。

  尽管这个特性并不常用,但它可以用来扩展一个包中的模块集合。

这篇关于Python3.2官方文档教程--包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767381

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

SpringBoot集成iText快速生成PDF教程

《SpringBoot集成iText快速生成PDF教程》本文介绍了如何在SpringBoot项目中集成iText9.4.0生成PDF文档,包括新特性的介绍、环境准备、Service层实现、Contro... 目录SpringBoot集成iText 9.4.0生成PDF一、iText 9新特性与架构变革二、环

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

前端Visual Studio Code安装配置教程之下载、汉化、常用组件及基本操作

《前端VisualStudioCode安装配置教程之下载、汉化、常用组件及基本操作》VisualStudioCode是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,... 目录一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2

JavaScript装饰器从基础到实战教程

《JavaScript装饰器从基础到实战教程》装饰器是js中一种声明式语法特性,用于在不修改原始代码的情况下,动态扩展类、方法、属性或参数的行为,本文将从基础概念入手,逐步讲解装饰器的类型、用法、进阶... 目录一、装饰器基础概念1.1 什么是装饰器?1.2 装饰器的语法1.3 装饰器的执行时机二、装饰器的