with 语句和上下文管理器:Python 的"自动善后"服务

Python基础 Dec 20, 2025

你忘记关文件了吗?

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 都是你的好兄弟。

Tags