我之前在这篇博客里说到了如何定义一个上下文管理器协议(with语句),今天要说一个更简单的定义方式。
python
提供了一个内置的模块contextlib
,该模块有一个装饰器@contextlib.contextmanager
,可以将函数变为上下文管理器。
import contextlib
@contextlib.contextmanager
def file_open(file_name): #此处只是模拟并没有真的打开一个文件
print("file open")
yield {} # 把函数变为生成器
print("file end")
其实yield
上面的逻辑就相当于之前那篇博客里的__enter__
函数中的逻辑(获取资源),而yield
下面的逻辑就相当于那篇博客中的__exit__
函数(释放资源)。
yield
中逻辑可以任意。这样函数就变成了一个上下文管理器。
然后使用with
语句。
with file_open("bobby.txt") as f_open: #只是模拟,说明逻辑,没有真的文件
print("file processing")
#输出为
# file open
# file processing
# file end
运行时先进入__enter__
函数,即yield
上面的代码,打印file open
,然后运行打印file processing
,最后进入__exit__
函数,即运行yield
下面的代码,打印file end
。