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

Python中的`with`语句用法

Python中的with语句用于确保资源的正确获取和释放,尤其在处理需要显式清理的资源(如文件、网络连接等)时非常有用。以下是对其用法的详细解释:


1. with的基本用法

with语句通过上下文管理器(实现__enter____exit__方法的对象)自动管理资源的生命周期。常见场景包括文件操作:

with open('example.txt', 'r') as file:content = file.read()
# 文件自动关闭,无需手动调用 file.close()
工作原理
  • 进入上下文:调用对象的__enter__方法,返回值赋给as后的变量(如file)。
  • 退出上下文:无论是否发生异常,均调用__exit__方法进行清理(如关闭文件)。

2. 自定义上下文管理器

通过定义__enter____exit__方法,可创建自定义上下文管理器类:

class MyResource:def __enter__(self):print("Resource acquired")return self  # 返回实例供`as`绑定def __exit__(self, exc_type, exc_val, exc_tb):print("Resource released")def do_something(self):print("Using resource")with MyResource() as res:res.do_something()

输出

Resource acquired
Using resource
Resource released

3. 异常处理与__exit__

  • __exit__的参数exc_type, exc_val, exc_tb分别表示异常类型、值和追溯信息。
  • __exit__返回True,则抑制异常;返回False则重新抛出异常。
class SuppressContext:def __exit__(self, exc_type, exc_val, exc_tb):print("Suppressing exception")return True  # 抑制所有异常with SuppressContext():raise ValueError("This error is suppressed")

4. 管理多个资源

可同时管理多个上下文管理器,用逗号分隔:

with open('file1.txt') as f1, open('file2.txt') as f2:content1 = f1.read()content2 = f2.read()

5. 注意事项

  • 资源生命周期with块结束后,资源会被立即释放。若需在函数外部使用资源,应避免在函数内部用with返回资源对象。
  • 兼容性:仅适用于实现了__enter____exit__的对象(如文件、数据库连接等)。

6. 示例:数据库连接

import sqlite3with sqlite3.connect('example.db') as conn:cursor = conn.cursor()cursor.execute('SELECT * FROM table')results = cursor.fetchall()
# 连接自动关闭

总结

with语句通过上下文管理器协议简化资源管理,确保资源在使用后被正确释放。它适用于文件操作、网络连接、自定义资源等场景,是编写安全、简洁代码的重要工具。

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

相关文章:

  • Server - 使用 Docker 配置 PyTorch 研发环境
  • [蓝桥杯]三元组中心问题
  • Legal Query RAG(LQ-RAG):一种新的RAG框架用以减少RAG在法律领域的幻觉
  • Mysql避免索引失效
  • Qt 中实现文本截断(ellipsis)的功能。Qt 提供了此方法来处理过长的文本显示问题,例如在界面中限制文本长度并添加省略号(...)
  • Hugging Face 最新开源 SmolVLA 小模型入门教程(一)
  • 时序动作定位任务thumos14数据集标注文件处理
  • 【统计方法】蒙特卡洛
  • AT2401C中科微2.4g芯片PA
  • Starrocks中RoaringBitmap杂谈
  • 48V带极性反接保护-差共模浪涌防护方案
  • 5分钟了解JVM运行时数据区域
  • 【TCP/IP和OSI模型以及区别——理论汇总】
  • Vue2生命周期函数解析与应用
  • 项目练习:Vue2中el-button上的@click事件失效
  • 农业植保无人机核心技术从理论到实现
  • 无相关标签的精确零镜头密集检索
  • 60天python训练计划----day44
  • 理解网络协议
  • PX4 + D435i 进行gazebo仿真
  • Odoo 18 定期发送电子邮件报告(如KPI)配置指南
  • 力扣热题100之二叉树的直径
  • EMCC 13c 报错 “Metrics Global Cache Blocks Lost is at XXX“ 解决
  • TiDB单机生产环境下离线安装
  • 【Linux 】centos8搭建nextcloud全过程
  • 航芯MCU使用IAR+Jlink调试
  • C++算法训练营 Day8 字符串(1)
  • C++ 类一
  • 笔记 | docker构建失败
  • 乡村三维建模 | 江苏农田无人机建模案例