Python进阶之-上下文管理器

✨前言:

🌟什么是上下文管理器?

在Python中,上下文管理器是支持with语句的对象,用于为代码块提供设置及清理代码。上下文管理器广泛应用于资源管理场景,例如文件操作、网络连接、数据库会话等,其目的是确保如文件或网络会话等资源的正确获取和释放,即使在发生异常时也能保证这点。

🌟上下文管理器组成

一个上下文管理器必须实现以下两个魔法方法:
enter(self): 进入with语块时执行的方法。__enter__方法的返回值会被with语句的as子句绑定。
exit(self, exc_type, exc_value, traceback): 退出with语块时执行的方法。如果with代码块正常执行完毕,exc_type、exc_value和traceback将为None;如果抛出了异常,这三个参数则用于传递异常信息。

🌟标准库中的上下文管理器

Python的标准库中有许多内置的上下文管理器,最常用的是文件操作。例如:

with open('example.txt', 'r') as f:content = f.read()print(content)
# 文件会在这里被自动关闭,即使读取文件中出现异常也是如此。

🌟自定义上下文管理器

要创建自定义上下文管理器,你可以定义一个类并实现__enter__和__exit__方法。

下面是一个简单的示例,实现了一个会在进入和退出代码块时打印文本的上下文管理器:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/6
# @Author  : Summer
# @File    : test
# @describe:
"""class MyContextManager:def __enter__(self):print("Entering the context!")return selfdef __exit__(self, exc_type, exc_value, traceback):print("Exiting the context!")return False  # 如果返回True,则异常不会被重新抛出;否则会被抛出。with MyContextManager() as manager:print("Inside the with statement!")

输出:

Entering the context!
Inside the with statement!
Exiting the context!

🌟使用contextlib模块

Python还提供了一个名为contextlib的模块,它允许你使用装饰器或生成器来定义上下文管理器,而不是显式地创建一个类。

使用装饰器contextlib.contextmanager可以通过一个生成器函数来创建简单的上下文管理器:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/6
# @Author  : Summer
# @File    : test
# @describe:
"""from contextlib import contextmanager@contextmanager
def my_context():print("Entering the context!")try:yieldfinally:print("Exiting the context!")with my_context():print("Inside the with statement!")

这会产生与之前自定义类相同的输出。在yield之前的语句相当于__enter__方法,在yield之后相当于__exit__方法。

🌟上下文管理器堆叠

在需要管理多个资源的情况下,可以堆叠多个上下文管理器:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/6
# @Author  : Summer
# @File    : test
# @describe:
"""from contextlib import contextmanager@contextmanager
def open_file(file_name, method):file = open(file_name, method)yield filefile.close()with open_file('file1.txt', 'w') as f1, open_file('file2.txt', 'w') as f2:f1.write('Hello, file1!')f2.write('Hello, file2!')

🌟上下文管理器处理异常

在上下文管理器中处理异常是通过__exit__方法完成的。这个方法有四个参数:self、exc_type、exc_val和traceback。如果with代码块在执行过程中没有发生异常,exc_type、exc_val和traceback三个参数的值都将是None。如果发生了异常,这三个参数则分别代表异常类型、异常值和追踪信息。

exc_type : 异常类型
exc_val : 异常值
exc_tb : 异常回溯追踪

你可以在__exit__方法内部决定如何处理这些异常。如果你想让这个异常被抛出到外层代码,你可以返回False;如果你处理了异常并不想让它被抛出,你可以返回True,这样异常就不会传播出去。
下面是一个简单的例子,演示如何在上下文管理器中捕获和处理异常:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/6
# @Author  : Summer
# @File    : test
# @describe:
"""class MyContextManager:def __enter__(self):print("Entering the context")return selfdef __exit__(self, exc_type, exc_val, traceback):if exc_type is not None:print(f"Exception occurred: {exc_val}")return True  # 处理了异常,阻止异常被抛出print("Exiting the context normally")return False  # 未处理异常,允许其传播with MyContextManager():print("Inside the with block")raise ValueError("Something went wrong!")print("Outside the with block")  # 由于异常被处理,这行代码会正常执行

输出:

Entering the context
Inside the with block
Exception occurred: Something went wrong!
Outside the with block

🌟上下文管理器的作用:

资源管理: 上下文管理器可确保如文件、网络连接和数据库会话等资源被及时且正确地关闭或释放。这对避免资源泄露非常重要。

异常处理: 它可以在代码块执行后集中处理在执行过程中可能发生的异常,有助于代码的清晰性并减少重复的错误处理代码。

代码清洁: 使用上下文管理器可以减少资源管理相关的样板代码量,使代码更加简洁、可读。

设置和清理: 上下文管理器非常适合执行需要临时设置和随后清理操作的场景(例如,更改当前目录、更新某些全局设置等)。
总的来说,上下文管理器提供了一种结构化管理资源和处理异常的优雅方式,是Python中编写健壮、清晰和可维护代码的关键工具之一。

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

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

相关文章

性能拉满!NeRF与SLAM结合,最新SOTA参数减少30倍!

给大家推荐一个非常新兴的,有大量创新点可以挖掘的好方向:NeRF结合SLAM。 通过结合NeRF的高质量三维场景重建能力和SLAM的动态定位与环境理解能力,我们可以利用逐帧收集的数据,逐渐构建出高质量的3D场景模型,实现更加…

Linux migrate_type初步探索

1、基础知识 我们都知道Linux内存组织管理结构架构,顶层是struct pglist_data,然后再到struct zone,最后是struct page。大概的管理结构是这样的: 根据物理内存的地址范围可划分不同的zone,每个zone里的内存由buddy…

【企业动态】东胜物联正式加入EnOcean联盟,携手为智慧楼宇及能源管理提供更稳定的硬件解决方案

2024年4月,东胜物联(Dusun)宣布正式加入EnOcean联盟。EnOcean联盟是一个由来自建筑行业的400多家公司组成的全球性组织。它以EnOcean无线标准(ISO/IEC 14543-3-10/11)为基础,为可持续建筑自动化建立了创新的…

HTTPS安全通信:客户端与服务端协商过程详解

引言: HTTPS作为一种加密通讯协议,通过SSL/TLS协议确保客户端与服务端之间的通信安全。其中,客户端与服务端之间的协商过程至关重要。本文将梳理HTTPS通信中客户端与服务端之间的协商过程,以及其保障通信安全的关键作用。 1. 客户…

基于K8S构建Jenkins持续集成平台

文章目录 安装和配置NFSNFS简介NFS安装 在Kubernetes安装Jenkins-Master创建NFS client provisioner安装Jenkins-Master Jenkins与Kubernetes整合实现Jenkins与Kubernetes整合构建Jenkins-Slave自定义镜像 JenkinsKubernetesDocker完成微服务持续集成拉取代码,构建镜…

全栈低代码:前后端业务需求实现100%覆盖!

工具背景: 织信低代码平台“组件设计器”功能专为对个性化定制页面需求较为强烈的用户准备的,该功能组件十分丰富和强大,还融合了AI智能,能够帮助用户0成本起步,平均花1-2个小时就能快速构建一套网站、APP、小程序。 …

期权如何开户的流程是什么样的?

今天期权懂带你了解期权如何开户的流程是什么样的?期权账户开户是指投资者向期权经纪商或金融机构提交申请,以便可以在期权市场上进行交易并持有期权合约的账户开设过程。 期权如何开户的流程是什么样的? 1. 投资者参与营业部提供的股票期权…

Windows环境下VSCode C环境配置

前言: 本文记录了自己在配置 Windows环境下 VSCode C开发环境的遇到的问题和解决方法。 参考: vscode c语言没有代码提示_clangd提示不生效-CSDN博客 VSCODE无法跳转_vscode 不能跳转-CSDN博客 vscode c/c环境配置(MinGW)调用第三官方库…

​​【收录 Hello 算法】3.2 基本数据类型

目录 3.2 基本数据类型 3.2 基本数据类型 当谈及计算机中的数据时,我们会想到文本、图片、视频、语音、3D 模型等各种形式。尽管这些数据的组织形式各异,但它们都由各种基本数据类型构成。 基本数据类型是 CPU 可以直接进行运算的类型&#xff0c…

【软件工程】测试

目录 前言软件测试的目标测试准则测试方法测试方案(重点)白盒测试(重点)逻辑覆盖测试语句覆盖判定覆盖(分支覆盖)条件覆盖判定/条件覆盖条件组合覆盖总结 基本路径覆盖法 黑盒测试等价类法边界值分析法 软件…

从自定义一个作用域开始来了解SpringBean的作用域

你好,这里是codetrend专栏“Spring6全攻略”。 在 Spring 框架中,Bean 的作用域(Scope)定义了 Bean 实例在容器中如何创建、管理和销毁的策略。 Spring 提供了多种 Bean 作用域,每种作用域都有其特定的生命周期和适用…

spi 驱动-数据发送流程分析

总结 核心函数是spi_sync, 设备驱动->核心函数-> 控制器驱动 实例分析 (gdb) c Continuing.Thread 115 hit Breakpoint 1, bcm2835_spi_transfer_one (master0xffffffc07b8e6000, spi0xffffffc07b911800, tfr0xffffff8009f53c40) at drivers/spi/spi-bcm2835…

Day45代码随想录动态规划part07:70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数、139.单词拆分

Day45 动态规划part07 完全背包 70. 爬楼梯&#xff08;进阶版&#xff09; 卡码网链接&#xff1a;57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; (kamacoder.com) 题意&#xff1a;假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬至多m (1 < m < n)个…

导数和偏导数练习

导数题目列表 偏导数题目列表 这里是上述50个导数和偏导数练习题的答案&#xff1a; 导数答案列表 偏导数答案列表 更多问题咨询 Cos机器人

Linux之命令行参数与环境变量

命令行参数&环境变量 命令行参数 main函数也是一个函数&#xff0c;其实也可以携带参数的 int main( int argc, char *argv[ ], char *envp[ ] ) {program-statements } 那这里是有三个参数的: 第一个参数&#xff1a; argc 是个整型变量&#xff0c;表示命令行参数的个数…

ABAP 第二代增强-采购申请子屏幕增强

文章目录 第二代增强-采购申请子屏幕增强需求实现过程创建项目运行效果客户屏幕的PBO全局变量获取数据更新数据运行效果查询底表修改数据 第二代增强-采购申请子屏幕增强 需求 实现过程 创建项目 运行效果 客户屏幕的PBO 全局变量 *&------------------------------------…

关于Docker的数据管理

文章目录 一、Docker的数据管理1、数据卷1.1 数据卷定义1.2 数据卷配置 2、数据卷容器2.1 创建数据卷容器2.2 使用--volume-from来挂载luck02 二、端口映射三、容器互联1、创建容器互联2、进入luck02测试&#xff08;ping 容器名/别名&#xff09; 四、Docker镜像的创建1、基于…

Java类文件.class详解

一、编译型语言和解释型语言的区别 1、编译型语言&#xff1a; 在编译型语言中&#xff0c;源代码会被整个编译成机器码或者中间代码&#xff08;比如Java的字节码&#xff09;&#xff0c;生成可执行文件。 运行程序时&#xff0c;不需要再对源代码进行解释&#xff0c;而是…

vue3怎么使用i18n

在 Vue 3 中使用国际化&#xff08;i18n&#xff09;通常涉及到使用 Vue I18n Next&#xff0c;这是 Vue 3 的官方国际化插件。以下是如何设置和使用 Vue I18n Next 的步骤&#xff1a; 1. 安装 Vue I18n Next 使用 npm 或 yarn 安装 Vue I18n Next&#xff1a; npm install …

Yarn的安装及使用

YARN的安装及使用主要分为以下几个步骤&#xff1a; 一、安装YARN YARN的安装依赖于Node.js的运行环境&#xff0c;因此需要先安装Node.js。 下载并安装Node.js&#xff1a;可以从Node.js官网下载并安装适合你操作系统的Node.js安装包。安装YARN&#xff1a; 在Windows系统…