Python 中的 with 语句

文章目录


Python 提供了各种功能和选项来改进我们现有的代码。 其中一项功能是 with 关键字。

本篇文章将介绍with语句的功能及其在Python中的应用。


在Python中使用with语句

该语句本质上用于帮助处理异常并在使用资源时清理资源。 它确保代码正确执行并随后清理资源。

大多数情况下,您会在文件处理中发现 with 语句的使用。 让我们讨论一个例子。

python 复制代码
f = open('path\file.txt', 'w')
f.write('Sample Content')
f.close()

在上面的示例中,我们使用 open() 函数打开了一个文件,并使用 write() 方法写入了一些内容。 然后,close() 函数关闭文件对象并清理资源。

让我们看看上面的代码使用 with 关键字是什么样子。

python 复制代码
with open('path\file.txt') as f:
    f.write('Sample Content')

在代码中,我们可以看到,使用 with 语句,我们能够消除 close() 函数的使用。

with 语句有用的另一个例子是封装 try 和 finally 块。

例如,

python 复制代码
f = open('path\file.txt', 'w')
try:
    f.write('Sample Content')
finally:
    f.close()

try 块接受类似于打开文件的代码,并且无论 try 块中的代码是否引发异常,finally 块中的代码都会执行。 在上面的示例中,即使 write() 函数引发异常,finally 块中的代码也将执行并运行 close() 函数。

我们已经在前面的示例中看到了如何使用 with 语句来实现此目的。

我们还可以将 with 语句与用户定义的对象一起使用,此类对象称为上下文管理器。 他们定义了 __enter____exit__ 方法。

__enter__ 方法在使用 with 语句创建此类的对象时执行。 __exit__ 方法在 with 块中的代码完成时执行。

python 复制代码
class writer_class(object):
    def __init__(self, filename):
        self.filename = filename

    def __enter__(self):
        self.f = open(self.filename, "w")
        return self.f

    def __exit__(self, exception, value):
        self.f.close()

with writer_class('file.txt') as f:
    f.write('DelftStack')

Python中上述类的对象在创建时会执行 __enter__ 方法,该方法用于打开文件。 close() 函数放在 __exit__ 方法中,用于在代码执行后关闭文件对象。

与类一样,我们可以使用 contextlib 库来创建上下文管理器方法。 这些方法可以使用 @contextmanager 装饰器来创建,该装饰器放在定义的函数之前。

例如,

python 复制代码
from contextlib import contextmanager

@contextmanager
def new_open(file):
    try:
        f = open(file, "w")
        yield f
    finally:
        f.close()

with new_open("sample.txt") as f:
    f.write("DelftStack")

在示例代码中,我们可以看到 @contextmanager 装饰器的使用,它允许我们创建此类方法。 在定义的函数中,我们放置了创建文件对象并使用 try 和 finally 块关闭创建的对象的完整代码。


总结

最后,我们讨论了 Python 中的 with 语句及其用法。 我们首先讨论了该语句的基础知识,以及它如何通过清理资源来提高代码可读性和效率。

我们重点关注其最常见的文件处理应用程序来演示其用途。 我们还讨论了上下文管理器及其方法以及如何将 with 语句与它们一起使用。

相关推荐
临沂GEO6 小时前
芝麻开门GEO|AI数字化新趋势,助力企业线上长效增长
大数据·人工智能·python
luj_17686 小时前
虚实交融中的真实人物塑造
c语言·开发语言·网络·经验分享·算法
waiting9711186 小时前
Ubuntu 26.04 + Android14安装与编译教程
android·linux·ubuntu
haolin123.7 小时前
STL vector底层揭秘:从构造到迭代器失效
开发语言·c++·算法
qetfw7 小时前
Debian 部署 phpMyAdmin:Apache、PHP 与 MariaDB 管理界面配置
linux·debian·php·apache
大模型码小白7 小时前
ChatGPT 的回答也能被结构化抓取?AI Bot Scraper 对比测评
服务器·开发语言·数据库·人工智能·spring·chatgpt
梦想不只是梦与想7 小时前
大模型系列(二):技术基础与核心能力
python·大模型·token
尘中远7 小时前
给C++工业软件搭建 Agent
开发语言·c++·qt·ai·agent
AC赳赳老秦7 小时前
农产品公开数据应用:OpenClaw 抓取农产品价格、产销公开数据,实现农产品行情动态监测
java·c语言·javascript·python·php·deepseek·openclaw
青瓦梦滋7 小时前
NAT技术
linux·服务器·网络·网络协议·tcp/ip