Python模块、包和异常处理

        大家好,在当今软件开发领域,Python作为一种简洁、易读且功能强大的编程语言,被广泛应用于各种领域。作为一名测试开发工程师,熟练掌握Python的模块、包和异常处理是提高代码可维护性和错误处理能力的关键。本文将和大家一起探讨Python中的模块、包和异常处理的重要性以及如何正确使用它们来构建高质量的测试代码。

一、模块

        在Python中,模块是一种组织和封装代码的方式。一个模块是一个包含 Python 定义和语句的文件,可以包含变量、函数、类和可执行的代码。模块提供了一种将相关的代码组织在一起的机制,使得代码的复用和维护变得更加容易。

        模块是 Python 中组织和封装代码的一种方式。通过 import 关键字可以引入模块,并在当前模块中使用模块中的函数、类和变量。可以使用别名和重命名来简化模块的使用。还可以自己编写模块,并在其他程序中进行引入和使用。理解和熟悉模块的使用可以提高代码的复用性和可维护性。

1、引入模块

        在 Python 中,使用 import 关键字来引入一个模块。通过 import,可以将一个模块中的代码引入到当前模块中进行使用。引入模块后,就可以使用模块中定义的函数、类和变量。

import mathprint(math.sqrt(16))  # 输出: 4.0

        这个例子中,import math 引入了 Python 标准库中的 math 模块。然后可以使用 math.sqrt() 函数计算平方根。

2、别名和重命名

        为了方便使用,可以给模块指定别名或重命名。使用 as 关键字可以为模块指定别名,在代码中使用别名代替模块名。

import math as mprint(m.sqrt(16))  # 输出: 4.0

        这个例子中,import math as m 将 math 模块重命名为 m。然后可以使用 m.sqrt() 计算平方根。

3、导入模块的部分内容

        有时候只需要导入模块的一部分内容,而不是整个模块。可以使用 from ... import ... 语句来导入模块中的特定函数、类或变量。

from math import sqrtprint(sqrt(16))  # 输出: 4.0

        这个例子中,from math import sqrt 导入了 math 模块中的 sqrt 函数。直接可以使用 sqrt() 计算平方根,而无需使用模块名前缀。

4、自定义模块

        在 Python 中,可以自己编写模块,并在其他程序中进行引入和使用。创建一个模块,只需要将相关的代码保存在一个以 .py 为扩展名的文件中。

# mymodule.py
def greeting(name):print("Hello, " + name)

在其他程序中引入自定义的模块:

import mymodulemymodule.greeting("John")  # 输出: Hello, John

自定义的模块可以包含函数、类和变量等,可以在其他程序中进行引入和使用。

5、模块搜索路径

        Python 解释器会按照一定的顺序搜索模块的位置。当导入一个模块时,解释器会按照以下顺序搜索模块的位置:

  • 内置模块
  • 在 sys.path 列表中的目录
  • 当前目录

        这意味着可以将自己编写的模块放置在特定的目录中,然后将该目录添加到 sys.path 列表中,从而使解释器能够找到并导入这些模块。

二、包

        在Python中,包是一种用于组织和管理模块的机制。包是一个包含了一个特殊文件 __init__.py 的目录,它可以包含多个模块和子包。使用包可以更好地组织和管理大型项目的代码,并提供了一种层次化的结构。

        包是 Python 中组织和管理模块的一种机制。包是一个包含 __init__.py 文件的目录,它可以包含多个模块和子包。使用包可以更好地组织和管理代码,提供了一种层次化的结构。可以使用 import 关键字引入包或包中的模块,并使用别名或重命名来简化包的使用。还可以通过 from ... import ... 语句导入包中的特定模块或成员。理解和熟悉包的使用可以提高代码的组织性和可维护性,特别对于大型项目来说。

1、创建包

        创建一个包非常简单,只需创建一个目录,并在该目录中添加一个名为 __init__.py 的文件。这个特殊的文件标识了该目录是一个包。

mypackage/__init__.pymodule1.pymodule2.pysubpackage/__init__.pymodule3.py

        在上面的示例中,mypackage 是一个包的目录,其中包含了 __init__.py 文件和其他模块文件。subpackage 是一个子包,它也是一个包的目录,并包含了自己的 __init__.py 文件和模块文件。

2、引入包

        使用 import 关键字可以引入一个包或包中的模块。引入包后,可以使用包中模块的函数、类和变量。

import mypackage.module1mypackage.module1.some_function()

        在上面的示例中,import mypackage.module1 引入了 mypackage 包中的 module1 模块。然后可以使用 mypackage.module1 来访问该模块中的函数和变量。

3、别名和重命名

        类似于模块,也可以为包指定别名或重命名。使用 as 关键字可以为包指定别名,以便在代码中使用别名代替包名。

import mypackage.module1 as m1m1.some_function()

        在上面的示例中,import mypackage.module1 as m1 将 mypackage.module1 重命名为 m1,然后可以使用 m1 来访问该模块中的函数和变量。

4、导入包的部分内容

        类似于模块,也可以只导入包中的特定模块或成员。使用 from ... import ... 语句可以导入包中的特定模块或成员。

from mypackage.module1 import some_functionsome_function()

        在上面的示例中,from mypackage.module1 import some_function 导入了 mypackage 包中的 module1 模块中的 some_function 函数。直接可以使用 some_function() 调用该函数,而无需使用包名前缀。

5、包的层次结构

        包可以形成层次结构,即包中可以包含子包。子包是一个包的子目录,它也必须包含一个 __init__.py 文件。通过创建多层次的包结构,可以更好地组织和管理代码。

mypackage/__init__.pymodule1.pymodule2.pysubpackage1/__init__.pymodule3.pysubpackage2/__init__.pymodule4.py

        在上面的示例中,mypackage 包中包含了两个子包 subpackage1 和 subpackage2,以及其他模块文件。

6、相对导入

        相对导入是一种在包内部进行模块引用的方式。相对导入使用 from . 或 from .. 的形式来指定相对于当前模块的位置进行导入。

# mypackage/subpackage1/module3.py
from . import module4
from .. import module1

        在上面的示例中,module3.py 是 subpackage1 包中的一个模块。通过 from . import module4 导入了同级目录下的 module4 模块,而 from .. import module1 则是导入了上级目录下的 module1 模块。

7、__init__.py 文件的作用

     __init__.py 文件是包中的一个特殊文件,它可以为空文件,也可以包含有效的Python代码。该文件在包被导入时会被执行,并可以用于初始化包的状态或执行其他必要的操作。此外,__init__.py 文件还可以定义包的公共接口,指定哪些模块或成员应该在包级别上可见。

8、第三方包和Python包管理器

        除了Python内置的包和模块外,还有许多由其他开发者编写的第三方包可供使用。这些包可以提供各种功能和工具,从而扩展Python的能力。常用的Python包管理器包括pip和conda,它们可以用于安装、管理和升级第三方包。

例如,可以使用以下命令使用pip安装名为requests的包:

pip install requests

安装完成后,就可以在代码中引入该包并使用它的功能了。

三、异常处理

        在Python中,异常处理是一种机制,用于捕获和处理程序运行时可能发生的错误或异常情况。通过合理地处理异常,可以使程序在遇到错误时能够继续执行或提供友好的错误信息,增强程序的健壮性和可靠性。

1、异常的种类

        Python中有许多内置的异常类型,例如TypeErrorValueErrorFileNotFoundError等。每种异常类型都代表了不同的错误或异常情况。此外,还可以自定义异常类来表示特定的错误。

一些常见的异常种类如下:

  • Exception(异常):

    Exception是所有内置异常的基类,其他异常类型都是Exception的子类。通常情况下,应捕获特定的异常类型,而不是捕获基类Exception

  • AttributeError(属性错误):

    当尝试访问对象不存在的属性或方法时引发的异常。

  • ValueError(值错误):

    当传递给函数的参数具有正确的类型但无效的值时引发的异常。

  • TypeError(类型错误):

    当操作或函数应用于不兼容类型的对象时引发的异常。

  • IndexError(索引错误):

    当尝试访问序列(列表、元组等)中不存在的索引位置时引发的异常。

  • KeyError(键错误):

    当尝试使用字典中不存在的键访问字典元素时引发的异常。

  • FileNotFoundError(文件未找到错误):

    当尝试打开不存在的文件时引发的异常。

  • IOError(输入/输出错误):

    当发生与输入/输出操作相关的错误时引发的异常,例如读取或写入文件时发生错误。

  • ZeroDivisionError(零除错误):

    当尝试将一个数除以零时引发的异常。

  • ImportError(导入错误):

    当导入模块时发生错误时引发的异常,可能是模块不存在或无法导入。

  • KeyboardInterrupt(键盘中断):

    当用户按下Ctrl+C或中断程序执行时引发的异常。

  • AssertionError(断言错误):

    当使用assert语句时,断言条件为False时引发的异常。

  • StopIteration(停止迭代):

    当迭代器没有更多的项目时引发的异常。

  • UnicodeError(Unicode错误):

    当处理Unicode字符串时遇到错误时引发的异常。

2、try-except语句

        使用try-except语句可以捕获并处理异常。try块中包含可能引发异常的代码,而except块用于处理捕获到的异常。

try:# 可能引发异常的代码
except SomeException:# 处理某种特定异常的代码
except AnotherException:# 处理另一种特定异常的代码
except:# 处理其他所有异常的代码

        在上面的示例中,try块中的代码可能引发异常。如果某个异常被捕获到,就会执行相应的except块中的代码。可以有多个except块来处理不同的异常类型。还可以使用一个通用的except块来处理所有未被特定except块捕获的异常。

3、捕获异常对象

except块中,可以通过将异常对象赋值给一个变量来获取有关异常的详细信息。

try:# 可能引发异常的代码
except SomeException as e:# 处理异常,使用异常对象e获取相关信息

        在上面的示例中,将捕获到的异常对象赋值给变量e,可以使用e来访问异常的属性和方法,以获取有关异常的更多信息。

4、处理多个异常

可以在一个except块中处理多个异常类型。

try:# 可能引发异常的代码
except (Exception1, Exception2):# 处理Exception1和Exception2异常的代码

        在上面的示例中,当Exception1Exception2异常被捕获时,都会执行相应的except块中的代码。

5、finally块

        可以使用finally块来定义一段无论是否发生异常都会执行的代码。无论是否发生异常,finally块中的代码都会被执行。

try:# 可能引发异常的代码
except SomeException:# 处理异常的代码
finally:# 无论是否发生异常,都会执行的代码

在上面的示例中,无论是否发生异常,finally块中的代码都会被执行。

6、抛出异常

可以使用raise语句来抛出自定义的异常或重新抛出已捕获的异常。

try:# 可能引发异常的代码if some_condition:raise CustomException("Something went wrong.")
except CustomException:# 处理自定义异常raise  # 重新抛出已捕获的异常

        在上面的示例中,当满足某个条件时,会抛出一个自定义的异常。然后可以在except块中处理该自定义异常,或者使用raise重新抛出已捕获的异常。

7、异常的层级关系

        异常类型之间可以形成层级关系,这种层级关系是通过继承实现的。在Python中,异常类形成一个类似树状结构的层级关系,其中基类异常捕获更通用的错误,子类异常捕获更具体的错误。这允许我们在处理异常时灵活地捕获和处理不同级别的异常。

下面是一个示例异常层级关系的简化图示:

        在这个层级关系中,BaseException是所有异常的基类,Exception是大多数常见异常的基类。BaseExceptionException之间有其他一些通用的异常类,如SystemExitKeyboardInterrupt

        Exception类下面是StandardError,它是大多数内置异常的基类。StandardError的子类包括ArithmeticError(算术错误)和LookupError(查找错误)。ArithmeticError的子类包括ZeroDivisionError(除零错误)和OverflowError(溢出错误)。LookupError的子类包括IndexError(索引错误)和KeyError(键错误)。此外,还有其他一些异常类,如EnvironmentError(环境错误),它是OSError(操作系统错误)的基类。EnvironmentError的子类包括IOError(输入/输出错误)和FileNotFoundError(文件未找到错误)。

        通过了解异常的层级关系,我们可以根据需要选择适当的异常类型进行捕获和处理。捕获父类异常可以同时捕获其子类异常,这样可以提供更灵活和全面的异常处理机制,以满足不同的错误情况。

8、else语句

可以在try-except语句中添加else块,用于处理在try块中没有发生异常时执行的代码。

try:# 可能引发异常的代码
except SomeException:# 处理异常的代码
else:# 在没有发生异常时执行的代码

在上面的示例中,如果在try块中没有发生异常,那么else块中的代码将被执行。

9、自定义异常类

        可以通过继承内置的Exception类或其子类来创建自定义的异常类,以表示特定的错误或异常情况。

class CustomException(Exception):passtry:if some_condition:raise CustomException("Something went wrong.")
except CustomException as e:# 处理自定义异常

        在上面的示例中,CustomException是一个自定义的异常类,它继承自Exception类。当某个条件满足时,会抛出该自定义异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP-MRP和采购申请

1、如果采购申请是手工创建的,跑MRP会不会被覆盖? 创建一个采购申请18089476,然后运行MRP-MD03,再用MD04查看下 从上图看,手工创建的采购申请被打上*号,没有被覆盖掉。 2、如果采购申请被审批了,会不会被覆盖掉? 首先创建一个独立需求MD61 然后库存消耗掉为0,运行M…

普源精电收购耐数电子——用“钞能力”拿下“量子”?

「量子市界」聚焦量子前沿,揭秘市场动态┃2024年4月30日,普源精电新增“量子科技”概念。 似乎一夜之间,新增“量子科技”概念的上市企业如雨后春笋般登场——普源精电就是其一。普源精电本就持有耐数电子32.26%股权,于4月2日发布…

c4d云渲染是工程文件会暴露吗?

在数字创意产业飞速发展的今天,C4D云渲染因其高效便捷而备受欢迎。然而,随着技术应用的深入,人们开始关注一个核心问题:在享受云渲染带来的便利的同时,C4D工程文件安全吗?是否会有暴露的风险?下…

【如何让论文中摘要后面的内容不出现在目录中】

首先选择摘要二字,设置为一级标题,然后选择摘要后面的内容设置为正文样式,再选择这一部分看一下是不是都是正文大纲级别,如果是那就可以了。 具体流程如下 1、选择摘要二字,设置为一级标题样式 2、选择摘要后面的文…

x264 码率控制原理:rate_estimate_qscale 函数

rate_estimate_qscale 函数 原理 函数功能:根据目前使用的实际比特数更新一帧的qscale;是一个复杂的决策过程,需要考虑多种因素,如帧类型、编码的复杂度、目标比特率、缓冲区大小等,以确保视频质量和文件大小之间的平衡。函数参数分析:x264_t *h :编码器上下文信息结构…

扩散模型学习1

DDPM 总体训练原理 https://www.bilibili.com/video/BV1nB4y1h7CN/?spm_id_from333.337.search-card.all.click&vd_sourcef745c116402814185ab0e8636c993d8f 讲得很好:每次都是输入t和noise-x的图像,预测noise之后得到和加入的noise比较&#xff1b…

LLM实战:当网页爬虫集成gpt3.5

1. 背景 最近本qiang~关注了一个开源项目Scrapegraph-ai,是关于网页爬虫结合LLM的项目,所以想一探究竟,毕竟当下及未来,LLM终将替代以往的方方面面。 这篇文章主要介绍下该项目,并基于此项目实现一个demo页面&#x…

Java并发: 锁和同步

在Java并发: 面临的挑战那一篇中我们提到锁和同步是实现并发安全(可见性/原子性)的方法之一。这一章我们来讲讲Java中的锁和同步的各种工具,包括: LockSupportAbstractQueuedSynchronizerJava内置的锁实现 1. LockSupport LockSupport是基于Unsafe的park/unpark实…

智能禁区监控:计算机视觉在人员禁区闯入检测中的应用

基于视觉分析的人员禁区闯入行为检测算法主要依赖于计算机视觉技术和深度学习算法。这些技术结合高性能的摄像头和图像处理硬件,实现了对监控区域内人员行为的自动识别和分析。具体来说,这种检测算法利用摄像头捕捉的视频数据,通过深度学习模…

Kubernetes 应用滚动更新

Kubernetes 应用版本号 在 Kubernetes 里,版本更新使用的不是 API 对象,而是两个命令:kubectl apply 和 kubectl rollout,当然它们也要搭配部署应用所需要的 Deployment、DaemonSet 等 YAML 文件。 在 Kubernetes 里应用都是以 …

nssctf——web

[SWPUCTF 2021 新生赛]gift_F12 1.打开环境后,这里说要900多天会有flag,这是不可能的 2.f12查看源码,然后在html中查找flag (在最上方的栏目中,或者按ctrlf) [SWPUCTF 2021 新生赛]jicao 1.打开环境是一段…

Vue速成学习笔记

这两天速成了一下Vue,在这里记录一下相关的笔记,之后有时间详细学Vue的时候再来回顾一下! 一、Vue理解 1、Vue的核心特征:双向绑定。 在网页中,存在视图和数据。在Vue之前,需要使用JavaScript编写复杂的逻…

音视频及H264/H256编码相关原理

一、音视频封装格式原理: 我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…

谷歌上架,个人号比企业号好上?“14+20”封测如何解决,你知道了吗

在Google Play上架应用,对开发者而言,既是挑战也是机遇。随着谷歌政策的不断更新,特别是要求2023年11月13日后注册的个人开发者账号在发布正式版应用前,必须经过20人连续14天的封闭测试。 这一政策的改变使得许多开发者开始考虑使…

什么是物联网通信网关?-天拓四方

在信息化、智能化的时代,物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备,将现实世界与数字世界紧密相连,从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分,物联网通信…

【数据结构】堆(Heep)

✨✨✨专栏:数据结构 🧑‍🎓个人主页:SWsunlight 目录 一、堆: 定义: 性质: 大、小根堆: 二、实现堆(完全二叉树): 前言: …

Linux软硬链接及动静态库

软硬链接与动静态库 软连接 创建链接的方法: ln -s test1.txt test2.txt 其中ln 是link(链接),-s 是soft(软),后者链接前者。 此时打开test2.txt,发现其中内容与test.txt一致。那么软连接到底建立了什么联系?…

轻松购物,尽在购物网

在忙碌的生活中,想要找到心仪的商品,却总是苦于没有时间和精力去实体店挑选?别担心,购物网为您提供一站式的购物体验。无论是时尚服饰、家居用品,还是美食特产,这里都能满足您的需求。只需轻轻一点&#xf…

C/C++运行时库和UCRT系统通用运行时库总结及问题实例分享

目录 1、概述 2、不同版本的Visual Studio对应的运行时库说明 3、在Windbg10.0安装目录中获取UCRT通用运行时库 4、微软官网对UCRT通用运行时库的相关说明 5、使用Visual Studio 2017开发软件初期遇到的UCRT通用运行时库问题 6、如何查看软件依赖了哪些C/C运行时库&#…

leetcode-盛水最多的容器-109

题目要求 思路 1.正常用双循环外循环i从0开始,内循环从height.size()-1开始去计算每一个值是可以的,但是因为数据量太大,会超时。 2.考虑到超时,需要优化一些,比如第一个选下标1,第二个选下标3和第一个选下…