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

在 Python 中,contextmanager 是 contextlib 模块提供的一个装饰器,用于将一个生成器函数变成一个上下文管理器。这意味着你可以用 with 语句来使用这个函数,自动管理资源的获取与释放。
被 @contextmanager 装饰的函数需要是一个生成器,且只包含一个 yield 语句。yield 之前的部分相当于 __enter__ 方法,之后的部分相当于 __exit__ 方法。
from contextlib import contextmanager
<p>@contextmanager
def my_context():
print("进入上下文")
try:
yield "资源"
finally:
print("退出上下文")</p><h1>使用</h1><p>with my_context() as res:
print(f"使用 {res}")</p>输出:
进入上下文 使用 资源 退出上下文
常见用途包括文件操作、数据库连接、临时修改配置等需要“准备-使用-清理”流程的场景。
立即学习“Python免费学习笔记(深入)”;
@contextmanager
def change_dir(path):
import os
old_dir = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(old_dir)
<h1>使用</h1><p>with change_dir("/tmp"):
print(os.listdir("."))</p>yield 语句可能抛出异常(如被 with 块中的代码引发),可以用 try-except-finally 结构捕获并处理。
@contextmanager
def safe_context():
print("准备资源")
try:
yield
except ValueError as e:
print(f"捕获到 ValueError: {e}")
# 可选择是否继续传播异常
finally:
print("清理资源")
如果不在 except 中重新 raise,异常会被吞掉。若需传递异常,可在处理后加 raise。
基本上就这些。用 @contextmanager 写上下文管理器比定义类更简洁,适合逻辑简单的场景。
以上就是python中contextmanager装饰的方法的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号