首先with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭,线程中锁的自动获取或释放等。
with context_expresion [as targets(s)]:
with-body
这里的context_expression要返回一个上下文管理器,该对象(管理器)并不会赋值给targets(s),赋值给targets(s)的是管理器中的__enter__()方法的返回值 ---》执行语句体with-body ---》不管上述语句体执行过程中是否发生异常,都要执行管理器中的__exit__()方法:如果执行体执行过程中未出现异常或者遇到了break/continue/return,则以None为参数调用__exit__();如果执行过程中出现了异常,则利用sys.exc_info得到的异常信息为参数调用__exit__(),若__exit__()返回的是False,则重新抛出异常,让with之外的逻辑来处理;若返回的是True,则忽略异常