2026/6/1 1:52:53
网站建设
项目流程
张家口百度免费做网站,公司网站网址注册和备案哪里找,站长工具查询,丁香花在线视频观看免费Python 中的 with 语句是**上下文管理器#xff08;Context Manager#xff09;**最常见、最优雅的使用方式。它主要解决资源管理的问题#xff08;文件、网络连接、数据库连接、锁、临时目录等#xff09;#xff0c;能保证“无论是否发生异常#xff0c;资源都会被正确…Python 中的with语句是**上下文管理器Context Manager**最常见、最优雅的使用方式。它主要解决资源管理的问题文件、网络连接、数据库连接、锁、临时目录等能保证“无论是否发生异常资源都会被正确释放”。with 语句的核心价值一句话总结替代传统的try-finally结构让代码更简洁、更安全、更可读。1. 最常见的用法 —— 文件操作# 传统写法容易忘记 closefopen(data.txt,r,encodingutf-8)try:contentf.read()print(content)finally:f.close()# 必须写在 finally 里# 使用 with推荐withopen(data.txt,r,encodingutf-8)asf:contentf.read()print(content)# 这里可以随意写多行操作# with 语句块结束后f 自动被关闭即使中间抛异常也一样print(f.closed)# True2. with 同时打开多个资源Python 3.1withopen(input.txt)asfin,open(output.txt,w)asfout:forlineinfin:fout.write(line.upper())Python 3.3 更推荐这种写法括号可省略with(open(input.txt,encodingutf-8)asfin,open(output.log,a,encodingutf-8)aslog):log.write(开始处理\n)forlineinfin:log.write(f处理:{line.strip()}\n)3. 常见的内置上下文管理器场景写法示例主要作用文件with open(...) as f:自动关闭文件线程锁with lock:自动获取/释放锁decimal 精度控制with decimal.localcontext(prec10):临时改变精度退出后恢复临时改变目录with tempfile.TemporaryDirectory() as tmp:用完自动删除临时目录关闭连接with conn:数据库连接对象自动 commit / rollback 关闭抑制特定异常with contextlib.suppress(FileNotFoundError):忽略指定异常不打印 traceback4. 自己编写上下文管理器两种主流方式方式一基于类最清晰、最常用classMyTimer:def__init__(self,name):self.namenamedef__enter__(self):importtime self.starttime.perf_counter()print(f[{self.name}] 开始计时...)returnself# 可以返回 self 供 as 变量使用def__exit__(self,exc_type,exc_value,traceback):importtime elapsedtime.perf_counter()-self.startprint(f[{self.name}] 结束用时:{elapsed:.4f}秒)# 返回 True 表示“吞掉”异常返回 False 或 None 则异常继续向外抛returnFalse# 使用withMyTimer(下载任务)ast:time.sleep(1.2)# 模拟一些工作方式二用 contextmanager 装饰器更简洁fromcontextlibimportcontextmanagerimporttimecontextmanagerdeftimer(name):starttime.perf_counter()print(f[{name}] 开始...)try:yield# yield 之前的代码是 __enter__之后的代码是 __exit__finally:elapsedtime.perf_counter()-startprint(f[{name}] 结束用时:{elapsed:.3f}s)# 使用方式和普通 with 完全一样withtimer(测试块):time.sleep(0.8)print(正在干活...)5. 常见面试/进阶问题点问题答案要点with 语句执行顺序是什么1. 执行__enter__()2. 执行 with 代码块3. 执行__exit__()无论是否异常__exit__返回 True 有什么效果代表“异常已被处理”外层不会再看到这个异常可以用 with 写多层嵌套吗可以但建议用并列写法Python 3.3 支持括号多上下文为什么数据库连接库都支持 with因为实现了上下文管理协议能自动管理事务和连接关闭contextlib.ExitStack有什么用当你需要在运行时动态决定要管理的资源数量时使用高级用法6. 总结口诀凡是需要“配对使用”的资源打开就要关闭、加锁就要解锁、进入就要退出优先考虑用with自己写上下文管理器时优先使用contextmanager代码更简洁一定要记住with 结束时一定会执行清理动作除非进程被强杀希望这些例子和说明能帮你彻底搞懂with语句有哪部分还想再深入看看吗比如 ExitStack、多线程锁、asyncio 中的 async with 等