0

0

Python with语句能嵌套吗_with嵌套使用说明

冷漠man

冷漠man

发布时间:2026-03-04 19:42:10

|

383人浏览过

|

来源于php中文网

原创

python with语句能嵌套吗_with嵌套使用说明

能嵌套,而且很常见。Python 的 with 语句支持多层嵌套,也支持单行多个上下文管理器(逗号分隔),两者语义略有不同,但都用于安全地管理多个资源。

多层 with 嵌套(缩进式)

这是最直观的嵌套方式,适合逻辑上存在先后依赖、或需要分别处理异常/退出顺序的场景。内层 with 块执行完才退出外层。

  • 每个 with 独立调用 __enter____exit__
  • 退出顺序与进入顺序相反(后进先出),即内层先退出,外层后退出
  • 适用于需按特定顺序打开/关闭资源,比如先连数据库再开事务,或嵌套文件处理

示例:

with open('config.txt') as f1:
    config = f1.read()
    with open('output.txt', 'w') as f2:
        f2.write(config.upper())

这里 f2 一定在 f1 仍有效时被打开,且 f2 关闭后 f1 才继续执行后续(如有)并关闭。

立即学习Python免费学习笔记(深入)”;

单行多个上下文(逗号分隔)

从 Python 3.1 起支持,在一个 with 语句中同时管理多个独立资源,等价于嵌套但更扁平。

Keeva AI
Keeva AI

AI一键生成数字人营销视频

下载
  • 所有上下文管理器的 __enter__ 按从左到右顺序调用
  • 所有 __exit__ 按从右到左顺序调用(和嵌套一致)
  • 任一 __enter__ 失败,已成功进入的会按逆序自动退出

示例:

with open('in.txt') as f1, open('out.txt', 'w') as f2, open('log.txt', 'a') as log:
    data = f1.read()
    f2.write(data[::-1])
    log.write('reversed done\n')

三个文件同时打开,任意一个打开失败(如权限不足),前面已打开的会自动安全关闭。

嵌套 with 的实用注意点

不是所有情况都推荐嵌套——关键看资源间是否真有依赖或顺序要求。

  • 若资源完全独立,优先用逗号写法,代码更简洁、可读性更好
  • 若内层操作依赖外层结果(如用配置决定打开哪个文件),用缩进嵌套更自然
  • 避免过深嵌套(超过 3 层),可提取成函数或使用逗号合并
  • 自定义上下文管理器要确保 __exit__ 正确处理异常传播(返回 True 吞异常,否则向上抛)

和 try/finally 对比的优势

嵌套 with 的核心价值是自动、确定性的资源清理,无需手动配对 close()finally 块。

  • 即使中间发生异常、returnbreak,资源仍保证释放
  • 比手写多层 try/finally 简洁得多,不易出错
  • 标准库中 openthreading.Lockcontextlib.closing 等都原生支持

不复杂但容易忽略:嵌套本质是语法糖,底层靠的是上下文管理器协议,只要对象实现了 __enter____exit__,就能参与嵌套或逗号组合。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

382

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2105

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

419

2023.10.16

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号