with语句:
有时为了确保即使在出现错误的情况下也能运行某些代码的清理工作,try...finallly语句可以很方便的解决此问题。tyr...finaly语句有很多使用场景。如:
而with语句为这些场景下的代码块实现了包装,即便代码块发生了异常,你也可以在其执行前后调用一些代码。例如,处理文件通常采用这种方式:

利用with语句,上述代码可以写为:

在前面的示例中,open的作用是上下文管理器,确保即使出现异常也要在执行完for循环之后关闭文件。
with语句的一般语法和实现:
with context_manger:
#代码块
。。。
with context_mageger as context:
#代码块
。。。
with A() as a,B() as b:
...
这中写法等同于嵌套使用:
with A() as a:
with B() as b:
...
自定义上下午管理器:
任何实现了上下文管理器协议的对象都可以用作上下文管理器。该协议包含两个特殊方法:
简而言之,with语句的执行过程如下:
大多数场景中,_exit__方法类似与finally执行一些清理工作
下面是实现了上下文管理协议的示例代码:

未引发异常:

引发异常:

函数注解:https://www.cnblogs.com/keye/p/8572353.html
原文:https://www.cnblogs.com/gzl420/p/10888714.html