with语句:
有时为了确保即使在出现错误的情况下也能运行某些代码的清理工作,try...finallly语句可以很方便的解决此问题。tyr...finaly语句有很多使用场景。如:
- 关闭一个文件
- 释放一个锁
- 创建一个临时的代码补丁
- 在特殊环境中运行受保护的代码
而with语句为这些场景下的代码块实现了包装,即便代码块发生了异常,你也可以在其执行前后调用一些代码。例如,处理文件通常采用这种方式:
利用with语句,上述代码可以写为:
在前面的示例中,open的作用是上下文管理器,确保即使出现异常也要在执行完for循环之后关闭文件。
with语句的一般语法和实现:
- 无变量
with context_manger: #代码块 。。。
- 有变量 可以用as子句保存为局部变量
with context_mageger as context: #代码块 。。。
- 多个变量 多个上下文管理器同时使用
with A() as a,B() as b: ...
这中写法等同于嵌套使用:
with A() as a: with B() as b: ...
自定义上下午管理器:
任何实现了上下文管理器协议的对象都可以用作上下文管理器。该协议包含两个特殊方法:
- __enter__(self):
- __exit__(self,exc_type,exc_value,traceback):
简而言之,with语句的执行过程如下:
- 调用__enter__方法,任何返回值都会绑定的as子句
- 执行内部代码块
- 调用__exit__方法
大多数场景中,_exit__方法类似与finally执行一些清理工作
下面是实现了上下文管理协议的示例代码:
未引发异常:
引发异常: