当前位置: 首页 > backend >正文

Python---上下文管理器

目录

上下文管理器

✅ 上下文管理器的作用

自定义实现一个上下文管理器

🔍 参数详解:__exit__ 的三个参数

🧠 控制异常传播

🧰 常用模块与工具

✅ 小结


上下文管理器

上下文管理器(Context Manager) 是一种用于简化资源管理的机制,最常用于处理文件、网络连接、数据库连接等需要“打开”和“关闭”的操作。上下文管理器通过 with 语句来使用,确保资源在使用完毕后被正确释放,即使在使用过程中发生异常也不会泄露资源。

在任何一门编程语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作。但资源都是有限的,在写程序时,我们必须保证这些资源在使用过后得到释放,不然就容易造成资源泄露,轻者使得系统处理缓慢,重则会使系统崩溃。

✅ 上下文管理器的作用

  • 自动管理资源(如文件、锁、连接等)
  • 确保资源在使用后被释放(如关闭文件、释放锁、断开连接等)
  • 即使代码中抛出异常也能确保清理操作被执行

自定义实现一个上下文管理器

这个方法表示我们正在进入文件操作,这里是放置所有初始化代码的地方

比如打开文件时的所有操作

  • __enter__:在进入 with 语句块时被调用,通常用于初始化资源(如打开文件、获取锁等)。
  • __exit__:在离开 with 语句块时被调用,通常用于清理资源(如关闭文件、释放锁等),即使发生异常也会执行。

🔍 参数详解:__exit__ 的三个参数

参数名

类型

说明

exc_type

type 或 None

异常类型,如 ValueError

exc_val

Exception 或 None

异常实例,如 ValueError("错误信息")

exc_tb

traceback 或 None

异常的堆栈信息对象

  • 如果 with 块中没有异常,这三个参数都是 None
  • 如果有异常发生,这三个参数会包含异常信息。

🧠 控制异常传播

__exit__ 中返回值决定是否抑制异常:

  • 返回 True:表示异常已被处理,不再传播
  • 返回 False 或不返回值:异常会继续向上抛出。

方法名

调用时机

作用

__enter__

进入 with

块前

初始化资源,返回值赋给 as

后的变量

__exit__

离开 with

块时(无论是否异常)

清理资源,可处理异常

🧰 常用模块与工具

  • contextlib:提供创建上下文管理器的工具,如:
    • contextmanager:装饰器创建生成器上下文管理器
    • closing:为没有 __exit__ 的对象添加关闭行为
    • redirect_stdout, redirect_stderr:重定向输出
  • threading.Lock():线程锁可以作为上下文管理器使用
  • decimal.localcontext():用于临时修改 decimal 的上下文精度

✅ 小结

特性

说明

上下文管理器

管理资源生命周期

使用 with

语句

简洁安全

实现方式

类(__enter__

/ __exit__

)或 @contextmanager

异常处理

__exit__

可以捕获并处理异常

推荐标准库模块

contextlib

提供了许多实用工具

http://www.xdnf.cn/news/15355.html

相关文章:

  • 移动端设备本地部署大语言模型(LLM)
  • 无需付费即可利用AI消除音频噪声和生成字幕
  • 浏览器渲染原理与性能优化全解析
  • 【零基础入门unity游戏开发——unity3D篇】3D光源之——unity反射和反射探针技术
  • 在线事务处理OLTP(Online Transaction Processing)负载是什么?
  • 08.如何正确关闭文件
  • QML 自定义Model基础之QAbstractListModel
  • iw 命令 -- linux 无线管理
  • python kivy 打包apk
  • Ampace厦门新能安科技Verify 测评演绎数字推理及四色测评考点分析、SHL真题题库
  • 入职华为od一个月的感受
  • 用 Node.js 构建模块化的 CLI 脚手架工具,从 GitHub 下载远程模板
  • 【Vue】浏览器缓存 sessionStorage、localStorage、Cookie
  • 初级网安作业笔记1
  • 人工智能之数学基础:神经网络的矩阵参数求导
  • S7-1200 与 ET200SP:PROFINET 设备关键数据 IP 地址、MAC 地址及 MRP 环状态获取
  • Spring Boot RESTful API 设计指南:查询接口规范与最佳实践
  • 在新版本的微信开发者工具中使用npm包
  • java8 ConcurrentHashMap 桶级别锁实现机制
  • css如何同时给元素设置背景和背景图?
  • 004_Claude功能特性与API使用
  • 垃圾收集器-Serial Old
  • Java_Springboot技术框架讲解部分(二)
  • 飞算JavaAI:开启 Java 开发 “人机协作” 新纪元
  • PyTorch武侠演义 第一卷:初入江湖 第3章:神经网络派的绝世武功
  • 全星质量管理QMS软件系统——汽车零部件制造业数字化转型的质量管理中枢
  • Mybatis 两级缓存可能导致的问题
  • 如何成为 PostgreSQL 中级专家
  • 算法学习笔记:18.拉斯维加斯算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • IT岗位任职资格体系及发展通道-产品经理岗位任职标准参考