with语句的语法为:
with 表达式 [ as 目标]:
代码块
with语句可以在代码块执行完毕之后还原进入代码块时的现场。包含with语句的代码块的执行过程如下:
- 计算表达式的值,返回一个上下文管理器对象
- 加载上下文管理器对象的__exit__()方法以备后用
- 调用上下文管理器对象的__enter__()方法
- 如果with语句中设置了目标对象,则将__enter__()方法的返回值赋值给目标对象
- 执行with中的代码块
- 如果步骤5中代码块正常结束,调用上下文管理器对象的__exit__()方法,其返回值直接忽略
- 如果步骤5中代码执行过程中发生异常,调用上下文管理器对象的__exit__()方法,并将异常类型、值及trackback信息作为参数传递给__exit__()方法。如果__exit__()返回值为false,则异常会被重新抛出;如果返回值为true,异常被挂起,程序继续执行
上下文管理器是这样的一个对象:它定义程序运行时需要建立的上下文,处理程序的进入和退出,实现了上下文管理协议,即在对象中定义__enter()__和__exit()__方法。其中:
- __enter()__:进入运行时的上下文,返回运行时上下文相关对象,with语句中会将这个返回值绑定到目标对象
- __exit()__:推出运行时的上下文,定义在块执行(或终止)之后上下文管理器应该做什么。它可以处理异常、清理现场或者处理with块中语句执行完成之后需要处理的动作