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

[python]上下文管理contextlib模块与with语句

文章目录

    • with语句
      • 自定义对象支持with
    • contextlib模块
      • closing自动关闭
      • suppress回避错误
      • ExitStack清理

Python 中的 with 语句用于清理工作,封装了 try…except…finally编码范式,提高了易用性。

with语句

with语句有助于简化资源管理:

# 离开作用域时,自动关闭文件
with open('hello.txt', 'w') as f:f.write('hello, world!')

自定义对象支持with

类只要实现上下文管理器,就可获得with支持:

  • 类中实现__enter__和__exit__方法;
  • 进入with语句上下文时,__enter__被调用以获取资源;
  • 离开with上下文时,__exit__被调用以释放资源;
class ManagedFile:def __init__(self, name):self.name = namedef __enter__(self):self.file = open(self.name, 'w')return self.filedef __exit__(self, exc_type, exc_val, exc_tb):if self.file:self.file.close()

contextlib模块

使用contextlib.contextmanager装饰器能够使函数(生成器)自动支持with语句:

  • 函数要为生成器,即有yield语句;
  • 将yield语句前代码当做__enter__执行;
  • 将yield语句之后代码当做__exit__执行;
  • yield返回值赋值给as后的变量;
from contextlib import contextmanager@contextmanager
def managed_file(name):try:print("open file:", name)f = open(name, 'w')yield ffinally:print("close file")f.close()with managed_file(r'D:\temp\hello.txt') as f:print("write file")f.write('hello world!')        

closing自动关闭

closing装饰器封装有close的类,在离开with作用域时自动调用close方法:

from contextlib import closing
from urllib.request import urlopenwith closing(urlopen("http://www.baidu.com")) as page:# get the page

suppress回避错误

suppress(*exceptions)可以禁止任意数目的异常:

# 文件不存在,也不会抛出异常
with suppress(FileNotFoundError):os.remove('somefile.tmp')

ExitStack清理

ExitStack可组合多个清理器,通过向栈中添加清理回调(enter_context),在离开with时统一清理:

# 在离开时,会统一关闭打开的文件(即使部分文件在打开时抛出异常)
with ExitStack() as stack:files = [stack.enter_context(open(fname)) for fname in filenames]
http://www.lryc.cn/news/43834.html

相关文章:

  • STM32之TIM编码器接口
  • b站第一,Python自动化测试实战详细教学,3天教你学会自动化测试
  • 刷题记录:P8804 [蓝桥杯 2022 国 B] 故障 条件概率
  • 【算法】常用的基础数论
  • 云原生场景下的容器网络隔离技术
  • 用python绘制有向图
  • Spring MongoDB 开发教程(一)—官方原版
  • 数据结构——二叉搜索树
  • 23年5月高项学习笔记3---项目管理概述
  • 【组织架构】中国铁路成都局集团有限公司
  • 剧前爆米花--爪哇岛寻宝】java多线程案例——单例模式、阻塞队列及生产者消费者模型、定时器、线程池
  • Guitar Pro8中文版更新说明及系统要求介绍
  • 【id:19】【20分】A. 三数论大小(引用)
  • To_Heart—总结——FWT(快速沃尔什变换)
  • Google巨大漏洞让Win10、11翻车,小姐姐马赛克白打了
  • 腾讯云服务器部署内网穿透(让其他人在不同ip可以访问我们localhost端口的主机项目)(nps开源项目)
  • IDS、恶意软件、免杀技术、反病毒技术、APT、对称加密、非对称加密以及SSL的工作过程的技术介绍
  • 怎么把pdf转换成高清图片
  • MATLAB 系统辨识 + PID 自动调参
  • 【vue3】组合式API之setup()介绍与reactive()函数的使用·上
  • 爬虫Day3 csv和bs4
  • nnAudio的简单介绍
  • 【id:134】【20分】B. 求最大值最小值(引用)
  • Java 面向对象
  • 五、传输层
  • Thinkphp 6.0一对一关联查询
  • 基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路
  • 算法详解-双指针算法的魅力-一种简单而高效的编程思想
  • 网页审查元素
  • gpt2 adapter finetune