答案:contextmanager是contextlib提供的装饰器,将生成器函数变为上下文管理器,yield前为__enter__、后为__exit__,用于简化资源管理。

在 Python 中,contextmanager 是 contextlib 模块提供的一个装饰器,用于将一个生成器函数变成一个上下文管理器。这意味着你可以用 with 语句来使用这个函数,自动管理资源的获取与释放。
基本用法
被 @contextmanager 装饰的函数需要是一个生成器,且只包含一个 yield 语句。yield 之前的部分相当于 __enter__ 方法,之后的部分相当于 __exit__ 方法。
from contextlib import contextmanager@contextmanagerdef my_context():print("进入上下文")try:yield "资源"finally:print("退出上下文")
使用
with my_context() as res:print(f"使用 {res}")
输出:
进入上下文使用 资源退出上下文
实际应用场景
常见用途包括文件操作、数据库连接、临时修改配置等需要“准备-使用-清理”流程的场景。
立即学习“Python免费学习笔记(深入)”;
临时修改全局状态:比如切换工作目录异常安全的资源管理:确保即使出错也能正确释放资源简化重复代码:把 setup 和 teardown 封装在一起
@contextmanagerdef change_dir(path): import os old_dir = os.getcwd() os.chdir(path) try: yield finally: os.chdir(old_dir)使用
with change_dir("/tmp"):print(os.listdir("."))
异常处理机制
yield 语句可能抛出异常(如被 with 块中的代码引发),可以用 try-except-finally 结构捕获并处理。
@contextmanagerdef safe_context(): print("准备资源") try: yield except ValueError as e: print(f"捕获到 ValueError: {e}") # 可选择是否继续传播异常 finally: print("清理资源")
如果不在 except 中重新 raise,异常会被吞掉。若需传递异常,可在处理后加 raise。
基本上就这些。用 @contextmanager 写上下文管理器比定义类更简洁,适合逻辑简单的场景。
以上就是python中contextmanager装饰的方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1374330.html
微信扫一扫
支付宝扫一扫