深入探究Python上下文管理器

news2025/2/1 22:51:37

引子

上下文管理器是一种简化代码的有力方式,其内部也蕴含了很多Python的编程思想,今天我们就来探究一下Python的上下文管理器。

大家之前都知道,使用Python打开文件的时候最好要使用with语句,因为这样就算在文件操作中出现了异常,也不会导致内存泄露

代码示例:

最简单的文件打开方式(容易导致内存泄露)

f = open("./xxx.txt")
f.close()

安全的文件打开方式,虽然相对复杂但是有效

# 打开文件
f = open('file.txt')
try:
    for line in f:
        # 读取文件内容 执行其他操作
        # do_something...
finally:
    # 保证关闭文件
    f.close()

我们最经常使用的文件打开方式

with open('file.txt', "r") as r:
	pass

如果一个对象要用with语句,那内部要定义__enter__()方法和__exit__()方法。
以下为一个示例

class TestContext:
    def __init__(self, val):
        self.val = val

    def __enter__(self):
        print('进入enter')
        return self.val

    def __exit__(self, exc_type, exc_value, exc_tb):
        print("进入exit")
        print('exc_type: %s' % exc_type)
        print('exc_value: %s' % exc_value)
        print('exc_tb: %s' % exc_tb)


with TestContext(12) as t:
    print("进入with内部")
    raise ValueError
    print('t: %s' % t)

运行后结果如下图
在这里插入图片描述
不难看出,语句的调用顺序
先进入__enter__()中, 该方法的返回值赋值给上述代码中with后边的t。如果with下的语句出现了异常就会先执行__exit__()语句中的内容。如果没有发生异常,就在执行完毕with下方语句之后执行__exit__()语句。

概念:

上下文管理协议(Context Management Protocol)

包含方法 enter() 和 exit() ,支持该协议的对象要实现这两个方法。

上下文管理器(Context Manager)

支持上下文管理协议的对象,这种对象必须实现 enter() 和 exit() 方法。
上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。
通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。

  • enter()
    with语句执行时,先获取上下文管理器对象,随后调用其 enter()
    若有 as var 语句,则将返回值赋给变量var
    可以返回上下文管理器对象本身,也可以是其他相关对象
  • exit()
    带有三个参数 exc_type, exc_val, exc_tb
    若上下文管理器对象执行无异常,则三个参数均为 None
    若发生异常,则三个参数分别为 异常类型,异常值和tracback信息

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

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

相关文章

基于java的校园共享自行车系统的设计与实现/校园共享单车管理系统

摘 要 伴随着社会以及科学技术的发展,互联网已经渗透在人们的身边,网络慢慢的变成了人们的生活必不可少的一部分,紧接着网络飞速的发展,管理系统这一名词已不陌生,越来越多的学校、公司等机构都会定制一款属于自己个…

React扩展:setState、lazyLoad、hook

目录 1.setState的两种写法 ①setState(对象,[callback])②setState(函数,[callback])函数可以接收到stata和props,callback回调函数能获取状态更新后的数据 写了个Demo组件 import React, { Component } from reactexport default class Demo extends Component…

万岳直播电商系统源码代码分析

以小编经验来看,传统商户领域的客流量受地区的限制,往往比较单一、固定,商家需压耗费大量的时间进行打造IP,而电商直播系统的出现则完全打破了这一规则,商家可以通过直播的形式,轻松获取源源不断的客流量&a…

网络中的一些基本概念(总结)

目录 1.IP地址 2.端口号 3.协议 4.五元组 5.协议分层 1.OSI七层模型 2.TCP/IP五层(四层)模型 6.网络分层对应 7.封装 8.分用 9.客户端和服务器 1.IP地址 IP地址是用来定位主机的网络地址,主要用于标识主机和一些其他的网络设备,比如路由器通常是用点分十进制来表示的]…

节律失调:Theta-Gamma耦合精度改变损害老年人的联想记忆

根据著名的神经通信理论,振荡活动的精确协调能够形成联想记忆。我们认为,正常的认知老化会损害神经通信的时间精确性,从而损害联想记忆的形成。我们发现,在年轻人和老年人中都存在高频gamma功率与低频theta相位的耦合支持联想记忆…

地下水监测系统介绍 地下水水位在线监测系统解决方案及应用

平升电子地下水监测系统/地下水水位在线监测系统解决方案由地下水自动监测站监测设备和监测中心平台软件组成。监测设备自动采集、存储地下水水位、水温、水量、水质数据,通过4G/NB-IoT/北斗无线通信网络定时上报至省/市/县级监测中心平台,平台自动接收和…

神奇的 Excel 插件:Azure DevOps 插件

我想离开测试部分,与您分享一个插件,我发现它在我作为业务分析师的商业生活中非常有用。如果您与 Azure DevOps Board 擦肩而过,本文适合您:) 本周,我将与您分享一个我用来跟踪在 Azure DevOps 中完成的工作的插件。 在解释它的安装和使用之前,我想分享一下为什么我需要…

【Lilishop商城】No3-11.模块详细设计,促销模块(优惠券、满减、秒杀、积分)的详细设计

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑,其中重点包括接口类、业务类,具体的结合源代…

skynet开发一个猜数字游戏

skynet开发一个猜数字游戏游戏简介接口设计和实现agent服务接口room服务接口hall服务接口redis服务gate服务接口编写skynet的config文件游戏演示总结后言游戏简介 猜数字游戏目的是掌握 actor 模型开发思路。 规则: 满三个人开始游戏,游戏开始后不能退…

1.初识Node.js

由于浏览器中有Javascript解析引擎,所以写的javascript可以在浏览器中执行,不同的浏览器有不同的JS解析引擎。由于浏览器内置了DOM,BOM,AJAX这种API,所以JS才能使用他们。 Node.js和浏览器都可以为JS提供运行环境,可以使用Node.j…

【Python机器学习】神经网络中误差反向传播(BP)算法详解及代码示例(图文解释 附源码)

需要全部代码请点赞关注收藏后评论留言私信~~~ 误差反向传播学习算法 用神经网络来完成机器学习任务,先要设计好网络结构S,然后用训练样本去学习网络中的连接系数和阈值系数,即网络参数S,最后才能用来对测试样本进行预测。 在研…

智能驾驶进入新周期:从「定点量产」到「做大做强」

智能驾驶赛道已经进入一个全新的周期。 过去三年时间,中国本土供应商陆续进入乘用车前装量产赛道,部分企业实现了从0到1的量产突围,而一些领跑的本土供应商已率先进入规模化上车的新阶段。 从最初的技术突破、产品落地,到定点量…

干货 | IC模拟版图设计学习笔记,一文教你快速入门

模拟版图设计处于IC设计流程的后端,属于模拟IC设计岗位的一种。随着我国半导体行业的发展,IC模拟版图岗位的人才需求也越来越大。而每个芯片最终能够付诸于生产都离不开集成电路版图设计师的功劳,所以IC模拟版图工程师在芯片产业的发展过程中…

Nginx-反向代理

什么是反向代理 用户直接访问反向代理服务器就可以获得目标服务器的资源。这一过程叫反向代理 如何配置反向代理 修改nginx配置文件 1.切换到nginx的conf路径下操作nginx的配置文件 cd /usr/local/openresty/nginx/conf 1.1防止修改错误可以先备份一下配置文件 cp nginx.…

IO流2.0 缓冲流 序列化 字符打印 printf格式 压缩流

04 缓冲流Buffered 4.1字节缓冲流 4.2 字符缓冲流 newLine();在底层自动识别操作系统类别和换行符 其实就是输出换行符; 4.2.1 BufferedReader(字符为单位 尽量用于文本文件) 不要去操作 二进制文件[声音,视频 ], 可能造成文件损坏 throw…

三个月转行SLAM,他的心路历程

SLAM入门心路历程 来源:知乎作者—莫慢待 读了三年985的计算机硕士,做了很多项目,发现自己是一个菜鸡。c/object-c/python/java/matlab甚至还写过R,也就是项目需要什么写什么。自学能力算是很不错了,第一次创业自己写…

juc-2-锁应用/线程通信

目录 1 线程安全(库存超卖) 2 锁用法 2.1 同步方法 2.2.同步代码块 2.3 synchronized 作用于静态方法 总结 案例 静态成员变量 (synchronized锁非静态方法) 2.4ReentrantLock类是可重入、互斥、实现了Lock接口的锁 3 死锁产生与排查 4 线程间的(等待与通知…

Hadoop实训任务3:HDFS和MapReduce综合操作

目录 1、启动Hadoop服务 2、创建文本文件 3、上传文本文件 4、显示文件内容 5、完成排序任务 6、计算最大利润和平均利润 7、统计学生总成绩和平均成绩 8、总结 1、启动Hadoop服务 在master虚拟机上执行命令: start-all.sh 启动hadoop服务进程 ​ ​ ​…

【嵌入式】构建嵌入式Linux系统(uboot、内核、文件系统)

知识架构及层次 Linux内核由三部分构成: Bootloader:启动引导系统(可执行文件)Kernel:内核(可执行文件)Root File System:根文件系统嵌入式Linux系统构成及启动略析 嵌入式 Linux …

Java八股文,YYDS!字节最新秋招面试题,“死记”这些你也可以斩获字节offer

Java 一面基本上都是基础题,同样是 CURD 的活,谁更熟练要谁,比如下面这些面试题,八股文越熟练越容易通过 Java 面试。 下面会给大家详解的介绍一下每个技术点的必问问题! 一、Java 基础 1.JDK动态代理和CGLIB动态代…