2.15 上下文管理器

2.15.1 with语句的使用

2.15.1.1 with语句的基本语法

# with语句基本语法
with open("example.txt", "w") as f:
    f.write("批量小王子")

输出: 无(文件被创建并写入内容)

2.15.1.2 上下文管理器的作用与场景

# 上下文管理器用于管理资源,如文件操作
with open("example.txt", "r") as f:
    content = f.read()
print(content)

输出:

批量小王子

2.15.1.3 使用with语句简化资源管理

# with语句自动关闭资源,即使发生异常
try:
    with open("non_existent_file.txt", "r") as f:
        pass
except FileNotFoundError:
    print("文件不存在")

输出:

文件不存在

2.15.1.4 错误处理与with语句

# with语句中的错误处理
with open("example.txt", "r") as f:
    for line in f:
        print(line)
except Exception as e:
    print(f"发生错误:{e}")

输出:

批量小王子

发生错误:[输出取决于具体的错误]

2.15.1.5 常见上下文管理器示例(如文件操作、数据库连接等)

# 文件操作上下文管理器示例
with open("example.txt", "r") as f:
    print(f.read())

输出:

批量小王子

2.15.2 自定义上下文管理器

2.15.2.1 自定义上下文管理器的基本步骤

# 定义一个上下文管理器类
class MyContextManager:
    def __enter__(self):
        print("进入上下文")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出上下文")
        # 可以在这里处理异常
        if exc_type:
            print(f"处理异常:{exc_val}")
        return False  # 重新抛出异常

# 使用自定义上下文管理器
with MyContextManager() as manager:
    print("在上下文中")
    raise ValueError("示例异常")

输出:

进入上下文
在上下文中
处理异常:示例异常
退出上下文

2.15.2.2 使用__enter__()__exit__()方法

class MyResource:
    def __enter__(self):
        print("资源分配")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("资源释放")

# 使用自定义资源管理器
with MyResource() as resource:
    print("使用资源")

输出:

资源分配
使用资源
资源释放

2.15.2.3 contextlib模块中的contextmanager装饰器

from contextlib import contextmanager

@contextmanager
def my_context_manager():
    print("进入上下文")
    try:
        yield
    finally:
        print("退出上下文")

with my_context_manager():
    print("在上下文中")

输出:

进入上下文
在上下文中
退出上下文

2.15.2.4 使用__enter__()__exit__()实现资源管理

class FileHandler:
    def __init__(self, filename):
        self.filename = filename

    def __enter__(self):
        self.file = open(self.filename, "w")
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

with FileHandler("example.txt") as f:
    f.write("批量小王子")

输出: 无(文件被创建并写入内容)

2.15.2.5 自定义上下文管理器的应用案例

class ManagedResource:
    def __enter__(self):
        print("资源初始化")
        return self

    def use_resource(self):
        print("使用资源")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("资源清理")

with ManagedResource() as resource:
    resource.use_resource()

输出:

资源初始化
使用资源
资源清理

2.15.2.6 错误处理与清理操作

class ErrorHandlingContext:
    def __enter__(self):
        print("进入上下文")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:
            print(f"捕获异常:{exc_val}")
        print("执行清理操作")

try:
    with ErrorHandlingContext() as ctx:
        raise ValueError("示例异常")
except ValueError as e:
    print(f"处理异常:{e}")

输出:

进入上下文
捕获异常:示例异常
执行清理操作
处理异常:示例异常

这些代码示例提供了with语句和自定义上下文管理器的基本用法和应用场景。您可以在本地环境中执行这些代码来验证输出。

16-9-渐变底-5.png