一些供支持各类常见编程任务的内建的库被给出了。库属于其中之一, 它给出了一些去支持上下文管理协议(也就是with语句)的函数。
关于如何运用库当中具有显著作用的功能, 这篇文章会予以具体且细致的说明, 其中涵盖了装饰器, 还包括函数, 另外还有其他具备实用价值的类以及函数。
一、装饰器
能让我们更简单实现上下文管理器的是装饰器, 上下文管理器常常被用于封装起始需做的操作以及结束需做的操作, 像打开和关闭文件这样的情况, 还有获取和释放锁这类情况等等。
以下是一个使用装饰器实现的上下文管理器例子:
import contextlib
@contextlib.contextmanager
def managed_resource(*args, **kwds):
# Code to acquire resource, e.g.:
resource = acquire_resource(*args, **kwds)
try:
yield resource
finally:
# Code to release resource, e.g.:
release_resource(resource)
在这段列举出来的代码里头, yield语句会催生一个上下文, 用户能够利用这个上下文处于with语句当中。
二、函数
该函数是个起辅助作用的函数, 其用途在于保证对象的那个close方法, 在完成相关操作之后能被准确无误地调用。对于某些虽提供了close方法, 然而却未实现上下文管理协议的对象而言, 这有着极大的用处。
import contextlib
with contextlib.closing(open('my_file.txt', 'w')) as f:
f.write('Hello, World!')
于上述代码里, 文件.txt得以被打开, 有数据被写入其中, 而后文件被正确地关闭, 不管写入数据究竟有没有成功。
三、其他有用的类和函数
库还提供了其他一些有用的类和函数,如,,和等。
在后续文章里头, 我们会把这些类, 以及函数的用法, 还有实例进行详细地介绍。当下呢, 我们能够对它们的功能做一个简单的了解:
库给出了好些强大的工具, 用以协助我们更优地管理以及操作上下文。虽说初-start时或许得花些时间去弄明白这些工具的运行原理, 然而一旦掌握了, 你就会发觉它们在实际的编程当中极为有用。
四、类的使用

之前已经描述过, 类属于一种灵活的上下文管理器, 它能够对多个上下文管理者以及普通的清理工作予以管理。下面是一些运用的示例:
from contextlib import ExitStack
def archive_files(files, archive_name):
with ExitStack() as stack:
archive = stack.enter_context(open(archive_name, 'w'))
for file_name in files:
file = stack.enter_context(open(file_name))
archive.write(file.read())
于这个例子里头, 我们先是创建了一个实例, 接着在该实例之中打开了一个用作存档的文件。随后, 我们打开了一连串的文件, 每一回打开一个文件, 便把它添加到实例里。不管过程里出现什么样的异常, 均可确保所有打开的文件在退出之际都被妥善关闭。
五、的使用
有这么一个东西, 它属于非常简单的上下文管理器范畴, 此管理器不开展任何操作, 它的主要用途在于, 当存在需要动态判定是否要运用上下文管理器的情况时, 将其用作一个占位符来使用, 下面给出相应的一个使用例子。
import contextlib
def optional_open(file_name, mode, use_context):
if use_context:
return open(file_name, mode)
else:
return contextlib.nullcontext()
with optional_open('my_file.txt', 'w', False) as f:
if f is not None:
f.write('Hello, World!')
于这个例子当中, 我们界定了一个函数, 该函数依据传入的参数去判定是否运用open函数的上下文管理器。要是为True的话, 那就运用open函数的上下文管理器;不然的话, 则运用来当作占位符。
六、函数的使用
函数可以用来忽略指定的异常。以下是一个使用的例子:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove('my_file.txt')
在这个给出的例子当中呢, 我们着手去尝试删除单一的一个文件。要是这个文件并不存在于特定位置的话, os.函数进而就会抛出一个异常现象出来。借由运用这个函数的方式,我们能够选择去忽略掉这个异常情况, 最终达成使得代码就算处在文件不存在这样一种状况下, 依然能够保持正常运行的效果。
总结
库是之中一个具备强大功能且实用的库, 它给出一系列的工具以及类, 用以协助我们更为妥善的管理上下文, 并且处理清理任务。领会以及掌握这个库的运用, 能够助力我们编写出更为简洁、更为清晰, 且更为健壮的代码。