Python 中的带括号的上下文管理器2024 年 08 月 29 日 | 阅读 9 分钟 上下文管理器是 Python 中用于管理资源并确保在使用后正确清理资源的重要工具。Python 中的语句提供了使用上下文管理器的便捷语法。但是,有时我们需要使用带有附加参数的上下文管理器;为此,我们可以使用带括号的上下文管理器。 在本教程中,我们将探讨 Python 中的带括号上下文管理器。我们将首先讨论一般的上下文管理器,然后转向带括号的上下文管理器。我们将介绍使用带括号上下文管理器的语法,并提供一些何时它们可能有用处的示例。 Python 中的上下文管理器Python 中的上下文管理器是定义了两个方法(__enter__ 和 __exit__)的对象。当对象在语句中用作上下文管理器时,__enter__ 方法在代码块开始时调用,__exit__ 方法在代码块结束时调用。__enter__ 方法可以选择返回一个值,该值可以赋值给语句中的变量。 上下文管理器的目的是管理需要正确获取和释放的资源。例如,文件对象可以用作上下文管理器,以确保在使用后正确关闭文件 在此示例中,open 函数返回一个文件对象,该对象在语句中用作上下文管理器。文件对象的 __enter__ 方法打开文件进行读取,而 __exit__ 方法在退出块时关闭文件。 带括号的上下文管理器带括号的上下文管理器是带参数的上下文管理器。我们需要将参数传递给 with 语句,以便与 with 语句一起使用带括号的上下文管理器。使用带括号上下文管理器的语法如下: 在此语法中,context_manager 是定义 __enter__ 和 __exit__ 方法的对象,args 是要传递给 __enter__ 方法的参数,variable 是接收 __enter__ 方法返回值的可选变量。 让我们看一个例子。假设我们有一个数据库连接对象,它接受用户名和密码作为参数 在此示例中,我们定义了一个数据库连接类,该类在其构造函数中接受用户名和密码作为参数。__enter__ 方法使用 sqlite3 模块打开与 SQLite 数据库的连接并返回连接对象。__exit__ 方法在退出块时关闭连接。 要将此类别用作 with 语句的上下文管理器,我们传递用户名和密码作为参数 在此示例中,我们使用 DatabaseConnection 类作为上下文管理器来打开与 SQLite 数据库的连接。我们将用户名和密码作为参数传递给 with 语句,并且连接对象从 __enter__ 方法返回并分配给 conn 变量。然后,我们使用连接对象执行 SQL 查询并获取结果。 在此示例中,我们使用带括号的上下文管理器将参数传递给 DatabaseConnection 类的 __enter__ 方法。这使我们能够将相同的上下文管理器类与不同的参数一起重用。 带括号的上下文管理器也可以与内置上下文管理器一起使用,例如 zipfiles.ZipFile。例如,我们可以使用带括号的上下文管理器从 ZIP 存档中提取文件 在此示例中,我们使用 ZipFile 对象作为上下文管理器打开 ZIP 存档。然后,我们使用带括号的上下文管理器与我的 zip.Open 方法一起从存档中提取 example.txt 文件。从我的 zip 返回的文件对象。open 方法用作上下文管理器,以确保在读取文件后正确关闭文件。 我们已经看到了带括号的上下文管理器如何与自定义上下文管理器类和内置上下文管理器(例如 zipfiles.ZipFile)一起使用的示例。使用带括号的上下文管理器可确保资源得到正确管理,并在使用资源后正确执行清理。 上下文管理器是 Python 中的一个重要工具,带括号的上下文管理器为使用带参数的上下文管理器提供了便捷的语法。我们可以使用上下文管理器和带括号的上下文管理器编写更健壮、更可靠的代码。 它们允许我们自动管理资源并确保它们得到正确清理,即使在出现错误或异常的情况下也是如此。 如果您尚未在 Python 代码中使用上下文管理器,则应考虑使用它们。上下文管理器可以帮助您编写更清晰、更易读且更可靠的代码。 如果您需要将参数传递给上下文管理器类的 __enter__ 方法,请记住可以使用带括号的上下文管理器。这可以使您的代码更灵活、更易于重用。 总而言之,带括号的上下文管理器是 Python 的一个有用功能,可以使使用上下文管理器更加灵活和方便。使用上下文管理器和带括号的上下文管理器可确保您的代码更健壮、更可靠且更易于维护。 使用上下文管理器的另一个好处是它们可以帮助您避免常见的编程错误,例如忘记关闭文件或数据库连接。使用上下文管理器,即使发生错误,您也可以确保打开的任何资源在使用完毕后都会自动关闭。 除了在语句中使用上下文管理器之外,您还可以直接使用 contextlib 模块来使用它们。此模块提供了几个用于处理上下文管理器的实用程序,包括 context_manager 装饰器,它允许您使用生成器函数创建上下文管理器。 这是一个示例,演示如何使用上下文管理器装饰器创建打开和关闭文件的上下文管理器 在此示例中,我们使用上下文管理器装饰器创建了一个名为 open_file 的上下文管理器。此函数接受文件名作为参数,并返回一个上下文管理器对象,该对象可与 with 语句一起使用。 在 open_file 函数内部,我们使用 yield 语句指示应执行 with 语句内部的代码块的位置。在 yield 语句之前,我们使用 open 函数打开文件。在 yield 语句之后,我们使用最终块关闭文件。 当我们使用 open_file 上下文管理器与 with 语句一起使用时,将执行 with 语句内部的代码块,并返回 f 对象作为 as 子句的值。一旦代码块执行完毕,上下文管理器会自动关闭文件。 使用上下文管理器装饰器是创建用于简单任务的上下文管理器的便捷方法,但对于更复杂的任务,您可能需要创建自定义上下文管理器类。 除了上下文管理器装饰器之外,contextlib 模块还提供了几个其他用于处理上下文管理器的实用程序,包括 closing 函数,该函数可用于创建包装具有比较方法的对象的上下文管理器。 这是一个示例,演示如何使用 closing 函数创建包装数据库连接对象的上下文管理器 在此示例中,我们使用 closing 函数创建了一个上下文管理器,该管理器包装了 sqlite3.Connect 函数返回的数据库连接对象。closing 函数在退出上下文管理器时自动调用连接对象的 close 方法。 我们在语句内部使用数据库连接对象来执行 SQL 查询并获取结果。一旦代码块执行完毕,上下文管理器会自动关闭数据库连接。 总而言之,上下文管理器是 Python 的一个强大功能,可以帮助您编写更健壮、更可靠且更易于维护的代码。无论您是处理文件、数据库还是其他资源,使用上下文管理器都可以帮助确保您的代码正确处理这些资源,即使出现错误或异常。 使用带括号的上下文管理器,您可以将参数传递给上下文管理器类的 __enter__ 方法,从而使您的代码更灵活、更易于重用。通过使用 context manager 装饰器和 contextlib 模块提供的其他实用程序,您可以快速轻松地创建上下文管理器,而无需为每个任务编写自定义类。 但是,重要的是要记住,上下文管理器并非所有编程问题的灵丹妙药。它们主要用于管理资源并确保其正确清理,但它们不能替代良好的编程实践和设计模式。 例如,假设您使用上下文管理器来处理多个资源,例如打开多个文件。在这种情况下,您可能需要考虑使用更高级别的抽象,例如封装此行为的函数或类。这可以使您的代码更具模块化、更易于理解和更易于测试。 此外,上下文管理器可以与其他 Python 功能结合使用,例如生成器、装饰器和元类,以创建强大且富有表现力的编程结构。例如,您可以使用生成器函数来创建生成值序列的上下文管理器,或使用装饰器向上下文管理器类添加额外行为。 这是一个示例,演示如何使用生成器函数创建生成值序列的上下文管理器 在此示例中,我们使用序列生成器函数创建了一个上下文管理器,该管理器生成从 start 到 end 的值序列,以 step 递增。我们使用生成器函数内部的 yield 语句生成序列中的每个值。 当我们使用序列上下文管理器与 with 语句一起使用时,将执行 with 语句内部的 for 循环,并且 I 变量采用序列上下文管理器生成的值。一旦循环执行完毕,上下文管理器会自动关闭序列。 此示例演示了上下文管理器如何用于创建可用于解决各种编程问题的更高级别抽象。 但是,重要的是要记住,上下文管理器不能替代良好的编程实践和设计模式。它们主要用于管理资源。如果您使用上下文管理器来处理多个资源或执行复杂任务,则可能需要考虑使用更高级别的抽象。 通过将上下文管理器与其他 Python 功能(例如生成器、装饰器和元类)结合使用,您可以创建强大且富有表现力的编程结构,从而解决各种编程问题。通过实践和经验,您可以熟练使用上下文管理器编写更清晰、更易读且更可靠的 Python 代码。 此外,在使用上下文管理器时,重要的是要牢记一些最佳实践,以确保您的代码健壮且可维护
始终彻底测试您的代码,以确保它能够优雅地处理异常并从错误中恢复。 结论上下文管理器是 Python 的一个有价值的功能,可以帮助您编写更清晰、更易读且更可靠的代码。使用带括号的上下文管理器和 contextlib 模块,您可以快速轻松地创建上下文管理器,而无需为每个任务编写自定义类。通过遵循最佳实践并始终如一地使用上下文管理器,您可以编写健壮、可维护且易于理解的代码。 |
简介:本文将教我们如何使用 Python 清理回收站。回收站是 Windows 系统上已删除文件和文件夹的临时存储位置。已删除的文档或文件夹被移动到回收站,如果...
阅读 4 分钟
Selenium 模块 Selenium 是 Python 提供的一个用于自动化测试的模块。它为使用 Selenium 驱动程序进行不同的功能测试提供了易于使用的 API。Selenium 是一个开源的 Python 框架,它提供用于使用 Selenium 编写功能测试的 API。它用于...
阅读 2 分钟
Pyright 是一种快速、静态的 Python 类型检查器。它由微软开发,于 2019 年作为开源项目发布。Pyright 旨在通过分析 Python 代码来检测潜在的类型不匹配和其他与类型相关的错误,从而在代码运行之前尽早捕获与类型相关的错误。
阅读 6 分钟
二叉树是一种类似于树的数据结构。这棵树的每个节点都包含两个节点,称为左节点和右节点。二叉搜索树是更常见的二叉树数据结构的特例。二叉搜索树应该...
11 分钟阅读
简介:花卉一直是人类着迷和灵感的源泉。自然世界的美丽和多样性在艺术、文学和科学中被庆祝了几个世纪。随着机器学习和计算机视觉的进步,我们现在可以...
阅读 8 分钟
本教程将教我们关于字符编码和数字系统的知识。我们将探讨在 Python 中如何使用字符串和字节进行编码,以及通过各种形式的 int 字面量来了解数字系统。让我们来介绍一下 Python 中的字符编码。什么是字符编码?有...
阅读 8 分钟
在以下教程中,我们将讨论 Apache Kafka 及其在 Python 编程语言中的使用。了解 Apache Kafka Apache Kafka 是一个开源流平台,最初由 LinkedIn 设计。后来,它被移交给 Apache 基金会并于 2011 年开源。根据...
阅读 8 分钟
在本Python教程中,我们将探讨如何解决错误、Python中的“syntaxerror return outside function”以及“can't assign to function call”。在Python中使用函数时,会发生函数外返回的错误。在编程方面,函数是非常...
阅读 6 分钟
在本教程中,我们将学习如何使用 Python 内置的 fuzzyWuzzy 库匹配字符串,并通过各种示例确定它们的相似度。简介 Python 提供了几种比较两个字符串的方法。以下是几种主要方法。使用正则表达式 简单比较 使用 dfflib 但是...
阅读 6 分钟
在本教程中,我们将学习用 Python 编写的 bisect 算法。它的源代码只有 80 行。让我们通过 bisect 模块的介绍。介绍 它基本上是一个二分法算法,用于查找添加给定值的插入点...
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India