使用contextlib.contextmanager 装饰器将生成器函数转换为上下文管理器
使用 @contextlib.contextmanager 装饰器时,生成器函数必须且只能包含一个 yield 语句。
核心原理与执行流程
这个单一的 yield 语句是上下文管理器的“分隔线”,它将函数体清晰地分为两部分:
- yield 之前:相当于 __enter__ 方法。在进入 with 块之前执行,用于资源的获取和初始化。yield 产出的值会作为 as 子句变量的值。
- 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块中使用: 我是资源 清理资源
查看5道真题和解析
