Python 上下文管理器和with块 二

标准库中还有个contextlib 模块,提供一些实用工具,

  • closing
    如果对象提供了 close() 方法,但没有实现 __enter__/__exit__ 协议,那么可以使用这个函数构建上下文管理 器。
  • @contextmanager
    这个装饰器把简单的生成器函数变成上下文管理器,这样就不用创 建类去实现管理器协议了。
  • 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

 

你可能感兴趣的:(python,python)