with与上下文管理器
with的用法:
with open代码块结束,会自动调用close关闭文件。
1 try: 2 # 1、以读的⽅式打开⽂件 3 with open("1.txt", "r") as f: 4 # 2、读取⽂件内容 5 f.write("xxxxx") 6 except IOError as e: 7 print("⽂件操作出错", e)
程序中的上下文:
程序中的上下文和文章的上下文类似,指的是程序段之间的联系,这种联系是某种需要的关联操作,如打开资源,关闭资源。
上下⽂管理器
上下⽂管理器本质就是能够⽀持with操作。
任何实现了 __enter__() 和 __exit__() ⽅法的对象都可称之为上下⽂管理器,上下⽂管理器对象可以使⽤ with 关键字。显然,⽂件(open)对象也实现了上下⽂管理器协议。
1 class Myopen(object): 2 def __init__(self, file_name, file_mode): 3 self.file_name = file_name 4 self.file_mode = file_mode 5 6 def __enter__(self): 7 self.file = open(self.file_name, self.file_mode) 8 print('进入上文') 9 return self.file 10 11 def __exit__(self, exc_type, exc_val, exc_tb): 12 self.file.close() 13 print('进入下文')
上下文管理器通过with使用:
1 if __name__ == '__main__': 2 try: 3 with Myopen('爬虫电影.txt', 'r') as f: 4 while True: 5 context = f.read(10) 6 if not context: 7 break 8 print(context, end='') 9 except Exception as e: 10 print(e)
上下文管理器除了可以通过类的__enter__()和__exit__()方法实现,还能通过生成器实现,因为生成器拥有类似的性质:在yield之前执行上文,退出上文唤醒生成器,在下文中执行yield之后的部分。
生成器的方式通过一个contextmanager的装饰器实现:
1 @contextmanager 2 def Myopen(file_name, file_mode): 3 f = open(file_name, file_mode) 4 yield f 5 f.close()
使用方法和上文一致。
总结
- Python 提供了 with 语法⽤于简化资源操作的后续清除操作,实现原理建⽴在上下⽂管理器协议
- (实现__enter__和__exit__)之上
- with使⽤代码中如果在打开过程中发⽣异常,需要使⽤try-except进⾏捕获
- Python 还提供了⼀个 contextmanager 装饰器,更进⼀步简化上下管理器的实现⽅式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人