千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:南京千锋IT培训  >  技术干货  >  python的上下文管理器

python的上下文管理器

来源:千锋教育
发布人:xqq
时间: 2023-11-11 12:32:51

首先,我们来看一下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相关知识,请关注IT培训机构:千锋教育。http://www.mobiletrain.org/

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

python根据键值(value)返回键(key)

2023-11-14

Python中if嵌套是什么?

2023-11-14

Python使用平面文件进行存储

2023-11-14

最新文章NEW

python中pickle模块是什么?

2023-11-14

python解析json文件方法

2023-11-14

pythonSelenium操作Cookie的方法

2023-11-14

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>