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中编写健壮、清晰和可维护代码的关键工具之一。
相关文章:
Python进阶之-上下文管理器
✨前言: 🌟什么是上下文管理器? 在Python中,上下文管理器是支持with语句的对象,用于为代码块提供设置及清理代码。上下文管理器广泛应用于资源管理场景,例如文件操作、网络连接、数据库会话等,…...
什么年代了,还在拿考勤说事
最近,看到了某公司的一项考勤规定:自然月内,事假累计超过3次或者累计请假时间超过8小时的,不予审批,强制休假的按旷工处理。 真的想吐槽,什么年代了,还在拿考勤说事,这是什么公司、什…...
泰迪智能科技中职大数据实验室建设(职业院校大数据实验室建设指南)
职校大数据实验室是职校校园文化建设的重要部分,大数据实训室的建设方案应涵盖多个方面,包括硬件设施的配备、软件环境的搭建、课程资源的开发、师资力量的培养以及实践教学体系的完善等。 打造特色,对接生产 社会经济与产业的…...
Qt QThreadPool线程池
1.简介 QThreadPool类管理一个QThread集合。 QThreadPool管理和重新设计单个QThread对象,以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance来访问该对象。 要使用其中一个QThreadPool…...
无人机+三维建模:倾斜摄影技术详解
无人机倾斜摄影测量技术是一项高新技术,近年来在国际摄影测量领域得到了快速发展。这种技术通过从一个垂直和四个倾斜的五个不同视角同步采集影像,从而获取到丰富的建筑物顶面及侧视的高分辨率纹理。这种技术不仅能够真实地反映地物情况,还能…...
Window(Qt/Vs)软件添加版本信息
Window(Qt/Vs)软件添加版本信息 文章目录 Window(Qt/Vs)软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…...
工厂模式+策略模式完成多种登录模式的实现
前提 (简单工厂不属于设计模式,而是一种编程思想【抽象一层出来】)工厂方法模式、抽象工厂模式 以上都是为了解耦,如果考虑多个纬度(如需要同时考虑多种电器,多种品牌)则优先考虑抽象工厂。 …...
赋能企业数字化转型 - 易点易动固定资产系统与飞书实现协同管理
在当前瞬息万变的商业环境下,企业如何借助信息化手段提升管理效率,已经成为摆在各行各业面前的紧迫课题。作为企业数字化转型的重要一环,固定资产管理的信息化建设更是不容忽视。 易点易动作为国内领先的企业资产管理服务商,凭借其全方位的固定资产管理解决方案,助力众多企业实…...
Sectigo 通配符SSL证书的优势分析!
Sectigo 通配符证书是一种专为需要保护同一主域名下的多个子域名而设计的安全解决方案。以下是Sectigo通配符证书的主要优势和特点: 1. 域名灵活性:使用通配符(*)符号,一张Sectigo通配符证书即可覆盖一个主域名及其所有…...
nuxt2路由,以及重构以前项目,路由使用
Nuxt.js根据pages目录结构自动生成vue-router模块的路由配置。 配置生成的路由可在.nuxt文件下的router.js文件中查看到,如: export const routerOptions {mode: history,base: /,linkActiveClass: nuxt-link-active,linkExactActiveClass: nuxt-link…...
eureka报错:链接8761被拒绝
eureka报错:链接8761被拒绝 来龙去脉 在idea环境中运行没有问题 我的配置是: server: port: 8001 spring: application: name: registry-server eureka: instance: hostname: localhost client: fetch-registry: false register-with-eureka: false …...
Linux 手动部署JDK21 环境
1、下载包(我下载的是tar) https://www.oracle.com/cn/java/technologies/downloads/#java21 完成后进行上传 2、检查已有JDK,并删除(我原有是jdk8) rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps3、清理掉 profile中的j…...
【c2】编译预处理,gdb,makefile,文件,多线程,动静态库
文章目录 1.编译预处理:C源程序 - 编译预处理【#开头指令和特殊符号进行处理,删除程序中注释和多余空白行】- 编译2.gdb调试:多进/线程中无法用3.makefile文件:make是一个解释makefile中指令的命令工具4.文件:fprint/f…...
c++结构体用构造函数进行初始化
结构体能自由组装数据,是一种很常见的数据打包方法。 当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。 在编程时对于定义的任何变量,我们最好都先初始化。 常见的操作是每定义…...
2024年五一数学建模C题完整解题思路代码
2024年第二十一届五一数学建模竞赛题目 C题 煤矿深部开采冲击地压危险预测 煤炭是中国的主要能源和重要的工业原料。然而,随着开采深度的增加,地应力增大,井下煤岩动力灾害风险越来越大,严重影响着煤矿的安全高效开采。在各类深…...
0018__GTK+:GTK+的简介、安装、使用方法之详细攻略
GTK:GTK的简介、安装、使用方法之详细攻略-CSDN博客...
环保访谈|浙江双视专注红外机器视觉及智能化应用,保障安全生产
近期,中联环保圈希姐采访了浙江双视科技股份有限公司环保行业销售总监孙波,深入了解了双视科技的发展历程、产品和解决方案、合作流程、核心竞争力以及未来规划。 双视于2014年创立,专注于红外机器视觉、人工智能技术与应用开发,…...
Web服务器
代码: WebServer 介绍 HTTP层 POST请求一般会包含Content-Length字段, 告诉服务器请求主体的长度GET请求一般不会包含Content-Length字段, 它一般不含请求正文POST响应: Content-Type字段, 根据请求资源的后缀填写 编写 1.读取请求与分析请求 2.根据不同请求方法构建不同的响…...
linux的firmware和hal层
linux的firmware和hal层 在Linux中,固件(firmware)和硬件抽象层(Hardware Abstraction Layer,HAL)是两个不同的概念。固件是运行在硬件设备上的程序,它们通常被用来控制硬件的操作。而HAL是一种…...
从ETL与ELT谈起,理解数仓的任务
最近有个朋友,有几十 PB 的异构数据,数据源包括 MySQL、DB2、Oracle、CSV、磁带机,等等,然后他需要把这些数据中的一些信息做关联整合,从这几十 PB 的数据中提取出若干业务字段到数据仓库,做统一分析。 数…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...
【学习记录】使用 Kali Linux 与 Hashcat 进行 WiFi 安全分析:合法的安全测试指南
文章目录 📌 前言🧰 一、前期准备✅ 安装 Kali Linux✅ 获取支持监听模式的无线网卡 🛠 二、使用 Kali Linux 进行 WiFi 安全测试步骤 1:插入无线网卡并确认识别步骤 2:开启监听模式步骤 3:扫描附近的 WiFi…...
