1. 理解上下文管理器的本质
第一次接触Python的contextmanager时,我误以为它只是个语法糖。直到在数据库连接池项目中因为资源泄漏焦头烂额,才真正理解它的价值。上下文管理器(Context Manager)是Python用于资源管理的核心协议,通过__enter__和__exit__两个魔术方法实现。
想象你走进一个房间,开灯操作相当于__enter__,离开时关灯就是__exit__。这个模式完美解决了资源获取与释放的配对问题。在文件操作中,传统方式需要显式调用close():
python复制f = open('file.txt')
try:
data = f.read()
finally:
f.close()
而使用上下文管理器后:
python复制with open('file.txt') as f:
data = f.read()
关键理解:
with语句会确保无论块内代码是否抛出异常,__exit__方法都会被调用。这是它比try-finally更可靠的原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. contextmanager装饰器实战
标准库contextlib提供的@contextmanager装饰器,能将生成器函数快速转换为上下文管理器。下面这个计时器例子展示了典型结构:
python复制from contextlib import contextmanager
import time
@contextmanager
def timer():
start = time.perf_counter()
try:
yield # 执行with块内的代码
finally:
print(f"耗时: {time.perf_counter() - start:.2f}s")
with timer():
time.sleep(1.5) # 输出: 耗时: 1.50s
代码执行流程:
- 调用timer()执行到yield前的内容(相当于
__enter__) - 执行with块内代码
- 回到yield处继续执行finally块(相当于
__exit__)
常见坑点:必
