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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值