Python模块、包和异常处理

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

一、模块

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

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

1、引入模块

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

import math

print(math.sqrt(16))  # 输出: 4.0

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

2、别名和重命名

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

import math as m

print(m.sqrt(16))  # 输出: 4.0

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

3、导入模块的部分内容

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

from math import sqrt

print(sqrt(16))  # 输出: 4.0

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

4、自定义模块

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

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

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

import mymodule

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

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

5、模块搜索路径

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

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

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

二、包

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

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

1、创建包

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

mypackage/
    __init__.py
    module1.py
    module2.py
    subpackage/
        __init__.py
        module3.py

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

2、引入包

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

import mypackage.module1

mypackage.module1.some_function()

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

3、别名和重命名

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

import mypackage.module1 as m1

m1.some_function()

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

4、导入包的部分内容

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

from mypackage.module1 import some_function

some_function()

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

5、包的层次结构

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

mypackage/
    __init__.py
    module1.py
    module2.py
    subpackage1/
        __init__.py
        module3.py
    subpackage2/
        __init__.py
        module4.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):
    pass

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT--将编译程序打包成可安装执行文件方法记录

QT–将编译程序打包成可安装执行文件 文章目录 QT--将编译程序打包成可安装执行文件前言一、下载inno setup compiler工具并安装,然后,打开打包工具执行流程二、设置中文语言三、流程结束后需要修改脚本,否则,创建的快捷方式不是编…

web前端项目已有阿里巴巴图标基础上,再次导入阿里巴巴图标的方法

如果是第一次导入阿里巴巴图标请参考: vue项目引入阿里云图标_vue引用阿里云图标fontclass-CSDN博客 本文主要想讲在项目原有阿里巴巴图标基础上,再次导入阿里巴巴图标的解决办法: 1.iconfont.json对应修改就行,这个简单一看就明白; 2.iconfont.js主要改动<symbol><…

SpringBoot基础详解

文章目录 SpringBoot简介入门案例入门案例搭建基于SpringBoot官网创建项目SpringBoot项目快速启动 SpringBoot概述起步依赖默认配置 基础配置配置文件格式修改服务器端口SpringBoot配置文件加载顺序 yamlyaml语法规则yaml数组数据yaml数据读取 多环境开发配置多环境启动配置多环…

Python01:初入Python(Mac)

Python环境准备 下载Python&#xff1a;官网https://www.python.org/ 下载PyCharm&#xff1a;官网https://www.jetbrains.com/pycharm/download Python与PyCharm的关系 Python&#xff08;解释器&#xff09;&#xff1a;机器语言—>翻译人员–>翻译成电脑能读懂的 PyC…

//TODO 注释的作用

// TODO 用来标记某处&#xff0c;表示该处含有待办事项&#xff08;尚未解决&#xff09;。其设计本意只是提醒开发者注意&#xff0c;除了代码高亮之外&#xff0c;还可以借助编辑器实现快速定位。 如何使用&#xff1f; 直接在双斜杠后面加 TODO 或者 todo 即可&#xff0c…

opencv cuda win10

首先需要安装CUDA和cuDNN&#xff0c;不再赘述 下载对应的opencv和opencv_contrib 打开CMakeGUI&#xff0c;填入下载的路径和生成的路径 再点config configure完后会出现 在search栏修改以下&#xff1a; 1.modules路径 2.cuda 3. opencv_world 4.nonfree 5.取消勾选tes…

石油化工巡检机器人:应对挑战的创新力量

在石油化工领域&#xff0c;安全始终是高悬的达摩克利斯之剑。人工巡检面临诸多痛点&#xff0c;如高危环境对人身安全的巨大威胁&#xff0c;复杂工况下难以做到全面细致监测&#xff0c;对有害气体检测存在滞后性&#xff0c;还有恶劣天气对巡检工作的严重干扰。而这些痛点&a…

探索生态农业,守护绿色家园

在繁忙的都市生活中&#xff0c;我们往往忽略了与自然和谐相处的重要性。而生态农业&#xff0c;正是让我们重拾与大自然亲密关系的桥梁。通过采用生态友好的耕作方式&#xff0c;生态农业不仅能够提供健康、营养的农产品&#xff0c;还能够保护生态环境&#xff0c;实现人与自…

Cesium 开发大屏数据可视化模板 开箱即用 无偿贡献

下载地址&#xff1a;李鑫/cesium大屏数据可视化https://gitee.com/bujieqingfeng/cesium_data_visual 项目预览&#xff1a; 对您有用的话受累点个 ‘Star’

安卓数据存储(键值对、数据库、存储卡、应用组件Application、共享数据)

键值对 此小节介绍Android的键值对存储方式的使用方法&#xff0c;其中包括&#xff1a;如何将数据保存到共享参数&#xff0c;如何从共享参数读取数据&#xff0c;如何使用共享参数实现登陆页面的记住密码功能&#xff0c;如何使用Jetpack集成的数据仓库。 共享参数的用法 …

ESP-IDF使用Button组件实现按键检测的功能

ESP32使用Button组件实现按键检测的功能 ESP-IDF 组件管理LED 组件简介测试button组件写在最后 ESP-IDF 组件管理 IDF 组件管理器工具用于下载 ESP-IDF CMake 项目的依赖项&#xff0c;该下载在 CMake 运行期间自动完成。IDF 组件管理器可以从自动从组件注册表 或 Git 仓库获取…

【数据结构与算法】之堆及其实现!

目录 1、堆的概念及结构 2、堆的实现 2.1 堆向下和向上调整算法 2.2 堆的创建 2.3 建堆时间复杂度 2.4 堆的插入 2.5 堆的删除 2.6 完整代码 3、完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#…

ACM实训第十七天

Is It A Tree? 问题 考试时应该做不出来&#xff0c;果断放弃 树是一种众所周知的数据结构&#xff0c;它要么是空的(null, void, nothing)&#xff0c;要么是一个或的集合满足以下属性的节点之间有向边连接的节点较多。 •只有一个节点&#xff0c;称为根节点&#xff0c;它…

【设计模式深度剖析】【2】【创建型】【工厂方法模式】

&#x1f448;️上一篇:单例模式 | 下一篇:抽象工厂模式&#x1f449;️ 目录 工厂方法模式概览工厂方法模式的定义英文原话直译 工厂方法模式的4个角色抽象工厂&#xff08;Creator&#xff09;角色具体工厂&#xff08;Concrete Creator&#xff09;角色抽象产品&#x…

Celery教程

一、什么是Celery 1.1、celery是什么 Celery是一个简单、灵活且可靠的&#xff0c;处理大量消息的分布式系统&#xff0c;专注于实时处理的异步任务队列&#xff0c;同时也支持任务调度。 Celery的架构由三部分组成&#xff0c;消息中间件&#xff08;message broker&#x…

从零开始学Vue3--环境搭建

1.搭建环境 下载nodejs nodejs下载地址 更新npm npm install -g npm 设置npm源&#xff0c;加快下载速度 npm config set registry https://registry.npmmirror.com 使用脚手架创建项目 npm create vuelatest 根据你的需要选择对应选项 进入新建的项目下载依赖 npm in…

大模型时代,掌握Event Stream技术提升Web响应速度

大模型时代,每天搜索都可能会用到一种或多种大模型,在大文本输出的时候,页面是一字一字,一段一段的慢慢输出出来的,这背后是如何实现的呢?我们以KIMI为例 先抓个请求 我们发现界面展示是一句话,但是接口返回的时候是一个字一个字的。 普通请求 多了Event Stream的处理 …

机器人非线性控制方法——线性化与解耦

机器人非线性控制方法是针对具有非线性特性的机器人系统所设计的一系列控制策略。其中&#xff0c;精确线性化控制和反演控制是两种重要的方法。 1. 非线性反馈控制 该控制律采用非线性反馈控制的方法&#xff0c;将控制输入 u 分解为两个部分&#xff1a; α(x): 这是一个与…

更新web文件40秒后生效

服务器web服务使用的是nginx。 经测试&#xff0c;上传文件后大约40秒后生效。 更新文件不立即生效。 网上资料说根nginx中sendfile选项有关。 在nginx配置文件中&#xff0c;http区域里将sedfile设置为off&#xff0c;重启nginx服务。 谷歌浏览器强制刷新一次&#xff0c;…

用ControlNet+Inpaint实现stable diffusion模特换衣

用ControlNetInpaint实现stable diffusion模特换衣 ControlNet 训练与架构详解ControlNet 的架构用于文本到图像扩散的 ControlNet训练过程Zero卷积层的作用解释 inpaintInpaint Anything 的重要性Inpaint Anything 的功能概述 在现代计算机视觉领域&#xff0c;稳定扩散&#…