Python中的with语句

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

本教程将演示with 语句的功能及其在 Python 中的应用。

在Python中使用with 语句

这个语句基本上是用来帮助处理异常,并在资源被使用时清除它们。它可以确保代码的正确执行,并在事后清理资源。

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

f = open('pathfile.txt', 'w')
f.write('Sample Content')
f.close()

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

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

with open('pathfile.txt') as f:
    f.write('Sample Content')

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

with 语句可以提供帮助的另一个例子是在封装tryfinally 块。

比如说、

f = open('pathfile.txt', 'w')
try:
    f.write('Sample Content')
finally:
    f.close()

try 块接受一个代码,如打开一个文件,无论try 块中的代码是否引发异常,都会执行finally 块中的代码。在上面的例子中,finally 块中的代码将执行并运行close() 函数,即使write() 函数引发了一个异常。

我们在前面的例子中已经看到了如何使用with 语句来实现这一点。

我们还可以将with 语句用于用户定义的对象,这种对象被称为上下文管理器。它们有一个__enter____exit__ 方法的定义。

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

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 装饰器,它被放在定义的函数之前。

比如说、

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 装饰器,使我们能够创建这样的方法。在定义的函数中,我们使用tryfinally 块将创建文件对象和关闭创建的对象的完整代码放入其中。

结论

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

我们集中讨论了它在文件处理方面最常见的应用,以证明它的用途。我们还讨论了上下文管理器和它的方法,以及我们如何用它们来使用with 语句。