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

Python上下文管理:with语句执行原理

什么是上下文管理器

上下文管理器(Context Manager)是 Python 中用于管理资源分配和释放的一种机制。它允许您在进入和退出代码块时执行特定的操作,例如打开和关闭文件、建立和关闭数据库连接、获取和释放锁等。上下文管理器常常与 with 语句一起使用,以确保资源在使用后被正确地释放。Python中主要通过两种方法实现:

使用类实现上下文管理器

要创建一个使用类实现的上下文管理器,您需要定义一个类,该类包括 enterexit 方法。enter 方法用于进入代码块前执行的操作,而 exit 方法用于退出代码块后执行的操作。

class ParseFile:def __init__(self, filename, mode):self.filename = filenameself.mode = modedef __enter__(self):self.file = open(self.filename, self.mode)return self.filedef __exit__(self, exc_type, exc_value, traceback):""":param exc_type: 异常类型:param exc_value: 异常值:param traceback: 异常相关的堆栈跟踪信息,堆栈跟踪包括了引发异常的代码路径以及函数调用链:return:"""self.file.close()# 使用上下文管理器打开文件
with ParseFile('data.txt', 'r') as f:print(f.read())

生成器也可以用作上下文管理器

使用@contextmanager 装饰器标记为上下文管理器,yield会把函数定位分成两个部分:yield前面所有代码是在with开始时执行(类似__enter__方法),yield后面的是在with结束时执行(类似__exit__方法)

from contextlib import contextmanager
import timedef adds():for i in range(3):print(i)time.sleep(1)@contextmanager
def timing_context(func):start_time = time.time()try:func()yield 'runtime'  # 进入上下文 yield后面的值,就会赋在 with语句的as 后面finally:end_time = time.time()elapsed_time = end_time - start_timeprint(f"Elapsed time: {elapsed_time} seconds")# 使用上下文管理器来测量代码块的执行时间
with timing_context(adds) as msg:# 模拟耗时操作print(msg)# 上下文管理器会自动计算和打印执行时间
http://www.lryc.cn/news/215270.html

相关文章:

  • Mac-Java开发环境安装(JDK和Maven)
  • mac下的vscode配置编译环境
  • 洗衣洗鞋柜洗衣洗鞋小程序
  • vi vim 末尾编辑按GA 在最后一行下方新增一行编辑按Go
  • LeetCode热题100 240.搜索二维矩阵||
  • Anaconda安装及使用教程
  • 动态规划算法实现------转换(编辑、变换)问题
  • C#使用Oracle.ManagedDataAccess.dll
  • 分享88个工作总结PPT,总有一款适合您
  • 【华为OD题库-002】最佳植树距离-Java
  • 【python与数据结构】(leetcode算法预备知识)
  • 前端+Python实现Live2D虚拟直播姬
  • 华纳云 宝塔怎么配置香港服务器多ip?
  • 云计算是什么
  • 【POI-EXCEL-下拉框】POI导出excel下拉框数据太多导致下拉框不显示BUG修复
  • 【ES专题】ElasticSearch 高级查询语法Query DSL实战
  • 陕西某小型水库雨水情测报及大坝安全监测项目案例
  • pte rs练习方法 请介绍一下crank请介绍一下sanctuary请介绍一下solitary请介绍一下coarse请介绍一下deception
  • NLP之LSTM与BiLSTM
  • 【实现多个接口的使用】
  • Mac收集的几个终端命令
  • 206. 反转链表、Leetcode的Python实现
  • VS2022 打包WPF安装程序最新教程(图文详解)
  • 清华大模型GLM
  • 实时数仓-hologres使用总结
  • 博客摘录「 TCP/IP网络编程——习题答案」2023年10月29日
  • MySQL数据库干货_13—— MySQL查询数据
  • Docker Consul概述及构建
  • 《Linux从练气到飞升》No.25 Linux中多线程概念
  • 2021~2023年度长垣起重机博览会最佳产品彩页(修订中)