标准库中还有个contextlib 模块,提供一些实用工具,
ExitStack
这个上下文管理器能进入多个上下文管理器。例如,同时打开任意一个文件列表中的所有文件。
下面展开介绍下@contextmanager
@contextmanager 装饰器能减少创建上下文管理器的样板代码量,因为不用编写一个完整的类,定义 __enter__ 和 __exit__ 方法,而只 需实现有一个 yield 语句的生成器,生成想让__enter__ 方法返回的值。yield 语句的作用是把函数的定义体分成两部分:yield语句前面的所有代码在 with块开始时(即解释器调用 __enter__ 方法时)执行,yield语句后面的代码在with块结束时(即调用__exit__方法时)执行。
>>> @contextmanager
... def lookingglass():
... import sys
... origin_writer=sys.stdout.write
... def reverse_writer(text):
... origin_writer(text[::-1])
... sys.stdout.write=reverse_writer
... try:
... yield 'yield return'
... except:
... print('enter exception')
... finally:
... sys.stdout.write=origin_writer
...
>>> with lookingglass() as what:
... print('test code')
... print(what)
...
edoc tset
nruter dleiy
>>> print('test')
test
生成器函数的作用更像是协程:执行到某一点时暂停,让客户代码运行,直到客户让协程继续做事
Python 上下文管理器和with块一 https://blog.csdn.net/s695811494/article/details/112093625