同步上下文管理器和异步上下文管理器
class FileWriter:
def __init__(self, filename, mode='w'):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
# 进入 with 语句块时打开文件
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
# 离开 with 语句块时关闭文件,并处理可能的异常
if self.file:
self.file.close()
# 如果返回 True,则表示异常已经被处理,不会向上传播
# 默认返回 None(即 False),表示异常需要向上传播
return False
# 使用示例
with FileWriter('example.txt') as f:
f.write('Hello, world!')
# 退出 with 块后,文件会自动关闭
# 也可以使用 contextlib 模块来简化创建上下文管理器
from contextlib import contextmanager
@contextmanager
def file_writer(filename, mode='w'):
file = open(filename, mode)
try:
yield file
finally:
file.close()
# 使用 contextmanager 装饰器创建的上下文管理器
with file_writer('example2.txt') as f:
f.write('Hello again!')