AI大模型入门-Python进阶-上下文管理与with语句
视频链接不如语冰https://space.bilibili.com/70431433?spm_id_from333.1007.0.0文章代码链接https://github.com/zyf-ngu/Qmatter7上下文管理与with语句上下文管理是一种用于管理资源如文件、网络连接、锁等的机制它确保在代码块执行前后进行正确的资源分配和释放即使代码块中发生了异常也是如此。 在Python中上下文管理是通过with语句来实现的。with语句允许我们定义一个执行上下文在该上下文中我们可以确保资源的获取和释放是自动完成的。 即在with语句中我们只需要关注资源或对象本身的操作这点和普通方法一致系统自动释放资源和对象这点在普通方法中需要通过try except和finally实现即try实现功能except处理异常finally释放资源。上下文管理器的基本结构上下文管理的基本结构由两个特殊方法组成__enter__和__exit__。这两个方法定义在上下文管理器对象中。1. __enter__(self):当进入with语句块时会调用这个方法。该方法返回的资源是类吗会被赋值给as后面的变量如果有的话。 通常在这个方法中获取资源如打开文件。2. __exit__(self, exc_type, exc_value, traceback):当离开with语句块时无论是正常结束还是因为异常都会调用这个方法。参数exc_type, exc_value, traceback分别表示异常类型、异常值和调用栈。如果没有异常发生这三个参数都是None。 如果该方法返回True则表示异常已经被处理不会继续向外传播如果返回False则异常会被重新抛出如果没有异常返回什么都可以。通常在这个方法中释放资源如关闭文件。上下文管理器的种类除了使用类定义上下文管理器Python还提供了contextmanager装饰器在contextlib模块中可以快速创建基于生成器的上下文管理器。这种上下文管理器使用yield语句将函数分成两部分yield之前的部分相当于__enter__之后的部分相当于__exit__。方式1类实现完整控制特点显式定义__enter__和__exit__拥有完整异常处理能力支持状态管理class FileManager:def __init__(self, filename):self.filename filenameself.file Nonedef __enter__(self):print(打开文件...)self.file open(self.filename)return self.file # 返回资源对象def __exit__(self, exc_type, exc_val, exc_tb):print(关闭文件...)if self.file:self.file.close()# 处理异常返回True则阻止异常传播if exc_type:print(f发生异常: {exc_type})return False # 不屏蔽异常# 使用示例with FileManager(test.txt, w) asf:f.write(Hello Context!)# 即使发生异常文件也会关闭# 触发异常测试: 1/0print(操作完成)f是返回的资源名称可任意取f.write是该资源自己拥有的方法。方式2生成器实现简洁方案特点使用contextlib.contextmanager装饰器用yield分隔资源获取/释放代码更简洁例1from contextlib import contextmanagercontextmanagerdef file_manager(filename, mode):try:print(打开文件...)f open(filename, mode)yield f# 返回资源except Exception as e:print(f发生异常: {type(e).__name__})finally:print(关闭文件...)f.close()# 使用示例with file_manager(test.txt, a) as f:f.write(\nAppend content)# 触发异常测试: int(abc)# 传统方式易出错file open(data.txt)try:data file.read()# 若此处抛出异常file.close() 可能不被执行finally:file.close()# 必须手动确保关闭装饰器实现的上下文管理与普通的 try...except...finally 语句相比核心优势在于代码复用性、可读性和扩展性尤其更符合 “关注点分离” 的设计原则。以下从具体场景对比两者的优势普通 try...except 需要在每次使用资源时重复编写 “获取 - 清理” 逻辑而装饰器实现的上下文管理可以将这部分逻辑封装成通用工具在多个地方复用。普通 try...except 会将 “业务逻辑” 和 “资源管理逻辑” 混在一起而上下文管理通过 with 语句清晰分离两者让代码意图更明确。阅读代码时无需关注 “连接如何创建 / 关闭”“异常如何处理”只需聚焦 with 块内的核心业务逻辑降低理解成本。普通 try...except 依赖开发者手动编写 finally 块来释放资源容易因疏忽导致资源泄漏如忘记写 f.close()而上下文管理通过装饰器强制封装了清理逻辑无论开发者是否记得资源都会被自动释放。上下文管理通过装饰器的 finally 块或类实现的 __exit__强制执行清理操作从机制上避免了人为遗漏尤其适合团队协作确保所有人都遵循资源管理规范。装饰器实现的上下文管理可以轻松扩展支持嵌套、组合等复杂场景而普通 try...except 嵌套会导致代码臃肿“金字塔问题”。维度装饰器上下文管理普通try...except代码复用一次封装多处复用每次使用需重复编写资源管理逻辑可读性分离业务逻辑与资源管理意图明确逻辑混杂需通读代码才能理解意图资源安全强制自动释放避免人为失误依赖手动编写 finally易遗漏复杂场景支持简洁支持嵌套、组合等场景嵌套层级深代码臃肿例2from contextlib import contextmanagercontextmanagerdef session_scope():# 创建新的数据库会话相当于 __enter__ 方法session SessionLocal()try:# 将会话传递给 with 代码块使用yield session# 暂停执行将会话对象传递给 with 块# 代码块无异常时提交事务yield 之后的部分相当于 __exit__ 中的正常退出逻辑session.commit()except:# 发生异常时回滚事务session.rollback()# 重新抛出异常raisefinally:# 始终关闭会话释放连接相当于 __exit__ 中的清理逻辑session.close()with语句用法with 语句对资源的类型没有限制只要上下文管理器的 __enter__ 方法或装饰器中的 yield 语句返回的是一个合法对象就可以作为资源变量。这个对象可以是基础类型如文件对象、整数容器类型如列表、字典可调用对象如函数、类实例方法自定义类实例等。当资源变量是函数时它的作用通常是在 with 块内提供与当前上下文相关的操作如示例中打印临时目录信息同时享受上下文管理器的资源自动管理能力with类名参数/函数名参数as 变量:代码块# 等价于manager 上下文管理器()变量 manager.__enter__()try:代码块finally:manager.__exit__(异常信息)类名参数/函数名参数上面已经介绍了就是上下文管理器的2种方式那么后面这个as 有什么作用呢as关键字的使用场景情况是否使用as说明需要访问管理器返回值必须使用当 __enter__() 返回的值需要在代码块中使用时仅需资源管理可省略不需要使用管理器返回值时当需要直接操作上下文管理器返回的资源对象时# 文件操作需要文件对象进行读写with open(test.txt, w) asfile: # as 接收 open() 返回的文件对象file.write(Hello, World!) # 操作文件对象# 退出 with 后文件自动关闭当只需确保资源清理不需要操作管理器返回值时比如锁操作# 锁操作只需确保锁被释放无需直接操作锁对象import threadinglock threading.Lock()with lock: # 不需要 as因为不需要操作锁对象print(临界区代码执行中)# 退出 with 后锁自动释放class Timer:def __enter__(self):self.start time.time()def __exit__(self, *args):elapsed time.time() - self.startprint(f代码块耗时: {elapsed:.2f}秒)with Timer(): # 不需要 as因为不关心返回值time.sleep(1.5) # 模拟耗时操作输出代码块耗时: 1.50秒2. 异常处理更健壮问题解决在 __exit__() 中可统一处理异常如回滚事务、日志记录。原理__exit__() 接收异常信息可通过返回 True 抑制异常。class DatabaseTransaction:def __enter__(self):self.conn sqlite3.connect(db.db)return self.conn.cursor()def __exit__(self, exc_type, exc_val, exc_tb):if exc_type:# 发生异常时回滚self.conn.rollback()else:# 否则提交self.conn.commit()self.conn.close()with DatabaseTransaction() as cursor:cursor.execute(DELETE FROM users)# 若此处失败自动回滚

相关新闻

产品运营方法论:从0到1搭建增长体系

产品运营方法论:从0到1搭建增长体系

产品运营方法论本文将从用户增长、留存优化、商业化三个维度,系统阐述产品运营的核心框架。一、用户增长增长的核心在于找到产品与市场的契合点(PMF),并通过数据驱动的方式持续优化获客漏斗。二、留存优化留存是增长的基石。通过构…

2026/7/23 7:43:59 阅读更多 →
深入解析TI N2HET定时器:RISC架构与VLIW指令实现高精度时序控制

深入解析TI N2HET定时器:RISC架构与VLIW指令实现高精度时序控制

1. 项目概述:为什么我们需要一个“会编程”的定时器?在嵌入式系统,尤其是工业控制、汽车电子和高端消费电子领域,我们常常需要处理一些对时间极其敏感的任务。比如,控制一个无刷直流电机的换相,其精度要求通…

2026/7/23 7:43:59 阅读更多 →
探索密封胶新选择:单组分硅酮免垫密封胶哪家更值得信赖?

探索密封胶新选择:单组分硅酮免垫密封胶哪家更值得信赖?

引言在工业和汽车制造领域,密封胶是确保设备和零部件可靠运行的关键材料。近年来,随着技术的进步,单组分硅酮免垫密封胶因其优异的性能和便捷的使用方式,逐渐成为市场上的新宠。本文将深入探讨单组分硅酮免垫密封胶的技术特点、应…

2026/7/23 7:42:58 阅读更多 →

最新新闻

Unity毕业设计实战指南:从敏捷开发到论文撰写的全流程解析

Unity毕业设计实战指南:从敏捷开发到论文撰写的全流程解析

1. 项目概述:为什么Unity毕业设计需要一份实战指南? 又到了一年一度的毕业季,对于计算机、数字媒体技术、游戏设计等相关专业的同学来说,用Unity引擎完成一个毕业设计项目,几乎是很多人的首选。它上手快、资源多、效果…

2026/7/23 10:19:56 阅读更多 →
告别广告!用R2S软路由+OpenWrt编译一个属于自己的纯净固件(保姆级教程)

告别广告!用R2S软路由+OpenWrt编译一个属于自己的纯净固件(保姆级教程)

打造无广告家庭网络:R2S软路由OpenWrt编译全指南 为什么我们需要一台定制化的软路由? 每次打开视频网站前的90秒广告,浏览网页时不断弹出的悬浮窗,甚至智能电视开机时的强制播放——这些数字时代的"牛皮癣"正在消耗我们宝贵的注意力和时间。传统路由器厂商提供…

2026/7/23 10:19:56 阅读更多 →
京呈GB3731cdn硒鼓:高印量兼容耗材解析与使用指南

京呈GB3731cdn硒鼓:高印量兼容耗材解析与使用指南

1. 京呈GB3731cdn四色套装硒鼓产品解析 作为一款专为立思达LANXUM彩色激光打印机设计的兼容耗材,京呈GB3731cdn系列硒鼓粉盒在办公打印领域引起了广泛关注。这款产品标榜的"高印量、高稳定、原装级输出品质"三大特性,恰好击中了中小企业文印成…

2026/7/23 10:19:56 阅读更多 →
告别“报销跑断腿”:高校财务业务管理系统的破局之道

告别“报销跑断腿”:高校财务业务管理系统的破局之道

每到年底,高校财务处门口排起的长队,几乎是每所大学雷打不动的“景观”。老师们抱着一摞摞单据焦急等待,工作人员被手工记账和重复录入压得喘不过气。一笔科研经费的报销,从整理凭证到财务审批再到最终到账,折腾半个月…

2026/7/23 10:19:56 阅读更多 →
阿里云国际代理商:手把手教你解决 Windows 云服务器远程连接难题

阿里云国际代理商:手把手教你解决 Windows 云服务器远程连接难题

在日常运维工作中,许多企业使用 Windows 云服务器来部署后台管理系统、AI 可视化工具以及 Hermes Agent 可视化面板。然而,不少运维人员常常遇到远程桌面无法连接、登录时出现错误提示,或是忘记密码导致无法远程访问等问题。经过分析&#xf…

2026/7/23 10:19:56 阅读更多 →
VMware虚拟机CPUID修改指南与应用场景解析

VMware虚拟机CPUID修改指南与应用场景解析

1. VMware虚拟机CPUID修改的核心价值与应用场景 在虚拟化技术领域,CPUID作为x86架构处理器的重要指令集,能够返回CPU的详细特征信息。对于VMware虚拟机用户而言,修改CPUID参数主要服务于三大核心需求: 首先是软件兼容性测试。当开…

2026/7/23 10:18:56 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻