page contents

Python 上下文管理器和 else 块(contextlib模块中的实用工具)

自己定义上下文管理器类之前,先看一下 Python 标准库文档中的“29.6 contextlib — Utilities for with-statement contexts”(https://docs.python.org/3/library/contextlib.html)。除了前面提 到的 redirect_stdout 函数,contextlib 模块中还有一些类和其他 函数,使用范围更广。

attachments-2025-07-ouv1lWVq686b207f54829.jpg自己定义上下文管理器类之前,先看一下 Python 标准库文档中的“29.6 contextlib — Utilities for with-statement contexts”(https://docs.python.org/3/library/contextlib.html)。除了前面提 到的 redirect_stdout 函数,contextlib 模块中还有一些类和其他 函数,使用范围更广。

closing
 如果对象提供了 close() 方法,但没有实现__enter__/__exit__ 协议,那么可以使用这个函数构建上下文管理 器。

suppress

构建临时忽略指定异常的上下文管理器。

@contextmanager

这个装饰器把简单的生成器函数变成上下文管理器,这样就不用创 建类去实现管理器协议了。

ContextDecorator
这是个基类,用于定义基于类的上下文管理器。这种上下文管理器 也能用于装饰函数,在受管理的上下文中运行整个函数。

ExitStack
 这个上下文管理器能进入多个上下文管理器。with 块结束 时,ExitStack 按照后进先出的顺序调用栈中各个上下文管理器的__exit__ 方法。如果事先不知道 with 块要进入多少个上下文管理 器,可以使用这个类。例如,同时打开任意一个文件列表中的所有文 件。

显然,在这些实用工具中,使用最广泛的是 @contextmanager 装饰 器,因此要格外留心。这个装饰器也有迷惑人的一面,因为它与迭代无 关,却要使用 yield 语句。由此可以引出协程,这是下一章的主题。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-07-07 09:19
  • 阅读 ( 41 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2172 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2172 文章
  3. Pack 1335 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章