尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
聊聊Python中的上下文管理器:with语句背后的秘密
用Python的人对with open()肯定不陌生。但你知道with语句背后是怎么工作的吗这篇文章用最短的篇幅讲清楚。上下文管理器是什么简单说上下文管理器就是实现了__enter__和__exit__两个方法的对象。pythonclass MyContext: def __enter__(self): print(进入上下文) return self def __exit__(self, exc_type, exc_val, exc_tb): print(退出上下文) return False # False表示不屏蔽异常 with MyContext() as ctx: print(执行代码) # 输出 # 进入上下文 # 执行代码 # 退出上下文为什么需要它最常见的场景是资源管理——文件、数据库连接、锁等用完后需要释放或关闭。python# 不用with手动管理 f open(file.txt, r) try: data f.read() finally: f.close() # 用with自动管理 with open(file.txt, r) as f: data f.read() # 文件自动关闭contextlib模块的便捷方式用contextmanager装饰器可以把一个函数变成上下文管理器pythonfrom contextlib import contextmanager contextmanager def timer(): import time start time.perf_counter() try: yield finally: elapsed time.perf_counter() - start print(f耗时: {elapsed:.3f}秒) with timer(): # 执行你想计时的代码 sum(range(1000000)) # 输出: 耗时: 0.023秒实际应用场景数据库事务pythoncontextmanager def transaction(conn): try: yield conn conn.commit() except Exception: conn.rollback() raise with transaction(db_conn) as conn: conn.execute(INSERT INTO users ...)临时切换目录pythoncontextmanager def chdir(path): import os old_cwd os.getcwd() os.chdir(path) try: yield finally: os.chdir(old_cwd) with chdir(/tmp): # 在/tmp目录下执行操作 os.listdir(.)小结上下文管理器的本质就是自动化的try/finally。它让资源管理变得优雅避免了忘记释放资源导致的泄露问题。如果你在写一个需要获取-使用-释放的组件考虑用上下文管理器封装一下会让调用者的代码干净很多。
RELATED

相关推荐

C++面向对象编程:从类与对象到封装与内存布局

C++面向对象编程:从类与对象到封装与内存布局

1. 从“过程”到“对象”:为什么我们需要类和对象?如果你是从C语言或者纯过程式编程转过来的,第一次接触“类”和“对象”这两个词,可能会觉得有点抽象,甚至觉得有点“多此一举”。毕竟,用结构体&#xff0…

📅 2026/8/9 3:33:58
Ubuntu主机间Samba文件共享配置指南

Ubuntu主机间Samba文件共享配置指南

1. 项目概述两台Ubuntu主机之间的文件共享是日常开发和运维中的常见需求。相比传统的FTP或SCP方式,Samba协议提供了更接近Windows文件共享的体验,支持权限管理、断点续传等实用功能。本文将详细介绍如何在两台Ubuntu 20.04 LTS主机间建立稳定的Samba共享…

📅 2026/7/31 23:29:15
AI与XR技术融合:核心架构与工业实践

AI与XR技术融合:核心架构与工业实践

1. AI与XR技术融合的核心价值 在XR(扩展现实)领域摸爬滚打多年,我亲眼见证了AI技术如何彻底改变了VR/AR开发的面貌。记得2016年做第一个VR项目时,手势识别需要手动标注上千张深度图,而现在只需几行代码调用预训练模型就…

📅 2026/7/29 4:32:13
MORE NEWS

更多资讯

📰

Vue3自定义Tabs组件实现与翻页交互优化

1. 项目概述:自定义Tabs组件的翻页交互设计在前端开发中,Tabs(标签页)组件是最常用的UI控件之一。当标签数量超出容器宽度时,传统的滚动条方案既不美观也不符合移动端交互习惯。我最近在Vue3项目中实现了一个带翻页按钮…

📰

10 分钟实战 OpenMetadata:把散落各处的表变成可搜索的数据目录

10 分钟实战 OpenMetadata:把散落各处的表变成可搜索的数据目录 【免费下载链接】OpenMetadata The Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistant…

📰

Vue3+Three.js轻量级VR博物馆前端架构

简介:本资源是一套基于three.js与Vue3开发的VR掌上博物馆完整前端源码,面向Web三维可视化开发者、前端进阶学习者及数字文博项目实践者,解决轻量级Web端3D展馆快速搭建与交互实现问题。压缩包共381个文件,包含99个OBJ三维模型&…

📰

Cherry Studio 代码规范精讲:函数早退(Early Return)与无效计算消除

Cherry Studio 代码规范精讲:函数早退(Early Return)与无效计算消除 【免费下载链接】cherry-studio AI productivity studio with smart chat, autonomous agents, and 300 assistants. Unified access to frontier LLMs 项目地址: https:…

📰

PHP成绩管理系统源码实战:从表设计到统计部署

简介:这套PHP成绩管理系统源码面向学校、教育机构及PHP学习者,解决学生分数录入、统计分析与按条件查询的需求。系统基于PHP与MySQL实现,涵盖学生信息、课程、成绩等数据表设计,提供管理员、教师、学生三级权限管理,包…

📰

LlamaIndex QueryEngineTool 深度指南:将查询引擎封装为 Agent 工具的完整实战

LlamaIndex QueryEngineTool 深度指南:将查询引擎封装为 Agent 工具的完整实战 【免费下载链接】llama_index LlamaIndex is the document processing platform for AI 项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index 导读 本指南以 LlamaI…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬