更新时间:2022-08-17 来源:黑马程序员 浏览量:
在前面介绍with语句时,提到了一个非常重要的概念,即上下文管理器。要想使用with语句,前提就是要有上下文管理器。上下文管理器是Python2.5开始支持的一种语法,用于规定某个对象的使用范围,一旦进入或者离开使用范围,会有特殊的操作被调用。
下面来介绍与上下文管理器有关的概念。
1.上下文管理协议
包含_enter_()和_exit_()方法,支持该协议的对象要实现这两个方法。关于这两个方法的介绍如下。
·_enter_(self):进入上下文管理器时调用此方法,其返回值被放入with-as语句中as说明符指定的变量中。
·_exit_(self,type,value,tb):离开上下文管理器调用此方法。如果有出现异常,type、value、tb分别为异常的类型、值和追踪信息;如果没有异常,3个参数均设为None。此方法返回值为True或False,分别指示被引发的异常得到了还是没有得到处理,如果返回False,引发的异常会被传递出上下文。
2.上下文管理器
支持上下文管理协议的对象,用于实现_enter_()和_exit_()方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。
3.运行时上下文
由上下文管理协议的对象,用于实现_enter_()和_exit_()方法实现。
4.上下文表达式
with语句中在关键字with之后的表达式,该表达式要返回一个支持上下文管理协议的对象。
在了解上下文管理器之后,就能很好地理解with语句的整个执行过程了,具体如下:
(1)首先执行上下文表达式,生成一个上下文管理器对象;
(2)调用上下文管理器的_enter_()方法,如果使用了as子句,就把_enter_()方法的返回值赋值给as子句中的资源对象;
(3)执行with语句包裹的代码块;
(4)无论在执行的过程中是否发生异常,都会执行上下文管理器的_exit_()方法。该方法负责执行程序的“清理”工作,如释放资源等;
(5)如果执行过程中没有出现异常,或者代码中执行了break、continue或者return语句,则以None作为参数调用_exit_()方法,如果在执行过程中出现异常,则会使用sys.exc_info得到的异常信息为参数调用_exit_()方法;
(6)出现异常时,如果_exit_()方法返回的结果为False,则会重新抛出异常,让with之外的语句逻辑来处理异常,这是通用做法;如果返回True,则忽略异常,不再对异常进行处理。