用途:帮助在 Python 中确定性地管理资源,确保数据库连接、文件句柄、网络套接字等在异常发生时也能可靠释放。
主要能力:
- 上下文管理器:with 语句自动释放资源;同步用 enter/exit,异步用 aenter/aexit。
- 无条件清理:exit 无论是否发生异常都会执行;返回 True 抑制异常,False 向上传播。
- 简化写法:用 @contextmanager 与 @asynccontextmanager 装饰器处理简单场景,如计时块、数据库事务(BEGIN/COMMIT/ROLLBACK)。
- 选择性异常抑制:仅抑制明确预期的异常,如 BrokenPipeError。
- 流式处理:在流式响应中同时维护增量分块与累积状态,用列表加 join 避免 O(n²) 字符串拼接,并统计首字节时间、总耗时、分块数与字节数。
- 多资源管理:用 ExitStack 与 AsyncExitStack 处理动态数量的资源。
使用方式:对需要清理的资源优先使用上下文管理器;简单场景用装饰器;复杂资源实现协议方法;动态数量资源用 ExitStack。
适用场景:数据库连接与连接池、文件与 I/O、自定义上下文管理器、带状态的流式响应、嵌套资源清理、异步上下文管理器。
限制与注意:生成器内 with open() 在 PyPy/IronPython 下依赖 GC 时机,存在风险;ExitStack 中 enter_context 与 push 混用顺序错误可能吞掉异常;异步上下文管理器必须用 async with,否则不会执行清理;Windows 上 NamedTemporaryFile 打开时无法重新打开,需 delete=False 并显式清理;contextlib.suppress 传入 BaseException 会连 KeyboardInterrupt 一起吞掉,应明确指定异常类型。建议测试清理路径,验证出错时资源确实被释放。