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
语句和自定义上下文管理器的基本用法和应用场景。您可以在本地环境中执行这些代码来验证输出。