Python_上下文管理器

Python上下文管理器原理与实践 在上下文管理器内部可以捕获并处理特定类型的异常,甚至改变异常行为。通过在__exit__方法中处理异常,可以确保即使在执行过程中发生了错误,相关资源也会得到恰当的清理,避免了资源泄露的风险。例如,在处理数据库事务时,事务的开始和结束都需要进行适当的控制,以确保数据的一致性。使用上下文管理器,我们可以确保在事务结束时,无论中间的操作是否成功,都能够正确地提交或回滚事务。return self.connection # 返回连接以执行SQL操作。 阅读详情

目录

上下文管理器类

多上下文管理器

contextmanager实现上下文管理器


上下文管理器(context manager)是 Python 编程中的重要概念,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with...as...

为了确保一些系统资源得以正确释放,我们经常会用到 try ... excepte ... finally 语句。如:

try:
   f = open('somefile')
   for line in f:
       print(line)
except Exception as e:
   print(e)
finally:
    f.close()

上面的代码模式,从用复用代码的模式来讲,并不够好。于是 with 语句出现了,通过定义一个上下文管理器来封装这个代码块:

with open('filename', 'r') as f:
   for line in f:
          print(line)

显然,with 语句比 try 语句简洁了许多。

上下文管理器类

由于 with 语句利用了上下文管理器,在深入理解 with 语句之前,我们先看看上下文管理器。我们要定义一个上下文管理器其实很简单,只要一个类实现了__enter__(self)和__exit__(self, exc_type, exc_valye, traceback)我们就叫他上下文管理器

__enter__(self) 返回一个对象,可以是当前类的实例,也可以是其他对象。

class SomeThing:
   def __enter__(self):
       return self        # 返回类实例

class LineLength:
   def __init__(self, filepath):
       self.__file = open(self.__filepath)

   def __enter__(self):
       return self.__file        # 返回其他对象

执行过程

下面让我们看看 with 语句具体是如何执行的。

第一步:执行上下文表达式以获得上下文管理器对象。上下文表达式就是 with 和 as 之间的代码。

第二步:加载上下文管理器对象的 __exit__()方法备用。

第三步:执行上下文管理器对象的__enter__()方法。

第四步:将__enter__()方法返回值绑定到 as 后面的 变量中。

第五步:执行 with 内的代码块。

第六步:执行上下文管理器的__exit__()方法。

如果在代码块中发生了异常,异常被传入__exit__()中。如果没有,__exit__()的三个参数会传入 None, None, None。__exit__()需要明确地返回 True 或 False。并且不能在__exit__()中再次抛出被传入的异常,这是解释器的工作,解释器会根据返回值来确定是否继续向上层代码传递异常。当返回 True 时,异常不会被向上抛出,代码会从报异常的代码处跳出上下文管理继续执行代码,当返回 False 时会向上抛出,阻断代码执行。当没有异常发生传入__exit__()时,解释器会忽略返回值。

import time


class File(object):
    def __init__(self, filename, mode):
        print("上下文管理执行顺序:\n1、执行初始化方法")
        self.f = open(filename, mode)

    def __enter__(self):
        print("2、执行__enter__()方法")
        return self     # "__enter__()方法的返回值绑定到 as 后面的 变量中

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        :param exc_type:如果抛出异常,返回异常类型,否则返回None
        :param exc_val:如果抛出异常,返回异常内容,否则返回None
        :param exc_tb:如果抛出异常,返回异常位置,否则返回None
        :return:
        """
        print("4、执行__exit__()方法")
        if exc_type:
            print(exc_type, "\n", exc_val, "\n", exc_tb)

        # 若代码块报错则立即执行__exit__()方法中的代码;若代码块没报错,执行完代码块后执行__exit__()方法中的代码"
        self.f.close()
        time.sleep(1)
        # return True     # 当返回 True 时,异常不会被向上抛出,代码会从报异常的代码处跳出上下文管理继续执行代码,
        return False    # 当返回 False 时会在__exit__()方法执行完后向上抛出,阻断代码执行。

    def reads(self):
        return self.f.read()


with File("README.md", "rb") as f:
    print("3、执行代码块代码")
    # 代码块部分
    f.reads()
    # 代码块报错,报错后的代码不会被执行
    print("若代码块报错,“我”不被执行;将r改为rb,代码块不报错“我”就执行")
print("若代码块报错,__exit__()方法中返回 Ture “我”才执行;若代码块不报错,“我”也执行")

执行结果:

把"rb"改为"r"后执行结果:

 

多上下文管理器

实际上,我们可以同时处理多个上下文管理器:

with A() as a, B() as b:
   suite

所以我们大可不必写嵌套的 with 语句。

contextmanager实现上下文管理器

Python还提供了一个contextmanager的装饰器,更进一步简化了上下文管理器的实现方法。通过yield将函数分割成两部分,yield之前的部分相当于在__enter__方法中执行,yield之后的部分相当于在__exit__方法中执行,紧跟在yield之后的返回值给as之后的变量。

from contextlib import contextmanager


class File:
    def __init__(self, filename, mode):
        self.f = open(filename, mode)

    def reads(self):
        return self.f.read()

    def closed(self):
        self.f.close()


@contextmanager
def read_file():
    print(1)
    rf = File("README.md", "rb")
    yield rf
    print(3)
    rf.closed()


with read_file() as f:
    print(2)
    f.reads()

执行结果:

 把"rb"改为"r"后执行结果:

 注:当报错后,没有打印3,不清楚yield下面的代码是否执行。


-事必有法,然后有成- 最后祝大家早日达到测试的天花板!



 以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以评论区,留言【777】直接拿走就好了

 

Python 中的上下文管理器(Context Manager):文件操作与资源管理 语句管理资源的生命周期,确保资源在使用后得到正确释放。我们可以使用内置的上下文管理器(如文件操作、数据库连接、锁等),也可以根据需要自定义上下文管理器来实现更加灵活的资源管理。虽然 Python 提供了许多内置的上下文管理器,我们也可以根据需要自定义上下文管理器,特别是在需要控制资源初始化和清理时。本文将深入探讨 Python 中的上下文管理器,讲解如何使用内置的上下文管理器,并展示如何自定义上下文管理器来管理资源。语句来创建一个“上下文”,在该上下文内执行的代码块能自动获得资源,并在退出时自动释放资源。 阅读详情

相关推荐

Python进阶之-上下文管理器

本文介绍了Python中的上下文管理器,包括其基本概念、组成、标准库中的应用、自定义上下文管理器的实现以及contextlib模块的使用。重点强调了上下文管理器在资源管理、异常处理和代码整洁性方面的优势。

u011352768的博客 902

Python | 基础 | contextmanager

contextmanager 来自 contextlib 包,通常使用时要进行导入:from contextlib import contextmanager contextmanager 作为上下文管理器,主要的作用就是在执行某些逻辑之前,做一些预备工作;执行完逻辑代码之后,做一些收尾和善后 工作。 首先我们自己实现一个上下文管理器类,用于讲述一下基础原理。 # -*- coding:utf-8 -*- class MyNewClass(object): #执行with语句时,先执行.

解决自己遇到的问题 分享认为有意义的知识 提供有一点点参考价值的灵感 3402

深入理解Python中的装饰器和上下文管理器

装饰器和上下文管理器是Python中的两个重要概念,它们提供了灵活和可维护的方式来扩展和修改函数的行为。在实际应用中,我们可以根据需要创建自定义的装饰器和上下文管理器,以满足特定的需求。通过使用这个装饰器,我们可以确保在函数执行完毕后数据库连接被正确关闭,避免了资源泄漏的问题。例如,我们可以创建一个装饰器,该装饰器使用上下文管理器来管理资源的生命周期,以确保在函数执行完毕后资源被正确释放。装饰器是Python中的一种高阶函数,它可以接受一个函数作为输入,并返回一个新的函数。类,它实现了上下文管理器的协议。

weixin_71166183的博客 614

python基础 — 上下文管理器

自定义上下文管理器运行结果:自定义一个上下文管理器 MyContextManager ,包含__enter__和__exit__方法。分析运行结果可知其执行过程:首先执行类中的方法,它总是在进入代码块前被调用的接着就执行代码块——with语句下面的代码块离开的时候又调用类中的__exit__()...

个人博客 3039

在 Python 中使用上下文管理器context manager的 5 个层次

由于每台机器的计算资源都是有限的,因此每个程序都需要考虑资源管理。比如文件处理,最好在使用完文件后将其关闭。files = []因此,只要不再需要,就应关闭每个已打开的文件。Python 有相对的内置函数built-in functions,因此我们可以方便地打开和关闭文件。")f.close()上述程序是可行的。但是,如果open()和close()之间的处理过程变得更加复杂,并且出现错误,那么没有人能够保证文件最终会被关闭。

Null的博客 1510

一文掌握python上下文管理器(with语句)

理解Python上下文管理器主要涉及到几个核心概念:上下文管理协议、with语句以及如何自定义上下文管理器。

qq_38120851的博客 1234

Python上下文管理器

1. 上下文管理器 一个类只要实现了 __enter__() 和 __exit__() 这个两个方法,通过该类创建的对象我们就称之为上下文管理器。 上下文管理器可以使用 with 语句,with语句之所以这么强大,背后是由上下文管理器做支撑的,也就是说刚才使用 open 函数创建的文件对象就是就是一个上下文管理器对象。 自定义上下文管理器类,模拟文件操作: 定义一个File类,实现 __enter__() 和 __exit__() 方法,然后使用 with 语句来完成操作文件, 示例代码: # 自定义上下

南枝向暖北枝寒 8053

Python上下文管理器详解

首先,看一个简单的例子:#创建一个文件写入字符串“Python” f=open('123.txt','w') f.write("pytho...

吾非同 2232

一文搞懂Python上下文管理器

什么是上下文管理器,一文搞懂

曲鸟 8095

⭐️白嫖的阿里云认证⭐️ 【真题&参考答案】:大模型Clouder认证:利用大模型提升内容生产能力

【摘要】真题「大模型Clouder认证:利用大模型提升内容生产能力」

davidkorhenn的博客 1921

RAGFlow核心引擎DeepDoc之PDF解析大起底

本文深入解析RAGFlow中的deepdoc模块,重点介绍了pdf文档解析器的实现细节。deepdoc包含parser(文档解析器)和vision(视觉处理)两大核心功能,其中pdf解析是最复杂的部分。文章详细剖析了PdfParser类的设计架构,包含PlainParser(基础文本提取)、RAGFlowPdfParser(核心处理流水线)和VisionParser(视觉扩展)三个类,它们通过统一的__call__方法返回标准化结果。还具体讲解了初始化过程如何加载OCR引擎、布局识别模型、表格结构识别器等关

yxkong的专栏 2022

Python笔记之上下文管理器

本章节详细讲解Python中的上下文管理器,包括自定义上下文管理器和with语句的深度理解。上下文管理器提供了一种简洁的方式来管理资源的获取与释放,尤其在文件操作、数据库连接等场景中得到广泛应用。自定义上下文管理器通过实现__enter__和__exit__方法来定义资源的获取与释放行为。__enter__方法用于在with语句块开始时进行资源的初始化。__exit__方法用于在with语句块结束时释放资源。print("资源已获取")

K 1057

手把手教你学 AI芯片 SOC软件开发专栏简介

在AI芯片(如NPU、GPU加速器)爆发式增长的今天,软件栈开发已成为AI应用落地的核心瓶颈。无论是模型推理加速、低延迟部署,还是能效优化,都依赖于对芯片底层软件的深度掌握。然而,许多开发者困于“只会调用API,不懂驱动实现”的困境,导致性能瓶颈难以突破。本专栏《手把手教你学 AI芯片 SOC软件开发》专为AI工程师、嵌入式开发者及系统架构师打造,从零基础切入,系统拆解AI芯片SOC(System on Chip)的完整软件栈,覆盖Runtime(运行时)

MHD0815的博客 168

Python 上下文管理器

contextlib 是 Python 的一个标准库模块,它提供了用于创建上下文管理器的装饰器和上下文管理器类。上下文管理器主要用于 with 语句,帮助自动管理资源,如文件操作、线程锁的获取与释放等,使得代码更加简洁、安全。上下文管理器协议:是指要实现对象的 __enter__() 和 __exit__() 方法。contextlib 模块中最常用的工具是。

lIujunXHU的博客 1306

Android系统内存和性能关系的调研

摘要:本文分析了低内存导致性能问题的判断方法和评估思路。通过监控/proc/vmstat中的allocstall_normal、pageoutrun等指标可判断内存回收频率,当MemFree、MemAvailable和Cached均低于500MB时可能出现明显卡顿。全文通过实验和理论验证分析,回答因内存瓶颈导致性能问题的一些分析和解决的思路。

jidapenglin28的专栏 129

机器学习实战7-基于机器学习算法预测相亲成功率

大家好,我是微学AI,今天给大家介绍一下机器学习实战7-基于机器学习算法预测相亲成功率,随着社会的发展,大家都忙于事业,对自己的终身大事就耽搁了,相亲是一种传统的寻找伴侣的方式,随着时代的发展,相亲的方式也在不断地改变。在这个过程中,了解相亲双方的信息以及预测相亲是否成功变得越来越重要。本文将介绍如何使用随机森林算法对相亲成功进行预测,通过分析男女双方的房子、车子、长相、家庭条件、父母情况、生活习惯、学历、性格、兴趣等因素,来预测相亲是否成功。

微学AI的博客 3032

【Python】【进阶】上下文管理器

上下文管理器

yao123698745的博客 2040

【基础演练】Playwright 极简复习:作为 AI-RPA 底座的 Playwright 核心用法

摘要: 2026年,Playwright已从测试工具升级为AI-RPA标准执行底座,周下载量超3300万,被browser-use等AI Agent项目广泛采用。其核心架构通过Playwright Server实现多浏览器协议适配,支持远程连接与高并发隔离(BrowserContext)。自动等待机制显著提升稳定性,但高频交互场景可能需直接使用CDP协议。Playwright凭借跨浏览器兼容性、轻量级隔离和微软官方支持,成为测试、RPA和AI Agent领域的事实标准,未来将主导对话式自动化市场。

ZDQ58818的博客 237

Python的上下文管理器

Python中的上下文管理器提供了一种优雅的方式来管理资源的分配和释放。通过上下文管理器,我们可以确保资源在使用后被正确释放,避免资源泄漏和其他问题。本文介绍了上下文管理器的基本概念、常见使用场景以及如何通过类和生成器实现上下文管理器。掌握上下文管理器的使用将极大地提高代码的健壮性和可维护性。

weixin_55100524的博客 920

Wi-Fi QoS中AIFSN/CWmin/CWmax/TxOP参数是怎样计算的?

802.11e/WMM的EDCA机制通过AIFS、CWmin/CWmax和TxOP三组参数实现业务优先级控制。AIFS决定最短等待时间(AIFS=SIFS+AIFSN×SlotTime),CWmin/CWmax定义退避范围(2^ECW-1),TxOP设置最大占用时长(32µs单位)。默认配置中,语音业务(VO)优先级最高,其AIFSN最小(2)、CW范围最小(3-7)、TxOP适中(1.504ms);视频(VI)次之;普通数据(BE)和后台(BK)优先级最低。调优需根据网络特性调整参数:VoIP可降低AIF

1042484520@qq.com(邮箱) 1744

uniapp - 实现 App 端 “半屏幕“ 连续扫码功能,页面只有半个屏幕是扫码框并且可持续连续扫码获取数据(不使用官方 uni.scanCode API,因为无法连续扫码!)详细示例源码插件教程

uniapp app端实现半屏幕扫码,uniapp 扫一扫半个屏幕,uniapp 扫一扫,uniapp持续扫码实现,uniapp怎么自定义扫码和连续扫码,uni-app App端半屏连续扫码,uniapp 扫一扫半个屏幕,uniapp自定义扫码页面样式,实现连续扫码功能(uniapp),uniapp - 实现 App 端 "半屏幕" 连续扫码功能,页面只有半个屏幕是扫码框并且可持续连续扫码获取数据(不使用官方 uni.scanCode API,因为无法连续扫码!)详细示例源码插件教程。

✅ 精选推荐文章 1万+

Python中上下文管理器解析

其工作流程如下:当使用语句时,首先会调用上下文管理器的方法。这通常包括一些预处理操作,如打开文件、获取锁等。在with语句的代码块内执行用户定义的操作。这些操作可以是任何Python代码。当代码块执行完毕后,会自动调用上下文管理器的方法。这通常包括一些清理操作,如关闭文件、释放锁等。要实现一个上下文管理器,可以通过以下两种方式:可以通过实现 和 方法来自定义上下文管理器。例如: 输出为: Python 提供了 contextlib 模块,帮助简化上下文管理器的创建。特别是装饰器,可以将一个生成器函数转换

墨辰JC的博客 933

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

第14篇:从入门到精通:掌握python上下文管理器

*上下文管理器(ContextManager)**是Python中用于管理资源(如文件、网络连接、锁等)的一个对象,它定义了在进入和退出上下文时需要执行的操作。上下文管理器通过实现和__exit__()方法,确保在使用完资源后能够正确地进行清理操作,避免资源泄漏。要创建一个自定义的上下文管理器,可以定义一个类,并实现和__exit__()方法。

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2111

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

探索Python中的上下文管理器

上下文管理器是遵循特定协议的对象,这个协议包括和__exit__()两个魔术方法。方法在with语句的代码块执行前被调用,而__exit__()方法则在代码块执行完毕后被调用,无论代码块是否正常结束或者因为异常而终止。自定义上下文管理器是Python中一项强大的功能,它允许开发者封装资源的获取和释放逻辑,确保资源使用完毕后能够正确地进行清理。在这一节中,我们将探讨如何创建自定义上下文管理器,并提供多个示例来展示其应用。自定义上下文管理器非常有用,特别是在处理那些Python标准库没有提供内置支持的资源时。

无远弗届 1005

【Python】上下文管理器

上下文管理器是Python中用于管理资源(如文件、数据库连接、锁等)的机制,通过with语句简化资源获取和释放的代码。其核心原理是实现__enter__()和__exit__()方法:__enter__()在代码块执行前初始化资源,__exit__()确保无论是否发生异常都能正确释放资源。常见使用场景包括文件操作、数据库连接等,可以有效避免资源泄漏问题。自定义上下文管理器只需实现这两个方法,还能在__exit__()中处理特定异常。相比try-finally方式,上下文管理器使代码更简洁、安全。

m0_72516377的博客 1406
上一篇: Python中类的变量,一个下划线与两个下划线的区别
下一篇: Python web框架开发 - WSGI协议
bug捕手
博客等级 码龄4年 899粉丝 417原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值