Python上下文管理器简化-深入理解并简化代码资源的分配与释放

Python上下文管理器,资源管理,错误处理,代码清晰,减少样板代码

在特定代码块内部,Python中的上下文管理器是用于管理资源的对象。它们通常与`with`语句一起使用,确保即使发生异常,也能正确地清理资源。

上下文管理器定义了`__enter__()`和`__exit__()`方法。`__enter__()`方法用于在执行代码块之前设置资源,而`__exit__()`方法用于在执行代码块之后清理资源,无论代码块是否成功完成或引发异常。以下是一个简单的示例:

class Resource:
    def __enter__(self):
        print('分配外部资源')
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        print('清理外部资源')
        if exc_type is not None:
            print(f"发生了类型为{exc_type}的异常,消息为: {exc_value}")
with Resource() as r:
    print('资源执行')

代码的执行顺序是:分配外部资源、资源执行和清理外部资源。

我们还可以使用`contextlib`模块和`@contextmanager`装饰器创建上下文管理器。上面的代码可以使用`contextlib`模块进行重写:

from contextlib import contextmanager
@contextmanager
def context_manager():
    try:
        print('分配外部资源')
        yield
        print('清理外部资源')
    except Exception as e:
        print(f"在清理过程中发生异常: {e}")
with context_manager() as cm:
    print('资源执行')

同样,代码的执行顺序是相同的:分配外部资源、资源执行和清理外部资源。

被`@contextmanager`装饰的函数有三个部分:

  • `yield`语句之前的代码段类似于`__enter__()`方法。

  • `yield`语句产生的值将绑定到`with`语句中的`as`后的变量。

  • `yield`语句之后的代码段执行的任务类似于`__exit__()`方法。

使用`@contextmanager`装饰器可以使代码更加可读和简洁。

让我们通过使用`contextlib`方法来探索计时代码块的场景。

from contextlib import contextmanager
import time 
@contextmanager
def timer():
    start_time = time.time()
    yield
    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f"耗时: {elapsed_time} 秒")
with timer():
    numbers = [10,20,30,40,100,80,32]
    print([n for n in numbers if n > 40])

输出结果:[100, 80] 耗时: 0.0008141994476318359 秒

上下文管理器的常见应用场景包括:

  • 文件处理:在读取或写入文件后自动关闭文件。

with open('Details.txt', 'r') as file:
    content = file.read()
  • 网络连接:管理网络连接,确保正确设置和清理。

with open_socket('test.com', 80) as connection:
    # 执行操作
  • 数据库连接:确保正确打开和关闭数据库连接。

with open_database_connection() as conn:
    # 执行操作
  • 线程同步:管理线程同步以进行并发操作。

with thread_lock():
    # 执行操作
  • 自定义资源管理:为特定资源管理实现自定义上下文管理器。

with Resource() as resource:
    # 执行操作

上下文管理器在提高代码可读性、减少冗余以及确保正确管理资源(即使存在异常)方面起着至关重要的作用。它们有助于编写更清晰、更易于维护的代码。

上下文管理器的优势包括:

  1. 资源管理:上下文管理器确保在不再需要时正确获取和释放资源。对于文件句柄、网络连接或数据库连接等资源来说尤其重要。

  2. 错误处理:它们优雅地处理异常,甚至在嵌套的上下文中也能如此。无论`with`块内部发生异常与否,上下文管理器的`__exit__`方法都会被调用,从而实现了正确的清理和错误处理。

  3. 代码清晰度:使用`with`语句提供了一种清晰简洁的方式来表达设置和清理操作。这增强了代码的可读性,使其更易于理解。

  4. 减少样板代码:上下文管理器减少了重复的设置和清理代码的需求。这在资源获取和释放模式一致的情况下尤为明显。

在Python API中,使用上下文管理器遵循统一的模式。这种一致性增强了库和框架的整体设计,使开发人员更容易理解和使用它们。上下文管理器简化了资源的管理。

小结

Python中的上下文管理器是用于管理资源分配和释放的重要工具。通过使用`with`语句,我们可以确保资源的正确获取和释放,优雅地处理异常,并编写更清晰、更易于维护的代码。上下文管理器可以应用于各种常见场景,如文件句柄、网络连接和数据库连接等。使用`contextlib`模块中的`@contextmanager`装饰器可以进一步简化上下文管理器的实现过程。在编写Python代码时,务必考虑使用上下文管理器来提高代码质量和可靠性。


文章来源地址https://www.toymoban.com/diary/python/653.html

到此这篇关于Python上下文管理器简化-深入理解并简化代码资源的分配与释放的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/python/653.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
上一篇 2024年01月01日 17:52
为什么说SQL看起来像英语是一个错误的设计?
下一篇 2024年01月01日 18:30

相关文章

  • 深入理解JavaScript堆栈、事件循环、执行上下文和作用域以及闭包

    在JavaScript中,内存堆是内存分配的地方,调用栈是代码执行的地方。 原始类型的保存方式:在变量中保存的是值本身,所以原始类型也被称之为值类型。 对象类型的保存方式:在变量中保存的是对象的“引用”,所以对象类型也被称之为引用类型。 调用栈理解非常简单,当

    2024年02月03日
    浏览(20)
  • 【Python】Flask上下文管理

    current_app 类型:用用上下文的代理对象 主要用途:提供对当前激活的Flask应用实例的访问。通常访问应用配置,注册的蓝图,应用级别的数据等等 使用场景:在视图函数,错误处理器或者其他任何需要访问应用配置和属性的地方 实际数据实例:‘current_app.config[‘DEBUG’]’可

    2024年03月18日
    浏览(27)
  • Python_上下文管理器

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

    2024年02月11日
    浏览(25)
  • Python函数-上下文管理器

    上下文管理协议(Context Management Protocol):包含方法 enter () 和 exit (),支持该协议的对象要实现这两个方法。 上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__() 和 exit () 方法。 上下文管理器定义执行 with 语句时要建立的运行时上下文,负

    2024年02月12日
    浏览(17)
  • python 上下文管理器 with 语句

    上下文管理器 with 语句可以自动地分配和释放资源。 这篇文章中介绍了文件读写的方法,每次读取文件时要使用 open() 函数打开文件,使用结束后要用 close() 函数关闭文件。有时,我们会忘记关闭文件,或者打开了许多文件占用太多资源。使用上下文管理器 with 语句可以方便

    2023年04月09日
    浏览(27)
  • Python高级语法:with语句和上下文管理器

    1.文件操作说明: ①文件使用完后必须关闭。 ②因文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。 例如:  2. 存在的安全隐患: ① 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。 例如: 运行结果: 3.try…except…

    2024年02月04日
    浏览(20)
  • Python教程(27)——如何使用Python中的上下文管理器

    当我们在编写代码时,经常会遇到需要管理资源的情况,比如打开和关闭文件,如果遇到了一些异常情况,我们需要关闭资源,不然会导致资源泄露,虽然我们可以通过手动的方式来关闭,但如果有多个异常情况需要考虑的话,万一不小心漏了一处,就芭比Q了。所以,如果有

    2024年02月19日
    浏览(23)
  • 【人工智能】LLM大模型中的词嵌入和上下文理解技术实例讲解,附具体的代码例子

    词嵌入(Word Embeddings)可以将高维的文本数据转换成低维的稠密向量表示,在进行自然语言处理任务时,这样的表示方式可以帮助算法理解词语之间的相似性以及上下文关系。以下是一个使用 TensorFlow 和 Keras 实现 Word2Vec 词嵌入模型的代码实例。 使用 TensorFlow 和 Keras 的 Word

    2024年02月07日
    浏览(33)
  • 从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

            当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是 中断执行完毕后要恢复到原来执行的程序 ,除了时间流逝外,原来运行的程序应该毫无感知。        

    2024年02月11日
    浏览(23)
  • 【 Python 全栈开发 - WEB开发篇 - 38 】property和上下文管理器

    Python 是一个简洁而强大的编程语言,通过提供各种特性和工具,使开发人员能够更高效地进行编程。其中一个非常有用的特性是 @property 装饰器,它允许我们在类中定义属性并自定义其行为。 @property 装饰器用于将一个方法转换为类的属性。使用 @property 装饰器,我们可以像访

    2024年02月13日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包