with语句的目的是简化try/finally的使用,保证代码运行完后执行某项操作,即使出现了异常或者其他语句而退出
上下文管理器协议包含 enter 和 exit 两个方法。with 语句开始运行时,会在 上下文管理器对象上调用 enter 方法。with 语句运行结束后,会在上下文管理器对 象上调用 exit 方法,以此扮演 finally 子句的角色。
with open("a.py") as fn:
src = fn.read(5)
任何一个类实现了上述的两个方法,均可以视为一个管理器,__enter__
,__exit__
也可以手动调用,__exit__
接收三个参数,分别是异常类型,异常实例,以及traceback
对象
def __enter__(self):
....
return 'xxxx'
def __exit__(self, exc_type, exc_value, traceback):
if exc_type is ZeroDivisionError:
print('Please DO NOT divide by zero!')
return True