Python中多个上下文管理器的执行顺序是否有明确规范?
解答
这种逗号分隔的同句多上下文管理器写法,执行顺序有Python官方语法的明确定义,完全可以保证写在前面的上下文(即示例中打开a.txt的操作)先于后面的上下文执行。
具体规则如下:
- 上下文进入顺序严格按照代码书写顺序从左到右执行:示例中会先完成
a.txt的打开操作、将文件对象绑定到f1,确认该上下文进入成功后,才会开始执行打开b.txt、绑定到f2的操作。 - 该写法和多层嵌套
with的执行逻辑100%等价,以下两段代码不存在执行层面的差异:
# 单句逗号分隔写法 with open('a.txt', 'w') as f1, open('b.txt', 'w') as f2: <some operation>
# 多层嵌套写法 with open('a.txt', 'w') as f1: with open('b.txt', 'w') as f2: <some operation>
- 异常处理与上下文退出遵循后进先出的栈逻辑:
- 如果靠前的上下文进入阶段就抛出异常(比如打开
a.txt时权限不足报错),后续的上下文管理器根本不会被触发执行 - 如果靠后的上下文进入阶段抛出异常(比如
a.txt打开成功,但打开b.txt失败),之前已经成功进入的上下文会被自动正常释放,不会出现资源泄漏 - 当with代码块内的逻辑执行完毕、或块内抛出异常时,会先退出后进入的上下文(即先关闭
b.txt),再退出先进入的上下文(即后关闭a.txt)
- 如果靠前的上下文进入阶段就抛出异常(比如打开
补充:Python 3.10 版本新增的带括号分组多上下文写法,同样遵守上述顺序规则,例如
with (open('a.txt', 'w') as f1, open('b.txt', 'w') as f2):的执行逻辑和前述写法完全一致。
内容的提问来源于stack exchange,提问作者mpatro
相关产品推荐
相关产品推荐

