Python上下文管理器的高级使用
在文件处理和网络编程时,对于打开的文件不管最后内容处理是否符合预期都要在结束时关闭文件。这时常见的处理方法是try catch finally
的方法
使用错误捕获的方法有效的避免了文件打开没有关闭的情况。实现同样的功能有一种更加优雅的方法,那就是with
关键字。
with 语法介绍:
上下文管理器(context manager)是 Python2.5 开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用。它的语法形式是 with…as…,主要应用场景资源的创建和释放。例如,文件就支持上下文管理器,可以确保完成文件读写后关闭文件句柄。
简单示例如下:
使用with就可以不用写冗长的try catch finally等处理流程,而且文件一定是安全打开和关闭。with之所以能做到是因为open对象中有打开文件的方法__enter__
和关闭文件的方法__exit__
,在执行到print之前with调用了__enter__
方法,执行完print之后with调用了__exit__
方法。并且不管打开文件之后是否会出错,with最终都会调用__eixt__
方法。所以文件一定能安全关闭。
1|0with 使用
一个对象想要支持with这种优雅的方法来管理,需要实现__enter__
和__exit__
两个方法。根据with是否有返回,可以分成两个类型。
- 没有返回值,如
with open("demo.txt")
; - 有返回值,如
with open("demo.txt") as f
;
1|1没有返回值
1|2有返回值
with 的返回值实际上就是__enter__
中return的结果。有return就有返回值,没有return就没有返回值
2|0contextlib
contextlib是一个上下文管理器工具,工具中有一个contextmanager,可以将一个函数变成一个装饰器,用来支持with关键字。
通俗来说就是如果一个函数想要支持with就需要有__enter__
和__exit__
这两个方法。而contextmanager
就可以将函数变成这样一个函数。
依然根据with是否有返回值,区分两中使用方法
2|1不带返回值
函数中通过yield将函数分成三个部分:yield之前代码、yield之后代码、yield;
执行的流程也是三个步骤:
with manager_fun
with 进入时执行yield之前的代码部分print("enter")
- 遇到yield中断,然后执行
print("我就是with中的操作")
- 最后返回到yield后面,执行
print("exit")
传统上下文管理器需要实现的__enter__
和__exit__
在contextlib中对应的就是:yield之前代码就是__enter__
,yield代码之后就是__exit__
2|2带返回值
with 可以有返回值,如果想实现返回值,在传统上下文管理器中是__enter__
函数的返回值就是with的返回值,在contextlib中就是yield的返回值。
yield 返回一个值,然后程序中断暂停在这里。返回的值就是with的返回值。(听起来有点绕口)
2|3contextlib 使用场景
有些场景下想要使用with来管理对象,但是目标对象并不支持,这时就可以通过contextlib来包装一个上下文管理器,达到管理资源的目的
__EOF__

本文链接:https://www.cnblogs.com/goldsunshine/p/16335854.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2019-06-01 Open vSwitch系列之一 Open vSwitch诞生