# with 语句与上下文管理器

URL: https://caijiao.org/python/ch07/context
Source: docs/python/ch07/context.md
Description: 本章介绍 Python 中的 with 语句及其背后的上下文管理器机制，帮助开发者优雅、安全地管理资源。

在进行文件、网络连接或数据库等资源管理时，及时释放资源是关键。`with` 语句配合上下文管理器，能自动处理资源的进入与退出过程，避免遗忘释放资源所带来的问题。

## 什么是上下文管理器

上下文管理器是一类实现了 `__enter__` 和 `__exit__` 方法的对象，用于在代码块执行前后自动执行特定操作。

## 基本语法

```python
with open("example.txt", "r") as f:
    content = f.read()
```

等同于：

```python
f = open("example.txt", "r")
try:
    content = f.read()
finally:
    f.close()
```

使用 `with` 语句无需手动调用 `close()`，提高代码健壮性与可读性。

## 多个资源的管理

可以同时管理多个资源：

```python
with open("input.txt") as fin, open("output.txt", "w") as fout:
    for line in fin:
        fout.write(line.upper())
```

## 自定义上下文管理器

使用类定义一个上下文管理器：

```python
class MyContext:
    def __enter__(self):
        print("进入上下文")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出上下文")

with MyContext():
    print("处理中")
```

也可以使用 `contextlib` 装饰器简化写法：

```python
from contextlib import contextmanager

@contextmanager
def my_context():
    print("进入")
    yield
    print("退出")

with my_context():
    print("操作中")
```

## 应用场景

- 文件读写
- 数据库连接
- 网络请求连接管理
- 临时变量作用域控制
- 自动释放锁等并发控制

## 总结

- `with` 语句能自动处理资源释放，避免遗漏；
- 所有支持上下文管理器的对象都可与 `with` 配合使用；
- 可通过类或装饰器自定义上下文管理器，扩展资源管理能力；
- `with` 使代码更简洁、安全，是现代 Python 编程的推荐实践。
