Python 上下文管理器 with 相关用法

Python 上下文管理器

什么是上下文管理器?
  • context manager
  • 一个上下文管理器是一个对象
  • 它定义了运行时的上下文
  • 使用 with 语句来执行
with 语句
with context as ctx:#  使用这个上下文对象
#  上下文对象已经被清除

​ 这里我们使用 Python的文件操作 打开一个文件并写入一段话

instance = open('data.txt', 'w')  # 打开文件
instance.write('What a wonderful house')
instance.close()  # 关闭文件

​ 对于上面的代码,我们可以用 with 语句进行代替,并且只需要两行。

with open('data.txt', 'w') as instance:instance.write('What a wonderful house')

​ 这是因为在 with 语句结束时,会自动调用文件的关闭 close 函数,避免出现异常。

上下文管理器的协议

一个上下文管理器需要实现如下方法:

  • __enter__() 安装上下文,可以返回对象
  • __exit__() 清楚释放对象

​ 这里我们举个计算一段程序用时时长的例子,time.perf_counter是用于测量代码执行时间的功能。它返回一个高分辨率的性能计数器,通常用于测量短时间内的代码执行时间。

import timestart = time.perf_counter()
list1 = []
for i in range(1, 10000):list1.append(i ** 2)end = time.perf_counter()
elapsed = end - start
print(elapsed)

​ 为了实现对于任意代码段都可以调用这个计算时长的例子,我们定义 Timer 类来实现整个程序流程,__enter__作为进入方法,__exit()__作为退出方法。

class Timer:def __init__(self):self.elapsed = 0def __enter__(self):self.start = time.perf_counter()return self  #  必须实现def __exit__(self, exc_type, exc_val, exc_tb):self.end = time.perf_counter()self.elapsed = self.end - self.startreturn False  # 如果在with范围内出现了异常,在exit的时候可以告诉Python是否继续向外抛出,如果return True,那么就表示不抛出了,return False表示继续抛出。当然如果没有异常,这里return什么就无所谓了

​ 主体调用代码部分。

with Timer() as t:list1 = []for i in range(1, 10000):list1.append(i ** 2)end = time.perf_counter()
print(t.elapsed)

​ 下面我们来解释一下代码的执行流程:

  1. Time()创建对象,调用我们定义的 __init__初始化方法,实现了变量的初始化
  2. with 语句会调用 __enter__方法,执行 __enter__方法主体内容,并且将返回值传给 as 后面定义的变量,这里是 t。(所以 t 并不是对 Timer()的引用,而是 Timer().__enter__的返回值。
  3. 当代码段调用结束时,程序会调用 __exit__ 方法进行退出,生成我们需要的整体代码运行时间变量 elapsed。

也就是说,我们之前使用 with 语句打开文件实现文件的退出,本质上是 open 打开的内置的 __exit__ 函数帮我们实现了这样一个功能。

上下文管理的应用

上下文管理器一般的应用场景:

  • 开 - 关
  • 锁 - 释放
  • 启动 - 停止
  • 改变 - 重置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GNSEC 2022年第8届全球下一代软件工程线上峰会-核心PPT资料下载

一、峰会简介 新一代软件工程是指利用新的理论、方法和技术,在软件开发、部署、运维等过程中,实现软件的可控、可预测、可维护的软件生产方式。它涵盖了多个领域,如软件开发、测试、部署、运维等,旨在提高软件生产效率和质量。 …

103.进程概述

目录 1.并行和并发 区别: 2.PCB 3.进程状态 4. 进程命令 从严格意义上来讲,程序和进程是两个不同的概念,他们的状态,占用的系统资源都是不同的。 程序:程序是一种静态实体,是存储在计算机存储介质上的…

排序算法之二:冒泡排序

冒泡排序的思路 冒泡排序是交换排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动…

判断三角形-第11届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第12讲。 判断三角形&#…

AOC computer monitor

【窗口增亮】关闭就没掉了

Java异常讲解

🐵本篇文章将对异常相关知识进行讲解 一、异常的结构 在程序执行的过程中出现的一些问题叫做异常,异常其实是一个一个类,每一种异常都代表一个类 1.1 几种常见的异常 System.out.println(10/0); //算数异常 //Exception in thread "m…

LDAP协议和AD活动目录的讲解

目录 LDAP协议 LDAP基本概念 LDAP目录的数据结构 LDAP交互过程以及相关报文 AD(Active Directory) AD基本概念 AD域与工作组、本地组的区别 AD DS(AD域服务) 信任关系 组策略和安全组 LDAP协议 LDAP基本概念 LDAP&…

TypeScript:JavaScript的超集,让代码更安全、更可维护

一、介绍 TypeScript是微软开发的一种静态类型检查的JavaScript超集,它在JavaScript的基础上添加了类型系统,使得开发者能够更好地定义变量类型,提高代码的可读性和可维护性。本文将介绍TypeScript的基本概念、优势、使用方法和实践。 二、…

2024年程序员面对经济下行的解决方式竟然是……

近些年大环境不好,经济下行的压力给到了我们每一个普通人的身上:降薪是潮流,裁员是趋势,找不到工作是常态。 在这样的环境下,我们曾一天三份工,只为家人温饱; 我们也曾一周七天连轴转&#xf…

ProEasy机器人:快速上手使用机器人软件与编程(干货满满,好学不费脑)

一、安装机械手软件 如图所示,安装顺序为:先安装第一个,再安装第二个 二、快速认识学习掌握机械手软件重要功能 1.连接机械手 机械手默认出厂的ip为:“192.168.1.1”,在初次连接机械手前,必须把使用连接的…

JVM常用调优参数

针对Java虚拟机(JVM)的性能调优,有一些常见的调优参数可以用来提高应用程序的性能和稳定性。以下是一些常用的JVM调优参数: 堆内存设置 -Xms:设置JVM初始堆大小-Xmx:设置JVM最大堆大小-Xmn:设…

k8s官方镜像代理加速

背景 大家可能在云原生领域需要部署周边的一些生态组件时,在国内遇到无法正常拉取镜像,显得就有点苦恼,不过没关系,常见的${{ registry_name }} 例如 “gcr.io”,“registry.k8s.io” Failed to pull image “registry…

C# Solidworks二次开发:获取零件的最小包容体方法详解

今天要讲的文章是在Solidworks如何获取零件的最小包容体的方法,这个方法的API如下所示: 获取零件的最小包容体的API为:partDoc.GetPartBox(true); 这个方法中参数为只有一个,是否转换为用户单位;True保留系统单位,fa…

AI Pika 生成进击的巨人动漫分镜案例

背景介绍 Pika 是一个使用 AI 生成和编辑视频的平台。它致力于通过 AI 技术使视频制作变得简单和无障碍。 Pika 1.0 是 Pika 的一个重大产品升级,包含了一个新的 AI 模型,可以在各种风格下生成和编辑视频,如 3D 动画,动漫,卡通和电影风格。…

springboot 整合 Spring Security+JWT 实现token 认证和校验

1.大概是这个样子 JWT 是什么? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明…

k8s 中externalTrafficPolicy应用场景和实践

在Kubernetes(K8s)中,externalTrafficPolicy 是一个用于控制服务的外部流量的策略。这个字段可以在 Service 的定义中设置,其主要作用是决定服务对外部请求的负载均衡行为。具体来说,externalTrafficPolicy 有两个可选…

【ArcGIS微课1000例】0078:创建点、线、面数据的最小几何边界

本实例为专栏系统文章:讲述在ArcMap10.6中创建点数据最小几何边界(范围),配套案例数据,持续同步更新! 文章目录 一、工具介绍二、实战演练三、注意事项一、工具介绍 创建包含若干面的要素类,用以表示封闭单个输入要素或成组的输入要素指定的最小边界几何。 工具位于:数…

Park Unpark

文章目录 当先调用park时:如果_counter0,这时候该线程阻塞,进入_cond阻塞,之后Unpark设置_counter为1后停止阻塞 当先调用Unpark时:此时先将_counter设置为1,当后面出现park时一判断_counter为1&#xff0c…

IO多路复用(新)

1.前景回顾 无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案: 如果调用recvfrom时,恰好内核没有数据,那么阻塞IO会使用户进程阻塞,非阻塞IO使CPU进行空…

CMMI5大成熟度等级和4大过程域

CMMI(Capability Maturity Model Integration,能力成熟度模型集成)模型系列是帮助组织改进其过程的最佳实践的集合。这些模型由来自产业界、政府以及软件工程研究所(Software Engineering Institute, SEI)的…