文件数量在运行时才确定时,嵌套很多层with并不方便。ExitStack可以集中管理进入的上下文,让已经打开的资源在退出时得到清理。

每打开一个就登记上下文
通过enter_context进入文件对象的上下文。退出ExitStack时,已登记的退出操作按相反顺序执行。它管理资源生命周期,不会自动回滚已经写入的业务数据,因此不要把它当成数据库事务。
中途失败也要考虑已经取得的资源
假设第三个文件打不开,前两个已经打开的文件仍需要关闭。把获取动作放在ExitStack管理范围内,可以减少手工维护清理列表的遗漏;错误本身仍需按业务要求处理。
先在临时目录验证
下面只创建两份练习文本,读取后检查文件句柄已关闭。真实任务还应限制文件数量与读取大小。示例验证退出清理,不对任意文件系统错误作保证,也不访问现有业务文件。
可以运行的练习
from contextlib import ExitStack
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
paths = [Path(folder) / name for name in ["a.txt", "b.txt"]]
for path in paths:
path.write_text(path.stem, encoding="utf-8")
with ExitStack() as stack:
files = [stack.enter_context(path.open(encoding="utf-8")) for path in paths]
assert [file.read() for file in files] == ["a", "b"]
assert all(file.closed for file in files)
print("两个练习文件均已关闭")
示例已在本地隔离环境运行检查。使用固定输入,不访问外部接口,也不读取真实业务文件。
资料与继续学习
Python:contextlib.ExitStack。资料查阅日期:2026年10月1日。步骤与练习由本站整理。
资料查阅与编辑日期:2026年10月1日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







