为了确保即使在出现错误的情况下也能运行某些清理代码,try...finnally语句是很有用的。这一语句有许多使用场景,例如
1)关闭一个文件。
2)释放一个锁。
3)创建一个临时的代码补丁。
4)在特殊环境中运行受保护的代码。
一、with语句使用语法
with语句为这些使用场景下的代码块包装了提供了一种简单方法。即使该代码块引发了异常,你也可以在其执行前后调用一些代码。
语法1:
with context_manager:
#代码块
....
语法2:
with context_manager as context:
#此处as 子句保存为局部变量
....
语法3:
with A() as a, B() as b:
#多个上下文管理器同时使用
....
这种写法等价于嵌套使用,如下所示:
with A() as a:
with B() as b:
.....
二、上下文管理协议
任何实现了上下文管理协议(context manager protocol)的对象都可以用作上下文管理器。该协议包含两个特殊方法。
1)__enter__(self) :https://docs.python.org/3.6/reference/datamodel.html#object.__enter__。
2)__exit__(self,exc_type,exc_value,traceback):https://docs.python.org/3.6/reference/datamodel.html#object.__exit__。
执行with语句的过程如下:
a) 调用__enter__方法。任何返回值都会绑定到指定的as子句。
b) 执行内部代码块。
c) 执行__exit__方法。