10. Python 上下文管理器

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:
工💗重💗hao💗:野老杂谈
⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.
⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。
⭐️ 全流程数据技术实战指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台和数据仓库的核心技术和方法。
⭐️ 构建全面的数据指标体系:通过深入的理论解析、详细的实操步骤和丰富的案例分析,为读者提供系统化的指导,帮助他们构建和应用数据指标体系,提升数据驱动的决策水平。
⭐️《遇见Python:初识、了解与热恋》 :涵盖了Python学习的基础知识、进阶技巧和实际应用案例,帮助读者从零开始逐步掌握Python的各个方面,并最终能够进行项目开发和解决实际问题。

摘要

上下文管理器与 with 语句是 Python 中的一对好搭档,它们让资源管理变得更加优雅和安全。本文将通过通俗易懂的讲解和有趣的案例,帮助读者掌握上下文管理器的概念、实现方法,以及如何在实际开发中使用它们。读完本文后,你将能够轻松地运用 with 语句,使代码更加简洁、可靠,并避免常见的资源管理问题。

标签: Python、上下文管理器、with 语句、资源管理、编程技巧


什么是上下文管理器?

概念解析

上下文管理器是一个对象,它定义了进入和退出某个上下文(通常是资源管理的上下文)所需的操作。通常,上下文管理器是通过实现 __enter____exit__ 方法的类来定义的。

class MagicDoor:
    def __enter__(self):
        print("打开魔法门")
        return self
    
    def __exit__(self, exc_type, exc_value, traceback):
        print("关闭魔法门")
故事:魔法门的守护者

你是一名魔法学徒,每次进入魔法图书馆学习时,都会通过一扇神秘的魔法门。图书馆的守护者教你如何正确地打开和关闭这扇门,确保里面的魔法能量不外泄。上下文管理器就像这扇魔法门,确保资源被正确管理。

with 语句的基本用法

进入上下文

with 语句是使用上下文管理器的方式,它能让你自动调用上下文管理器的 __enter____exit__ 方法,从而简化资源管理的过程。

with MagicDoor():
    print("在魔法图书馆中学习")

输出结果:

打开魔法门
在魔法图书馆中学习
关闭魔法门

with 语句执行时,它会自动调用上下文管理器的 __enter__ 方法,进入上下文。当 with 语句块执行完毕后,无论是否发生异常,都会调用 __exit__ 方法来退出上下文并清理资源。

故事:轻松进出魔法图书馆

你走到魔法门前,只需要轻轻念出“with”的咒语,魔法门就会自动为你打开。你在图书馆中学习,完全不用担心如何关闭大门,因为当你走出图书馆时,大门会自动关闭,毫不费力。

上下文管理器的实际应用

文件操作中的上下文管理器

在 Python 编程中,最常见的上下文管理器之一就是文件操作。如果你曾经用过 open 函数,你可能已经用到了上下文管理器。

with open('magic_book.txt', 'w') as file:
    file.write('这是一本魔法书')

在这个例子中,open 函数返回的文件对象就是一个上下文管理器。当 with 块执行完毕后,文件会自动关闭,即使在写入过程中发生异常也是如此。

故事:魔法书的保护者

想象一下,你拥有一本神秘的魔法书,只有在特定的仪式下才能打开书写。当你完成书写后,这本书会自动关闭,防止其他人窥探。使用 with 语句写入文件,就像你在进行这种仪式,确保文件安全无误地被关闭。

数据库连接的上下文管理

上下文管理器在数据库连接中也非常有用。我们可以通过 with 语句来确保数据库连接被正确关闭,即使在操作中出现了错误。

import sqlite3

with sqlite3.connect('magic_library.db') as conn:
    cursor = conn.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS spells (name TEXT)')
    cursor.execute("INSERT INTO spells VALUES ('Fireball')")
    conn.commit()

这个例子展示了如何使用上下文管理器来简化数据库连接管理。with 语句确保了数据库连接在操作完成后被安全关闭。

故事:魔法数据库的开启与关闭

作为一名魔法师,你的数据库记录了所有的魔法咒语。当你需要查阅或更新咒语时,你只需打开数据库,并确保在结束后将其关闭,以免魔法信息泄露或损坏。

自定义上下文管理器

创建你自己的上下文管理器

有时候,内置的上下文管理器不足以满足你的需求,这时你可以创建自己的上下文管理器。只需实现 __enter____exit__ 方法即可。

class PotionMaker:
    def __enter__(self):
        print("准备好所有药水成分")
        return self
    
    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            print(f"哦不!发生了 {exc_value} 错误,药水溢出了!")
        print("清理所有药水工具")
    
    def brew(self):
        print("开始调制魔法药水")
with PotionMaker() as maker:
    maker.brew()

输出结果:

准备好所有药水成分
开始调制魔法药水
清理所有药水工具

在这个例子中,PotionMaker 类实现了一个简单的上下文管理器,用于处理药水调制过程中的准备和清理工作。

故事:魔药师的日常工作

你是一名经验丰富的魔药师,每次调制药水时,你都需要准备好所有的工具和材料。调制完毕后,你会小心地清理现场,确保没有任何危险的药水残留。上下文管理器就像你的助手,帮你自动完成这些工作。

上下文管理器中的异常处理

处理上下文中的异常

上下文管理器不仅能管理资源,还能帮助你处理异常。在 __exit__ 方法中,你可以捕捉到在 with 语句块中发生的异常,并决定是否处理它。

class PotionMaker:
    def __enter__(self):
        print("准备好所有药水成分")
        return self
    
    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            print(f"哦不!发生了 {exc_value} 错误,药水溢出了!")
            return True  # 表示异常已经被处理
        print("清理所有药水工具")
    
    def brew(self):
        print("开始调制魔法药水")
        raise ValueError("加了错误的成分!")

with PotionMaker() as maker:
    maker.brew()

输出结果:

准备好所有药水成分
开始调制魔法药水
哦不!发生了 加了错误的成分! 错误,药水溢出了!

在这个例子中,__exit__ 方法捕捉到了 ValueError 异常,并选择处理它,从而防止异常传播。

故事:应对意外的魔法事故

即使你是一位经验丰富的魔药师,也难免会在调制药水时遇到意外的事故。幸运的是,你已经有了足够的应对经验,能够在事情失控前迅速采取措施。上下文管理器的异常处理功能就像你应对意外的防护机制,帮助你快速反应。

上下文管理器的嵌套与组合

嵌套上下文管理器

有时你需要同时管理多个资源,这时你可以嵌套使用 with 语句,或者在 Python 3.10 及以上版本中使用 contextlib 模块提供的 ExitStack

with open('magic_book.txt', 'w') as book, sqlite3.connect('magic_library.db') as conn:
    book.write('新的魔法知识')
    cursor = conn.cursor()
    cursor.execute("INSERT INTO spells VALUES ('Invisibility')")
    conn.commit()

或者使用 ExitStack

from contextlib import ExitStack

with ExitStack() as stack

总结:门内门外的小故事

想象一下,你走进一间魔法屋,屋里有着无尽的宝藏和秘密,但每次进去之前,你都要打开那扇厚重的木门,并且在离开时一定要记得关上,否则后果不堪设想。编程世界中也有这样的“魔法门”,需要我们在进入资源时小心开启,并在使用完后谨慎关闭。这时候,Python 的上下文管理器和 with 语句就是那把完美的“钥匙”,帮你轻松搞定资源管理问题。

在这里插入图片描述

  • 27
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野老杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值