Python中上下文管理器解析

在这里插入图片描述

文章目录

  • 基本原理
  • 上下文管理器的工作原理
  • 自定义上下文管理器
    • enter和exit
    • contextlib 模块
  • 异常处理

Python中的上下文管理器(Context Manager)是一种用于管理资源的机制,特别是在文件操作、数据库连接和锁定等场景中非常有用。上下文管理器通过定义__enter__()和__exit__()方法来控制代码块的进入和退出,从而确保资源的正确分配和释放。

基本原理

  • __enter__(self):在进入上下文时执行的代码。
  • __exit__(self, exc_type, exc_value, traceback):在退出上下文时执行的代码。

上下文管理器的工作原理

with open('file.txt', 'r') as file:
    data = file.read()

其工作流程如下:

  1. 调用上下文管理器对象的 __enter__ 方法。
  2. __enter__ 方法的返回值赋给 as 后面的变量(如上例中的 file)。
  3. 执行 with 块中的代码。
  4. 无论是否发生异常,调用上下文管理器对象的 __exit__ 方法。

当使用with语句时,首先会调用上下文管理器的__enter__()方法。这通常包括一些预处理操作,如打开文件、获取锁等。

在with语句的代码块内执行用户定义的操作。这些操作可以是任何Python代码。

当代码块执行完毕后,会自动调用上下文管理器的__exit__()方法。这通常包括一些清理操作,如关闭文件、释放锁等。

自定义上下文管理器

要实现一个上下文管理器,可以通过以下两种方式:

enter和exit

可以通过实现 __enter____exit__ 方法来自定义上下文管理器。例如:

class MyContextManager:
    def __enter__(self):
        print("进入自定义上下文管理器")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("退出上下文管理器")
        if exc_type is not None:
            print(f"Exception: {exc_type}, {exc_value}")
        return True  # Suppress the exception


# 使用自定义的上下文管理器
with MyContextManager() as manager:
    print("在上下文管理器中")
    raise ValueError("发送错误!")

输出为:
在这里插入图片描述

contextlib 模块

Python 提供了 contextlib 模块,帮助简化上下文管理器的创建。特别是contextlib.contextmanager装饰器,可以将一个生成器函数转换为上下文管理器

from contextlib import contextmanager


@contextmanager
def my_context():
    print("进入上下文(装饰器)")
    try:
        yield
    finally:
        print("退出上下文管理器(装饰器)")


# 使用生成器函数作为上下文管理器
with my_context():
    print("在上下文管理器中(装饰器)")

输出为:
在这里插入图片描述
yield是一个关键字,用于实现生成器函数。生成器函数是一种特殊的函数,它返回一个生成器对象,这个对象支持迭代协议,即它有__iter__()和__next__()方法。生成器允许你在每次迭代时按需生成值,而不是一次性生成所有值,这有助于节省内存和提高性能。


想象你有一个工厂,这个工厂生产水果。但是,你不想一次性生产出所有的水果,因为你没有足够的地方来存放它们。你希望按照需求生产,每次只生产一个水果,当有人需要时才生产下一个。

在Python中,yield就像是这个工厂的生产线。当你定义一个函数时,如果函数里面包含了yield,这个函数就变成了一个生成器函数。每次你调用这个生成器函数,它都会给你一个水果,然后停下来,等待下一次请求。

def fruit_factory():
    yield "苹果"
    yield "香蕉"
    yield "橙子"


factory = fruit_factory()
print(next(factory))  # 输出 "苹果"
print(next(factory))  # 输出 "香蕉"
print(next(factory))  # 输出 "橙子"

在这里插入图片描述


在Python中,@contextmanager是一个装饰器,位于contextlib模块下。它的主要作用是将一个生成器函数转换为一个上下文管理器,从而可以使用with语句来管理代码块的上下文。使用@contextmanager装饰器,可以简化创建上下文管理器的过程,避免手动编写__enter____exit__方法。

异常处理

上下文管理器还可以处理异常。在with语句中,如果发生异常,上下文管理器的__exit__()方法会被调用,以确保资源的正确释放,即使在异常情况下也能保证资源的安全性。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python替换“${}“占位符为变量,实现读取配置文件

文章目录 背景1、定义正则表达式2、替换变量占位符3、实现功能 背景 使用python编写小工具,有一个配置文件,希望实现类似shell命令的,定义变量并且使用${}或者$来引用。如果有好的建议欢迎讨论。 配置文件示例内容如下: D:\project\test\pr…

Windows下通过Ollama部署使用本地模型

Windows下通过Ollama部署使用本地模型 下载Ollama 安装主程序 Ollama下载exe,直接下一步下一步没有设置可以更改 windows默认安装路径在C盘 安装后会自动将该路径加入环境变量 双击图标运行后状态栏会出现小图标,右键有退出、打开日志文件夹按钮 通过…

mac配置Personal Access Tokens

背景 在macbook环境中,使用idea、android studio、xcode时,使用gitlab需要登录,而直接使用文明密码是不允许登录的,这时就需要换种方式,这里有两种:ssh、Access Tokens,在公用电脑上推荐使用Ac…

Linux网络的DHCP配置

文章目录 DHCP配置DHCP流程简述DHCP优点DHCP的分配方式DHCP的租约过程DHCP配置实验实验1实验2 DHCP配置 DHCP:动态主机配置协议 服务端和客户端 服务端:server,提供某种特定的服务 客户端:client,使用服务端提供的服…

R语言探索与分析18-基于时间序列的汇率预测

一、研究背景与意义 汇率是指两个国家之间的货币兑换比率,而且在国家与国家的经济交流有着举足轻重的作用。随着经济全球化的不断深入,在整个全球经济体中,汇率还是一个评估国家与国家之间的经济状况和发展水平的一个风向标。汇率的变动会对…

Thread Local六连问,你扛得住吗?

一、Thread Local 是什么? 线程本地变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每个线程都可以独立地改变自己的副本,而不影响其他线程,做到了线程隔离。 二、Thread Local …

HTB 靶场 Mailing 未完待续

访问网页 在/etc/hosts 添加ip和域名 hosts 文件包含ip地址与主机名之间的映射,还包括主机的别名。 Linux系统所有程序查询/etc/hosts文件解析对主机名或者域名的IP地址。没有找到就需要使用DNS服务器解释域名。 DNS原理 1 输入域名,在本地缓存服务…

【工具】Vmware17 安装mac(13.6.7)虚拟机

目录 0.简介 1.环境 2.详细步骤 2.1下载mac镜像(可以选择你所需要的) 2.2 VMware安装 1)创建新的虚拟机 2)选择【典型】,点击下一步 3)选择【安装程序光盘映像文件】,点击浏览&#xff…

公派/自费访问学者申请出国访学的常见问题解答(下)

06、学术背景和研究成果要求? 访学是面向学术单位和企事业单位开放的。 针对学术单位,比如高校与科研院所,学科内涉及的论文发表,课题研究,专利,著作,含金量较高的奖项等背景都是国外比较看重…

rollup.js(入门篇)

前沿 Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许…

亚马逊云,不想失去云计算的“铁王座”

文|白 鸽 编|王一粟 “生成式AI时代的黎明已经来临。” 亚马逊全球副总裁、亚马逊云科技大中华区总裁储瑞松在2024年亚马逊云中国科技峰会上,再次强调了生成式AI对于亚马逊云科技和整个行业的重要性。 事实上,从去年开始&a…

JVM 运行流程

JVM 是 Java 运行的基础,也是实现一次编译到处执行的关键,那么 JVM 是如何执行的呢? JVM 执行流程 程序在执行之前先要把java代码转换成字节码(class 文件), JVM 首先需要把字节码通过一定的 方式 类加…

独立游戏之路 -- 上架TapTap步骤和注意事项

个人开发者游戏上架TapTap上架步骤和注意事项 一、TapTap 介绍二、独立游戏上架 TapTap 的步骤2.1 创建游戏2.2 提交游戏审核2.3 TapTap 平台上发布。 三、注意事项3.1 关于备案3.2 遵守 TapTap 的规定3.3 保证游戏质量 四、常见问题4.1 隐私政策问题4.2 先发布还是先优化&…

Mybatis02-CRUD操作及配置解析

1、CRUD 1.namespace namespace中的包名要和Dao/Mapper 接口的包名一致! 1个Dao接口类对应1个mapper,也对应1个namespace, 1个Dao接口中的方法对应1个namespace中一个SQL语句 2.CRUD id:对应的namespace接口中的方法名resul…

【读书笔记】曼陀罗思考法

目录 1 起源2 路径示例——人生规划设计 3 分类3.1 扩展型“扩展型”曼陀罗——使用方法 3.2 围绕型 4 注意事项 1 起源 曼陀罗在梵文中意味着“圣地”,象征着宇宙的秩序和内心的神圣结构。 “曼陀罗思考法”,是由日本学者今泉浩晃发明的方法&#xff…

从零开始实现自己的串口调试助手(6) -换行问题

解决接收的自动换行 自动换行原因 --> 我们以append发送 会自动换行 换个api 即可 --> 我们换成 insertPlainText 添加自动换行 实现添加新行 修改的函数代码: on_btnSendContext_clicked void Widget::on_btnSendContext_clicked() {// const char * sendData ui->…

C#WPF数字大屏项目实战10--不良指标分页

1、区域划分 2、区域布局 3、视图模型 4、控件绑定 5、运行效果 走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,动动你的金手指,财务自由

java常见api :Math System

一. Math类 1.定义在那个包 java.lang包下 2.作用 (1)是一个帮助我们用于进行数学计算的工具类 (2)私有化构造方法,所有的方法都是静态的 3.常用的方法 (1)获取绝对值 System.out.println(Math.abs(-88)); 取值范围: -2147483648到21…

工信部《工业和信息化领域数据安全风险评估实施细则(试行)》实行,行云管家数据产品助力企业数据安全

2024年6月1日,工信部颁布的《工业和信息化领域数据安全风险评估实施细则(试行)》(以下简称《细则》)开始实行,旨在引导工业和信息化领域数据处理者规范开展数据安全风险评估工作,提升数据安全管…

精打细算:可燃气体报警器检验收费的合理规划与管理

随着工业化的快速发展,可燃气体报警器已经成为各类工业场所不可或缺的安全设备。 它的主要功能是在可燃气体浓度超标时发出警报,有效预防和减少火灾、爆炸等安全事故的发生。 然而,为了确保报警器能够持续、准确地发挥作用,定期…