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

python with 语法

Python with 语法详解

with 语句是 Python 中用于资源管理的语法糖,核心作用是自动管理资源的创建与释放(如文件、网络连接、锁等),避免因异常或逻辑错误导致资源泄漏。

1. 基本语法结构
with 上下文管理器 as 变量:# 执行代码块...
  • 上下文管理器:实现了 __enter__()__exit__() 方法的对象(如文件对象、contextlib 中的工具类)。
  • __enter__():进入 with 代码块时执行,返回的对象会被赋值给 as 后的变量。
  • __exit__():离开 with 代码块时执行(无论是否发生异常),用于释放资源。
2. 典型应用场景:文件操作
# 传统方式(需手动关闭文件)
f = open("example.txt", "r")
try:content = f.read()
finally:f.close()# with 简化后
with open("example.txt", "r") as f:content = f.read()
  • 优势:无需手动调用 f.close(),即使代码块中发生异常,文件也会被自动关闭。
3. 自定义上下文管理器

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

class MyContext:def __enter__(self):print("进入上下文")return "资源对象"  # 赋值给 as 后的变量def __exit__(self, exc_type, exc_val, exc_tb):print("离开上下文,释放资源")# 处理异常(若返回 True,异常会被压制;返回 False 则向外抛出)return Falsewith MyContext() as res:print(f"使用资源:{res}")

执行结果:

进入上下文
使用资源:资源对象
离开上下文,释放资源
4. contextlib 模块的便捷工具

Python 标准库 contextlib 提供了更灵活的上下文管理工具:

  • @contextmanager 装饰器:通过生成器简化上下文管理器的创建:

    from contextlib import contextmanager@contextmanager
    def my_context():print("进入")yield "资源"  # 相当于 __enter__ 的返回值print("退出")with my_context() as res:print(f"使用{res}")
    
  • closing:将不支持 with 的对象转换为上下文管理器:

    from contextlib import closing
    from urllib.request import urlopenwith closing(urlopen("https://www.python.org")) as page:content = page.read()
    
5. 处理多资源管理

可同时管理多个资源,用逗号分隔即可:

with open("file1.txt", "r") as f1, open("file2.txt", "w") as f2:f2.write(f1.read())
6. 异常处理

with 代码块中发生异常时,__exit__ 会接收异常信息(exc_type, exc_val, exc_tb),可在其中决定是否捕获异常:

class ErrorHandlingContext:def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):if exc_type:print(f"捕获异常:{exc_val}")return True  # 压制异常,不向外抛出with ErrorHandlingContext():raise ValueError("测试异常")

执行后仅打印“捕获异常:测试异常”,不会终止程序。

with 语法的核心价值是简化资源管理逻辑,保证资源的可靠释放,是 Python 中编写健壮代码的重要工具。

http://www.dtcms.com/a/525125.html

相关文章:

  • tlv32aic32 外部DAC的I2S音频流运行过程分析
  • I/V自动曲线量测仪的主要功能、测量方法和应用
  • 什么是电子负载?爱科赛博电子负载应用探讨
  • 2025.10.24总结
  • 邯郸哪里做网站优化thinkphp企业网站源码
  • BUYCOIN:以社区共治重构加密交易版图,定义交易所3.0时代
  • 建立平台网站需要花多少钱国贸附近网站建设
  • 【Linux C/C++开发】epoll模式的开源库及原生socket实现
  • ARP 报文和 IP 数据报的 区分与联系
  • html网站开发目标临沂做网站多少钱
  • 代谢组学之新手入门级知识概览
  • 开关电源拓扑工程宝典:从原理到实战的深度设计指南
  • 深度学习SE,CBAM,ECA,SimAM模块汇总之SE
  • 10. Python 列表:从单元素更新到切片批量处理
  • 气凝胶基复合相变材料研究进展
  • 天门市网站建设seowordpress小说插件
  • 哪个网站的织梦源码好品牌的网站建设
  • 卷积核权重优化
  • iftop排查带宽问题
  • uniapp开发微信小程序使用物流服务的查询组件展示订单物流信息,以及使用中会遇到的问题
  • 天河做网站营销推广公司经营范围
  • wordpress 评论表情插件金沙百度seo优化公司
  • Ubuntu (Linux) 安装Docker
  • 鸿蒙OS 生命周期中调用的函数流程图
  • 宁国建设投资有限公司网站网站开发模合同
  • vue3 confirm倒计时
  • 定制网站与模板建站维护二级网站建设基本情况
  • 流行网站开发工具wordpress主题屋
  • ManiSkill2学习笔记
  • LeetCode:200. 岛屿数量