首页 / 知识
python的上下文管理器
2023-11-12 13:39:00
首先,我们来看一下with的语法格式:
withcontext_expression[astarget(s)]:with-body
with语法非常简单,我们只需要with一个表达式,然后就可以执行自定义的业务逻辑。
但是,with后面的表达式是可以任意写的吗?
答案是否定的。要想使用with语法块,with后面的的对象需要实现「上下文管理器协议」。
什么是「上下文管理器协议」?
一个类在Python中,只要实现以下方法,就实现了「上下文管理器协议」:
__enter__:在进入with语法块之前调用,返回值会赋值给with的target
__exit__:在退出with语法块时调用,一般用作异常处理
我们来看实现了这2个方法的例子:
classTestContext:def__enter__(self):print('__enter__')return1def__exit__(self,exc_type,exc_value,exc_tb):print('exc_type:%s'%exc_type)print('exc_value:%s'%exc_value)print('exc_tb:%s'%exc_tb)withTestContext()ast:print('t:%s'%t)#Output:#__enter__#t:1#exc_type:None#exc_value:None#exc_tb:None
在这个例子中,我们定义了TestContext类,它分别实现了__enter__和exit方法。
这样一来,我们就可以把TestContext当做一个「上下文管理器」来使用,也就是通过withTestContext()ast方式来执行。
从输出结果我们可以看到,具体的执行流程如下:
__enter__在进入with语句块之前被调用,这个方法的返回值赋给了with后的t变量
__exit__在执行完with语句块之后被调用
如果在with语句块内发生了异常,那么__exit__方法可以拿到关于异常的详细信息:
exc_type:异常类型
exc_value:异常对象
exc_tb:异常堆栈信息
我们来看一个发生异常的例子,观察__exit__方法拿到的异常信息是怎样的:
withTestContext()ast:#这里会发生异常a=1/0print('t:%s'%t)#Output:#__enter__#exc_type:#exc_value:integerdivisionormodulobyzero#exc_tb:#Traceback(mostrecentcalllast):#File"base.py",line16,in#a=1/0#ZeroDivisionError:integerdivisionormodulobyzero
从输出结果我们可以看到,当with语法块内发生异常后,__exit__输出了这个异常的详细信息,其中包括异常类型、异常对象、异常堆栈。
如果我们需要对异常做特殊处理,就可以在这个方法中实现自定义逻辑。
回到最开始我们讲的,使用with读取文件的例子。之所以with能够自动关闭文件资源,就是因为内置的文件对象实现了「上下文管理器协议」,这个文件对象的__enter__方法返回了文件句柄,并且在__exit__中实现了文件资源的关闭,另外,当with语法块内有异常发生时,会抛出异常给调用者。
伪代码可以这么写:
classFile:def__enter__(self):returnfile_objdef__exit__(self,exc_type,exc_value,exc_tb):#with退出时释放文件资源file_obj.close()#如果with内有异常发生抛出异常ifexc_typeisnotNone:raiseexception
这里我们小结一下,通过对with的学习,我们了解到,with非常适合用需要对于上下文处理的场景,例如操作文件、Socket,这些场景都需要在执行完业务逻辑后,释放资源。
以上内容为大家介绍了python的上下文管理器,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
Python实现批量文件的压缩处理
Python实现批量文件的压缩处理,项目,信息,分析,数据,软件,培训,文件夹,文件,源文件,目标,一、前言接到项目求助,需要对上千个文件夹中的文件进Python 3.6 中针对文件系统的神奇
Python 3.6 中针对文件系统的神奇方法,数字,代码,数据,标准,信息,培训,首次,工作,文件名,常数,Python3.6首次发布于2016年,尽管它已经发布了很为何你的Python代码应是扁平与稀疏
为何你的Python代码应是扁平与稀疏的,代码,培训,信息,观察,设计,工具,嵌套,闻闻,程序员,沉思,Python之禅之所以得名,正是由于它那简明扼要的规如何提速优化python代码?
如何提速优化python代码?,代码,时间,数据,新增,写法,包装,情况,下来,面临,工作,Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方Python如何在后台自动解压各种压缩
Python如何在后台自动解压各种压缩文件?,代码,综合,工具,分析,检测,培训,文件,文件夹,模块,结尾,一、需求描述编写一个Python程序,每次下载压Python处理文件的几个常用小知识
Python处理文件的几个常用小知识,数据,代码,信息,文件,系统,培训,分析,交通,名称,名字,python这门语言有个很大的用途就是使用它来进行文件处用Python来自动化处理文件
用Python来自动化处理文件,数据,代码,模具,时间,文件,电脑,投入,工具,培训,项目,当代码投入生产时,你需要去组织代码的文件。读写、创建和运行如何让Python代码更易维护
如何让Python代码更易维护,代码,项目,标准,工具,质量,地方,一致,更正,培训,控制权,检查你的代码的质量,通过这些外部库使其更易维护。可读性很Python文件读取相关方法
Python文件读取相关方法,数据,位置,文件,中行,培训,方法,字节,内容,结果,字符串,我们知道,对文件的读取操作需要将文件中的数据加载到内存中,而如何在 python 中打开文件?
如何在 python 中打开文件?,名称,单位,培训,模式,文件,表示,缓存,路径,函数,定义,使用内置函数open就可以打开文件。先来看下python中对openpython文件打开模式
python文件打开模式,观点,数据,文件,权威,管理,系统,名称,资料,培训,模式,我们先来看下在Python、PHP和C语言中打开文件的函数定义Python#PytPython文件操作步骤示例
Python文件操作步骤示例,异常,代码,信息,文件,设计,简介,通用,意外,中级,培训,我们来读取这样一个文本文件:song.txt,该文件的字符编码为utf-8