Python with…as… 语法详解
-
Python 中
with
关键字基于上下文管理器实现,且内部封装了异常处理,常用于方便的执行资源回收,例如文件关闭等。 -
所谓的上下文管理器,即实现了方法
__enter__
和__exit__
的类。 -
实现了以上两个方法的类都可以与
with
关键字配合使用,例如:class Foo: def __enter__(self): print('call enter') return self def __exit__(self, exc_type, exc_val, exc_tb): print('call exit') def handle(self): print('call handle') if __name__ == '__main__': ''' 先调用 Foo 的 __enter__ 方法,这里 __enter__ 方法返回了 Foo 对象本身, 然后将 Foo 对象赋值给 f 变量,接着再调用 Foo 对象的 handle 方法, 最后,在离开 with 作用域之前,调用 Foo 对象的 __exit__ 方法 ''' with Foo() as f: f.handle() print('out of with') ''' 输出为: call enter call handle call exit out of with '''
-
with
关键字还封装了异常处理,所有的异常信息都会作为参数传递给__exit__
方法,例如:class Foo: def __enter__(self): print('call enter') return self def __exit__(self, exc_type, exc_val, exc_tb): print('call exit') print(exc_type, exc_val, exc_tb) # 返回 True 代表异常已被处理,否则,异常将继续向上抛出 return True def handle(self): print('call handle') # 除 0 异常 return 100 / 0 if __name__ == '__main__': with Foo() as f: f.handle() print('out of with') ''' 输出为: call enter call handle call exit <class 'ZeroDivisionError'> division by zero <traceback object at 0x000001CDF3199100> out of with '''