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.rhkb.cn/news/330149.html

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

相关文章

第七节 ConfigurationClassParser 源码分析

tips: ConfigurationClassParser 是 Springframework 中的重要类。 本章主要是源码理解,有难度和深度,也枯燥乏味,可以根据实际情况选择阅读。 位置:org.springframework.context.annotation.ConfigurationClassPars…

Java方法的重载

Java方法的重载 前言一、为什么要有重载代码示例问题 代码示例 二、重载的使用代码示例 三、重载的规则针对同一个类代码示例 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分…

HTML5好看的通用网站模板源码

文章目录 1.设计来源1.1 主界面1.2 模板菜单1 界面1.3 模板菜单2 界面1.4 模板菜单3 界面1.5 下拉菜单1 界面1.6 下拉菜单2 界面1.7 模板菜单4 界面1.8 模板菜单5 界面1.9 界面底部 2.效果和源码2.1 动态效果2.2 源码目录2.3 源代码 源码下载 作者:xcLeigh 文章地址…

django-celery-beat自动调度异步任务

Celery是一个简单、灵活且可靠的分布式系统,专门用于处理大量消息的实时任务调度。它支持使用任务队列的方式在分布的机器、进程、线程上执行任务调度。Celery不仅支持异步任务(如发送邮件、文件上传、图像处理等耗时操作),还支持…

深度学习之基于Tensorflow卷积神经网络(CNN)实现猫狗识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在人工智能和深度学习的热潮中,图像识别是一个备受关注的领域。猫狗识别作为图像识…

记录Python低代码开发框架zdppy_amcrud的开发过程

实现新增接口 基础代码 import env import mcrud import api import snowflakeenv.load(".env") db mcrud.new_env()table "user" columns ["name", "age"]async def add_user(req):data await api.req.get_json(req)values [d…

跟TED演讲学英文:Do schools kill creativity by Sir Ken Robinson

Do schools kill creativity? Link: https://www.ted.com/talks/sir_ken_robinson_do_schools_kill_creativity Speaker: Sir Ken Robinson Date: February 2006 文章目录 Do schools kill creativity?IntroductionVocabularySummaryTranscriptAfterword Introduction Sir…

[AI Google] 10个即将到来的Android生态系统更新

新的体验带来了更强的防盗保护、手表电池寿命优化,以及对电视、汽车等的娱乐功能改进。 昨天,我们分享了Android如何以人工智能为核心重新构想智能手机。今天,我们推出了Android 15的第二个测试版,并分享了更多我们改进操作系统的…

webSocket+Node+Js实现在线聊天(包含所有代码)

这篇文章主要介绍了如何使用 webSocket、Node 和 Js 实现在线聊天功能。 重要亮点 💻 技术选型:使用 Node.js 搭建服务器,利用 Express 框架和 Socket.io 库实现 WebSocket 通信。 📄 实现思路:通过建立数组存储聊天…

Linux 软件包管理器 yum的下载、功能介绍及使用

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 Linux下的三种软件安装方…

项目如何有效做资源管理?易趋项目管理软件让资源管理可视化

在项目管理的过程中,有效的资源管理能够确保资源得到合理的分配和使用,避免资源的浪费和冗余,进而提高整体工作效率、确保项目的成功;同时降低组织的运营成本。 但在项目推进过程中,项目经理总会面临各种资源管理的难…

MyBatis从入门到“入土“

💕喜欢的朋友可以关注一下,下次更新不迷路!💕(●◡●) 目录 一、Mybatis为何物?👌 二、快速入门🤣 1、新建项目😊 2、数据库建表😊 3、导入依赖的jar包😊…

vue3 路由跳转 携带参数

实现功能:页面A 跳转到 页面B,携带参数 路由router.ts import { createRouter, createWebHistory } from "vue-router";const routes: RouteRecordRaw[] [{path: "/demo/a",name: "aa",component: () > import(&quo…

【软件设计师】2018年的上午题总结

2018 2018上半年2018下半年 2018上半年 1.小阶向大阶对齐 2.吞吐率是最长流水段操作时间的倒数 3.ssh的端口号是22 4.s所发送的信息使用s的私钥进行数字签名,t收到后使用s的公钥验证消息的真实性 5.数据流分析是被动攻击方式 6.《计算机软件保护条例》是国务院颁布…

226.翻转二叉树

翻转一棵二叉树。 思路: 指针做交换 用递归(前序or后序,中序不行) 前序:中左右 遍历到“中”的时候,交换它的左右孩子 然后分别对它的左孩子和右孩子使用“交换函数”(定义的)&a…

【论文阅读】使用深度学习及格子玻尔兹曼模拟对SEM图像表征粘土结构及其对储层的影响

文章目录 0、论文基本信息1、深度学习2、可运行程序—Matlab3、深度切片3、LBM模拟4、局限性 0、论文基本信息 论文标题:Characterizing clay textures and their impact on the reservoir using deep learning and Lattice-Boltzmann simulation applied to SEM i…

Python-温故知新

1快速打开.ipynb文件 安装好anaconda后,在需要打开notebook的文件夹中, shift键右键——打开powershell窗口——输入jupyter notebook 即可在该文件夹中打开notebook的页面: 2 快速查看函数用法 光标放在函数上——shift键tab 3...

CGAN|生成手势图像|可控制生成

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:TensorFlow入门实战|第3周:天气识别🍖 原作者:K同学啊|接辅导、项目定制 CGAN(条件生成对抗网络&#xf…

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密,直接解 小小flag,拿下! 解题感悟 提示的太明显了

二分查找

题目链接 题目: 分析: 如果按照从头到尾的顺序一次比较, 每次只能舍弃一个元素, 效率是非常低的, 而且没有用到题目的要求, 数组是有序的因为数组是有序的, 所以如果我们随便找到一个位置, 和目标元素进行比较, 如果大于目标元素, 说明该位置的右侧元素都比目标元素大, 都可…