开发者可以使用内置的contextlib模块来处理自己所编写的对象和函数,使它们能够支持with语句。该模块提供了名为contextmanager的修饰器。函数只需要经过contextmanager修饰,即可用在with语句之中。这样做比标准写法更便捷。如果按照标准方式来做,那么要定义新类,并提供名为__center__和__exit__的特殊方法
from contextlib import contextmanager
@contextmanager
def example():
l = [1,2,3,4]
print('start')
try:
# raise Exception('test')
yield l
finally:
print('end')
with example() as msg:
try:
for i in msg:
print(i)
except:
print(e.message)
start
1
2
3
4
end
这里example返回一个对象。可以通过with复合语句中的as关键字来赋值给局部变量。这样可以使得with块中代码与外部交互。
with块所抛出的任何异常,都会由yield表达式重新抛出,开发者可以在辅助函数中捕获
作用:可以用with语句来改写try/finally中的逻辑,这样可以提升复用程度,时代码更加简洁