with语句

with语句的语法为:

 with 表达式 [ as 目标]:
   代码块

with语句可以在代码块执行完毕之后还原进入代码块时的现场。包含with语句的代码块的执行过程如下:

  1. 计算表达式的值,返回一个上下文管理器对象
  2. 加载上下文管理器对象的__exit__()方法以备后用
  3. 调用上下文管理器对象的__enter__()方法
  4. 如果with语句中设置了目标对象,则将__enter__()方法的返回值赋值给目标对象
  5. 执行with中的代码块
  6. 如果步骤5中代码块正常结束,调用上下文管理器对象的__exit__()方法,其返回值直接忽略
  7. 如果步骤5中代码执行过程中发生异常,调用上下文管理器对象的__exit__()方法,并将异常类型、值及trackback信息作为参数传递给__exit__()方法。如果__exit__()返回值为false,则异常会被重新抛出;如果返回值为true,异常被挂起,程序继续执行

上下文管理器是这样的一个对象:它定义程序运行时需要建立的上下文,处理程序的进入和退出,实现了上下文管理协议,即在对象中定义__enter()__和__exit()__方法。其中:

  • __enter()__:进入运行时的上下文,返回运行时上下文相关对象,with语句中会将这个返回值绑定到目标对象
  • __exit()__:推出运行时的上下文,定义在块执行(或终止)之后上下文管理器应该做什么。它可以处理异常、清理现场或者处理with块中语句执行完成之后需要处理的动作
本站访客数人次 本文总阅读量