上下文管理器在Python中的妙用

更多Python学习内容:ipengtao.com
Python上下文管理器是一个非常强大的工具,它能够帮助开发者在特定代码块前后自动执行特定的操作,常用于资源管理,如文件操作、数据库连接和锁定等。本文将详细介绍Python上下文管理器的概念、使用方法、实现自定义上下文管理器,以及实际应用场景和示例代码。
什么是上下文管理器
上下文管理器是一种协议(或者说是一组方法),它允许你在进入和退出一个代码块时自动运行一些代码。上下文管理器通常与 with 语句一起使用,以确保资源在使用后被正确释放。
基本语法
with expression as variable:# 在这里使用变量pass 在这个语法中,expression 是一个返回上下文管理器的对象,variable 是上下文管理器的返回值。with 语句确保在代码块结束后,适当的清理代码会自动执行。
示例:文件操作
一个典型的使用场景是文件操作。使用上下文管理器可以确保文件在使用后被正确关闭。
# 不使用上下文管理器
file = open('example.txt', 'r')
try:content = file.read()
finally:file.close()# 使用上下文管理器
with open('example.txt', 'r') as file:content = file.read() 在上面的示例中,with 语句确保文件在读取完毕后自动关闭,即使在读取过程中发生异常。
内置上下文管理器
Python内置了多个上下文管理器,常见的包括文件操作、线程锁和数据库连接等。
示例:使用锁
import threadinglock = threading.Lock()# 不使用上下文管理器
lock.acquire()
try:# 访问共享资源pass
finally:lock.release()# 使用上下文管理器
with lock:# 访问共享资源pass 在这个示例中,with 语句确保锁在访问共享资源后自动释放。
实现自定义上下文管理器
可以通过实现 __enter__ 和 __exit__ 方法来自定义上下文管理器。这两个方法分别在进入和退出上下文时被调用。
示例:自定义上下文管理器
class MyContextManager:def __enter__(self):print("进入上下文")return selfdef __exit__(self, exc_type, exc_value, traceback):print("退出上下文")# 使用自定义上下文管理器
with MyContextManager() as manager:print("在上下文中") 在这个示例中,__enter__ 方法在进入上下文时打印消息,__exit__ 方法在退出上下文时打印消息。
使用 contextlib 模块
Python的 contextlib 模块提供了更方便的方式来创建上下文管理器,特别是对于简单的情况。
示例:使用 contextlib.contextmanager 装饰器
from contextlib import contextmanager@contextmanager
def my_context_manager():print("进入上下文")yieldprint("退出上下文")# 使用自定义上下文管理器
with my_context_manager():print("在上下文中") 在这个示例中,@contextmanager 装饰器将一个生成器函数转换为上下文管理器。yield 语句将控制权传递给 with 语句内部的代码块,代码块执行完毕后,执行 yield 之后的代码。
上下文管理器的实际应用
示例:计时器上下文管理器
一个常见的应用场景是创建一个计时器上下文管理器,用于测量代码块的执行时间。
import time
from contextlib import contextmanager@contextmanager
def timer():start_time = time.time()yieldend_time = time.time()print(f"执行时间: {end_time - start_time} 秒")# 使用计时器上下文管理器
with timer():# 模拟长时间运行的任务time.sleep(2) 在这个示例中,计时器上下文管理器测量代码块的执行时间,并在退出上下文时打印执行时间。
示例:数据库连接上下文管理器
另一个实际应用场景是管理数据库连接,确保在操作数据库后正确关闭连接。
import sqlite3
from contextlib import contextmanager@contextmanager
def db_connection(db_name):conn = sqlite3.connect(db_name)try:yield connfinally:conn.close()# 使用数据库连接上下文管理器
with db_connection('example.db') as conn:cursor = conn.cursor()cursor.execute('SELECT * FROM example_table')rows = cursor.fetchall()for row in rows:print(row) 在这个示例中,数据库连接上下文管理器确保在操作数据库后正确关闭连接。
处理异常
上下文管理器还可以用于处理异常,确保在发生异常时执行必要的清理操作。
示例:处理异常的上下文管理器
class ExceptionHandlingContextManager:def __enter__(self):print("进入上下文")return selfdef __exit__(self, exc_type, exc_value, traceback):if exc_type:print(f"异常类型: {exc_type}")print(f"异常值: {exc_value}")print("处理异常")return True # 表示异常已经被处理print("退出上下文")return False # 表示异常未被处理# 使用异常处理上下文管理器
with ExceptionHandlingContextManager() as manager:print("在上下文中")raise ValueError("这是一个示例异常") 在这个示例中,__exit__ 方法处理了在上下文中发生的异常,并返回 True 表示异常已经被处理。
总结
本文详细介绍了Python上下文管理器的概念、使用方法、自定义实现以及实际应用场景。通过内置和自定义上下文管理器,开发者可以在特定代码块前后自动执行特定操作,如资源管理和异常处理,确保代码更加优雅和高效。文中提供了丰富的示例代码,展示了文件操作、线程锁、计时器和数据库连接等常见应用。掌握上下文管理器的使用,可以显著提高代码的可读性和可维护性。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

往期推荐
历时一个月整理的 Python 爬虫学习手册全集PDF(免费开放下载)
Python基础学习常见的100个问题.pdf(附答案)
学习 数据结构与算法,这是我见过最友好的教程!(PDF免费下载)
Python办公自动化完全指南(免费PDF)
Python Web 开发常见的100个问题.PDF
肝了一周,整理了Python 从0到1学习路线(附思维导图和PDF下载)
相关文章:
上下文管理器在Python中的妙用
更多Python学习内容:ipengtao.com Python上下文管理器是一个非常强大的工具,它能够帮助开发者在特定代码块前后自动执行特定的操作,常用于资源管理,如文件操作、数据库连接和锁定等。本文将详细介绍Python上下文管理器的概念、使用…...
【PWN · TcachebinAttack | UAF】[2024CISCN · 华中赛区] note
一道简单的tcache劫持 一、题目 二、思路 存在UAF,libc版本2.31,经典菜单题 1.通过unsorted-bin-attack来leak-libc 2.通过uaf打tcache-bin-attack劫持__free_hook实现getshell 三、EXP from pwn import * context(archamd64,log_leveldebug)ioproce…...
Java数据脱敏
数据脱敏 敏感数据在存储过程中为是否为明文, 分为两种 落地脱敏: 存储的都是明文, 返回之前做脱敏处理不落地脱敏: 存储前就脱敏, 使用时解密, 即用户数据进入系统, 脱敏存储到数据库中, 查询时反向解密 落地脱敏 这里指的是数据库中存储的是明文数据, 返回给前端的时候脱…...
【Java Web】三大域对象
目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象,根据传递数据范围的不同,我们称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同。 二、…...
【Linux】进程信号_3
文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…...
LongRAG:利用长上下文大语言模型提升检索生成效果
一、前言 前面我们已经介绍了多种检索增强生成 (RAG) 技术,基本上在保证数据质量的前提下,检索增强生成(RAG)技术能够有效提高检索效率和质量,相对于大模型微调技术,其最大的短板还是在于有限的上下文窗口…...
go中的方法 func-----数据类型
本文是java学习者学go种产生的容易记混点的笔记,所以有其他编译语言的基础更好 go的方法有点像js 基础 func main() {fmt.Println("Starting")var p *string new(string)*p "hello world"demo : "demo"fmt.Println(*&demo) //这样既然也…...
408计算机网络--物理层
一、物理层概述 物理层是干嘛使得? 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 物理层主要任务是确定与传输媒体接口有关的一些特性。定义标准可以理解为插排上的两孔三孔 机械特性:定义物理连接…...
十年,亚马逊云科技合作伙伴网络开启AI新征程
“十年之前,你不认识我,我不认识你,因为云计算我们携手并肩;十年之后,我们仍是伙伴,更是朋友,因为人工智能再次起程。”这就是今天的亚马逊云科技与其合作伙伴的真实写照。 2024年是亚马逊云科技…...
基于Spring Boot的在线医疗咨询平台的设计与实现【附源码】
基于Spring Boot的在线医疗咨询平台的设计与实现 Design and implementation of the computer hardware mall based on Spring Boot Candidate: Supervisor: April 20th, 2024 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师…...
星坤Type-A连接器:创新快充技术,引领电子连接!
快速发展的电子时代,消费者对电子设备的性能和便利性有着更高的要求。特别是在充电和数据传输方面,快充技术和高速传输已成为市场的新宠。中国星坤公司推出的Type-A连接器系列,以其卓越的性能和创新的设计,满足了市场对高效、稳定…...
入门JavaWeb之 Response 下载文件
web 服务器接收到客户端的 http 请求 针对这个请求,分别创建一个代表请求的 HttpServletRequest 对象,代表响应的 HttpServletResponse 对象 获取客户端请求过来的参数:HttpServletRequest 给客户端响应一些信息:HttpServletRe…...
Java自定义注解校验token并直接返回给前端状态
自定义注解 CheckToken import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public int…...
C++ | Leetcode C++题解之第200题岛屿数量
题目: 题解: class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …...
Linux安全配置
Linux系统审计信息有:系统启动日志(boot.log)、记录用户执行命令日志(acct/pacct)、记录使用su命令的使用(sulog)、记录当前登录的用户信息(utmp)、用户每次登陆和退出信…...
vue实现不预览PDF的情况下打印pdf文件
前景:默认情况,实现打印需要根据预览的内容进行打印。 但是当只有打印按钮存在,不预览文件内容的情况下,实现打印的话,可以通过后端接口返回服务器上PDF的地址,前端通过隐藏的iframe标签中src可实现预览功能 主要是根据…...
C++ | Leetcode C++题解之第199题二叉树的右视图
题目: 题解: class Solution { public:vector<int> rightSideView(TreeNode* root) {unordered_map<int, int> rightmostValueAtDepth;int max_depth -1;stack<TreeNode*> nodeStack;stack<int> depthStack;nodeStack.push(ro…...
[leetcode]圆圈中最后剩下的数字/ 破冰游戏
. - 力扣(LeetCode) class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };...
mysql数据库的管理
目录 一、常用的数据类型 二、MySQ数据库基础操作 1、登录数据库 2、查看当前的 MySQL 版本信息及连接用户名 3、查看当前服务器中的数据库 4.查看数据库中包含的表 5.查看表的结构(字段) 6、MySQL的6大约束属性 三、SQL…...
Java项目分层(持续更新中)
第一次更新时间2024.6.26 分包 实体类 功能类 工具类 分层 实体类层 我们要操作的对象,Book,Student... 控制层 控制请求转发 业务层 处理业务 数据层 连接数据库 处理数据 工具类层 JDBC等工具类 测试层 最终启动项目 明确我们所要做的业务之后&a…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
