掌握Python上下文管理器:优雅资源管理的艺术
在Python编程中,资源管理是一个绕不开的话题——打开的文件要关闭,获取的锁要释放,数据库连接要断开。传统做法是try/finally,但Python的上下文管理器提供了更优雅的方案:with语句。
基础用法:文件操作
with open('data.txt', 'r') as f:
content = f.read()
无需显式调用close(),退出with块后文件自动关闭,即使发生异常也依然安全。这就是上下文管理器的威力。
自定义上下文管理器
两种方式实现:
1. 类方式:实现__enter__和__exit__方法
class ManagedFile:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close()
2. contextlib装饰器:更简洁
from contextlib import contextmanager
@contextmanager
def managed_file(filename, mode):
f = open(filename, mode)
try:
yield f
finally:
f.close()
yield前面的代码相当于__enter__,后面的相当于__exit__。
实际应用场景
- 数据库事务:自动回滚或提交
- 线程锁:with lock: 自动释放
- 临时环境:修改环境变量后自动恢复
- 性能计时:统计代码块执行时间
例如,用上下文管理器实现代码计时:
@contextmanager
def timer(name):
start = time.time()
yield
print(f'{name} took {time.time() - start:.2f}s')
总结
上下文管理器让资源管理变得声明式、防错且可复用。当你反复写try/finally时,不妨考虑将它封装成上下文管理器——你的代码会更Pythonic。
(全文498字)