contextlib
上下文管理器¶
参见上下文管理器
@contextmanager¶
编写__enter__()和__exit__()非常繁琐, contextlib提供了更简单的写法.
例子
定义:
from contextlib import contextmanager
class Query(object):
def __init__(self, name):
self.name = name
def query(self):
print('Query info about %s...' % self.name)
@contextmanager
def create_query(name):
print('Begin')
o = Query(name)
yield o
print('End')
with create_query('example') as q:
q.query()
执行:
执行过程:
with语句首先调用create_query()函数, 打印'Begin', 创建对象o, 通过yield返回创建的对象o,with语句将其赋值给q- 执行
with语句内部的代码块, 即执行q.query()方法, 打印'Query info about example...' - 执行完成后, 继续执行
create_query()中yield语句之后的代码, 打印'End'
@closing¶
@closing装饰器的主要作用是将一个未实现上下文的对象作用于上下文管理器, 其中实现了with语句块执行完成后自动执行[obj].close()的功能.
例子
Tip
其实@closing是一个经过@contextmanager装饰的生成器, 具体实现如下:
-
Contextlib. (n.d.). From https://www.liaoxuefeng.com/wiki/1016959663602400/1115615597164000 ↩