Python中的上下文管理器(contextlib)模块

Python中的contextlib模块提供了一些用于创建和管理上下文管理器(context managers)的工具。上下文管理器是实现了__enter__()__exit__()方法的对象,它们通常用于确保在代码块执行前后执行某些操作,比如资源获取与释放、设置和重置环境、错误处理等。with语句与上下文管理器一起使用,可以自动处理这些操作,使代码更加简洁和健壮。

contextlib模块提供了几个有用的函数和类,用于创建和管理上下文管理器,主要包括:

  1. contextlib.contextmanager :这是一个装饰器,用于将生成器函数转化为上下文管理器。在生成器函数中,使用yield语句分隔__enter__()__exit__()方法的逻辑。

示例:

复制代码

python复制代码

|---|---------------------------------------------------|
| | from contextlib import contextmanager |
| | |
| | @contextmanager |
| | def managed_resource(*args, **kwds): |
| | # __enter__ 逻辑 |
| | resource = acquire_resource(*args, **kwds) |
| | try: |
| | yield resource |
| | finally: |
| | # __exit__ 逻辑 |
| | release_resource(resource) |
| | |
| | # 使用 with 语句 |
| | with managed_resource(arg1, arg2) as resource: |
| | # 使用 resource |
| | pass |

  1. contextlib.ExitStack :这是一个上下文管理器,可以处理多个上下文管理器的__enter__()__exit__()调用。这使得可以方便地管理一组需要同时设置和清理的资源。

示例:

复制代码

python复制代码

|---|---------------------------------------------------------------------|
| | from contextlib import ExitStack |
| | |
| | with ExitStack() as stack: |
| | files = [stack.enter_context(open(fname)) for fname in filelist] |
| | # 使用 files 列表中的文件 |

  1. contextlib.nullcontext :这是一个不做任何操作的上下文管理器,通常用于在不需要实际上下文管理的情况下与with语句一起使用。

示例:

复制代码

python复制代码

|---|---------------------------------------|
| | from contextlib import nullcontext |
| | |
| | with nullcontext(obj) as result: |
| | # 这里 result 就是 obj,但没有任何额外的操作 |
| | pass |

  1. contextlib.suppress :这是一个上下文管理器,用于抑制指定的异常。在with语句块中,指定的异常会被捕获并忽略,不会传播到外部。

示例:

复制代码

python复制代码

|---|-------------------------------------------------|
| | from contextlib import suppress |
| | |
| | with suppress(FileNotFoundError): |
| | os.remove('somefile.tmp') |
| | # 如果 somefile.tmp 不存在,则不会抛出 FileNotFoundError |

通过使用contextlib模块,你可以更方便地创建和使用上下文管理器,以简化资源管理和错误处理代码。

相关推荐
ZHOU_WUYI8 分钟前
4. light wam 模型loss计算过程
开发语言·人工智能·python
nwsuaf_huasir17 分钟前
【无标题】
python
Python私教2 小时前
Codex 写出的代码能跑却算错钱:我用 3 个测试拆穿一次 AI 编程幻觉
python·单元测试·ai编程
Python私教2 小时前
我只写了一个 add 工具,终于把 MCP 的 Host、Client、Server 跑明白了
python·ai编程·mcp
小大宇3 小时前
python milvus 案例
开发语言·python·milvus
BerryS3N4 小时前
Java 后端转型大模型:Demo 能跑不等于能上线
java·人工智能·python·java后端·spring ai·langchain4j·大模型转型
制造数据与AI践行者老蒋4 小时前
智联工坊实战:从“金鱼记忆”到“记住了”:给制造Agent装上记忆芯片的完整指南
人工智能·python·langchain·制造
某林2124 小时前
ros从底层硬件到 Web 端部署
python·机器人·硬件架构·ros2
码云骑士4 小时前
82-微调模型评估-自动化评测-人工评测-A-B测试实战
运维·python·自动化
FBI HackerHarry浩4 小时前
AI大模型开发V2第四阶段机器学习概述
人工智能·python·机器学习