当前位置: 首页 > news >正文

Python 的 with 语句:把「资源管理」这件事交给语法

文章目录

    • 一、with 语句是干什么的?
    • 二、不用 with 会发生什么?
    • 三、传统解法:try / finally
    • 四、with 的本质:语法级 try / finally
    • 五、上下文管理器(Context Manager)
      • 5.1 一个最简单的例子
      • 5.2 `__enter__` 和 `__exit__` 到底干了什么?
    • 六、常见 with 使用场景
      • 6.1 文件操作(最常见)
      • 6.2 锁(多线程)
      • 6.3 数据库连接
      • 6.4 临时修改状态

Python里,你经常会看到这样的代码:
withopen(sql_file,'r',encoding='utf-8')asf:sql_content=f.read()

很多人知道它“更安全”,但并不真正清楚:

  • with到底解决了什么问题?
  • 它和try / finally有什么关系?
  • 自己能不能写一个with

这篇文章一次讲清楚。

一、with 语句是干什么的?

一句话概括:

with用来自动管理资源的“申请与释放

常见资源包括:

  • 文件
  • 网络连接
  • 数据库连接
  • 锁(Lock)
  • 临时状态

核心目标只有一个:
👉不管中间发生什么,最后一定能正确清理

二、不用 with 会发生什么?

以文件操作为例:

f=open("test.txt","r")content=f.read()f.close()

看起来没问题,但一旦中间出错:

f=open("test.txt","r")content=f.read()raiseException("boom")f.close()# 永远执行不到

资源泄漏风险立刻出现。

三、传统解法:try / finally

f=open("test.txt","r")try:content=f.read()finally:f.close()

✅ 安全
❌ 冗长
❌ 容易忘

四、with 的本质:语法级 try / finally

withopen("test.txt","r")asf:content=f.read()

等价于(简化版)👇

f=open("test.txt","r")try:content=f.read()finally:f.close()

👉with 只是把“模板代码”交给了语法

五、上下文管理器(Context Manager)

能被with使用的对象,必须满足一个条件:

实现上下文管理协议

也就是这两个方法:

__enter__()__exit__(exc_type,exc_val,exc_tb)

5.1 一个最简单的例子

classFileManager:def__init__(self,filename):self.filename=filenamedef__enter__(self):self.file=open(self.filename,"r")returnself.filedef__exit__(self,exc_type,exc_val,exc_tb):self.file.close()

使用:

withFileManager("test.txt")asf:print(f.read())

5.2__enter____exit__到底干了什么?

__enter__

  • with代码块开始前执行
  • 返回值绑定给as后的变量
withobj()asx:...# x 就是 obj.__enter__() 的返回值

__exit__

__exit__(exc_type,exc_val,exc_tb)
  • 代码块结束时一定执行
  • 不论是否发生异常
  • 可以选择是否“吞掉异常”
def__exit__(self,exc_type,exc_val,exc_tb):returnTrue# 异常被吞掉

👉 一般不建议吞异常

六、常见 with 使用场景

6.1 文件操作(最常见)

withopen("a.txt")asf:...

6.2 锁(多线程)

fromthreadingimportLock lock=Lock()withlock:...

6.3 数据库连接

withdb.connect()asconn:...

6.4 临时修改状态

withtempfile.TemporaryDirectory()astmp:...

👉点击进入我的网站

http://www.jsqmd.com/news/333217/

相关文章:

  • 5家值得一览的华润万家购物卡回收热门平台 - 淘淘收小程序
  • 聊聊2026年口碑好的隐形车衣企业,宣城靠谱品牌怎么选择 - myqiye
  • 救命神器9个降AI率工具,学生必备!千笔·专业降AI率智能体助你轻松应对查重难题
  • 信赖的广州太赫兹足疗仪源头厂家哪个公司好
  • 2026京津冀靠谱的全屋定制排行,筑竹全屋定制榜上有名吗 - mypinpai
  • 2025精密铸造砂市场观察:优质厂家解析,磨料/精密铸造砂/棕刚玉/金刚砂/白刚玉,精密铸造砂采购推荐排行榜单 - 品牌推荐师
  • 聊聊蠡县永盛毛绒有实力吗,这家企业优势全揭秘 - mypinpai
  • Simulink模块汇总梳理:智能座舱域在AUTOSAR框架中应用层开发的‘C‘代码生成与计算...
  • 齐齐哈尔市英语雅思培训辅导机构推荐:2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • [Web自动化] Selenium截图
  • 一文了解 AI Agent:创业者必看,要把AI当回事
  • 计算机毕业设计之jsp基于SSM的网上家居商城系统的设计与实现
  • 2026年工具显微镜厂家推荐排行榜:测量显微镜、金相工具显微镜、全自动测量显微镜,高精度工业检测优选品牌深度解析 - 品牌企业推荐师(官方)
  • 【必收藏】2026年AI行业最大机会:锁定应用层,程序员/小白入门大模型正当时!
  • 计算机毕业设计之jsp高校实践课流程管理系统的设计与实现
  • CAXA开放后置处理,适配所有机床不费劲儿
  • 计算机毕业设计之基于Spring Boot的美食分享系统设计与实现
  • 基于plc的立体车库的仿真设计
  • 齐齐哈尔市英语雅思培训辅导机构推荐-2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 基于PLC的具有球速可调可显示得分的乒乓球比赛设计
  • 计算机毕业设计之springboot基于Java的在线考试系统设计与实现
  • 2026年山东营销策划公司专项测评:选型指引 - 品牌推荐
  • 齐齐哈尔市英语雅思培训辅导机构推荐、2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 学霸同款 9个AI论文软件测评:本科生毕业论文写作神器推荐
  • DDD 架构演进,单层、三层,四层,工程分层演进过程!
  • 解决 Vue 3 项目 TypeScript 编译错误:@types/lodash 类型定义不兼容
  • C语言基础知识 -- BCD码
  • 年底回家别让孝心打折,分期乐额度这样用,体面又暖心 - 团团收购物卡回收
  • 计算机毕业设计之springboot基于java实现的健身房操课预约系统
  • 2026年 工业清洗剂厂家推荐排行榜,金属清洗剂,机械零件清洗剂,水基/溶剂型清洗剂,航空发动机清洗剂源头实力品牌深度解析 - 品牌企业推荐师(官方)