使用contextlib.contextmanager 装饰器将生成器函数转换为上下文管理器

使用 @contextlib.contextmanager 装饰器时,生成器函数必须且只能包含一个 yield 语句

核心原理与执行流程

这个单一的 yield 语句是上下文管理器的“分隔线”,它将函数体清晰地分为两部分:

  1. yield 之前:相当于 __enter__ 方法。在进入 with 块之前执行,用于资源的获取和初始化。yield 产出的值会作为 as 子句变量的值。
  2. yield 之后:相当于 __exit__ 方法。在退出 with 块之后执行,用于资源的清理和释放。

代码示例:

python

from contextlib import contextmanager

@contextmanager
def managed_resource():
    # 第一部分 (__enter__): 进入with块前执行
    print("获取资源")
    resource = "我是资源"
    try:
        yield resource  # 产出的值赋给 as 后的变量
    finally:
        # 第二部分 (__exit__): 退出with块后执行
        print("清理资源")

# 使用上下文管理器
with managed_resource() as r:
    print(f"在with块中使用: {r}")
    # 这里可以安全使用资源,即使发生异常,清理代码也会执行

输出:

text

获取资源
在with块中使用: 我是资源
清理资源
全部评论

相关推荐

01-30 22:03
门头沟学院 Java
用微笑面对困难:我滴妈,【俩月】【实习】【主管】仨debuff吃满了,独立设计开发的项目写了绝大占比的运营板块,你独立开发,那维护、问题复盘、日志更新、bug、策划书全是自己整的? 不建议写那么大,可以从小出发更容易
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务