with 语句和上下文管理器:Python 的"自动善后"服务
你忘记关文件了吗?
f = open("data.txt", "r")
data = f.read()
# …然后忘记关文件了…这就是 with 语句要解决的问题——自动善后。
with open("data.txt", "r") as f:
data = f.read()
# 文件自动关闭自己写一个上下文管理器
class Timer:
def __enter__(self):
import time
self.start = time.time()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.time()
print(f"耗时: {self.end - self.start:.3f}秒")
with Timer():
sum(x**2 for x in range(10_000_000))还能用 @contextmanager 装饰器
from contextlib import contextmanager
@contextmanager
def timer():
import time
start = time.time()
yield
end = time.time()
print(f"耗时: {end - start:.3f}秒")
with timer():
sum(x**2 for x in range(10_000_000))还有哪些地方可以用 with?
- 数据库连接:自动提交/回滚事务
- 线程锁:自动获取/释放锁
- 临时文件:用完后自动删除
任何时候你打开了一个"资源",就该用 with。文件、网络连接、数据库、锁——所有需要"用完记得关"的东西,with 都是你的好兄弟。