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
语句可以提供帮助的另一个例子是在封装try
和finally
块。
比如说、
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
装饰器,使我们能够创建这样的方法。在定义的函数中,我们使用try
和finally
块将创建文件对象和关闭创建的对象的完整代码放入其中。
结论
最后,我们讨论了 Python 中的with
语句和它的用途。我们首先讨论了这个语句的基础知识,以及它如何通过清理资源来提高代码的可读性和效率。
我们集中讨论了它在文件处理方面最常见的应用,以证明它的用途。我们还讨论了上下文管理器和它的方法,以及我们如何用它们来使用with
语句。