深入理解Python中的Contextlib库

一些供支持各类常见编程任务的内建的库被给出了。库属于其中之一, 它给出了一些去支持上下文管理协议(也就是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.函数进而就会抛出一个异常现象出来。借由运用这个函数的方式,我们能够选择去忽略掉这个异常情况, 最终达成使得代码就算处在文件不存在这样一种状况下, 依然能够保持正常运行的效果。

总结

库是之中一个具备强大功能且实用的库, 它给出一系列的工具以及类, 用以协助我们更为妥善的管理上下文, 并且处理清理任务。领会以及掌握这个库的运用, 能够助力我们编写出更为简洁、更为清晰, 且更为健壮的代码。

相关推荐
for_ever_love__9 小时前
函数——参数、lambda、*args与作用域
python·函数·大模型开发·编程基础
东莞市云毅网络有限公司9 小时前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
Query*9 小时前
深入浅出LangGraph【一】_基础篇
python·ai·langchain
XiaoMaqqqq9 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
ShyanZh10 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp
青柠之夏cc10 小时前
递归揭秘:从原理到陷阱
递归·函数·乘
惊讶的猫11 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
天赐范式11 小时前
天赐范式第186天:让方差开始自洽——Bulmer效应的闭式验证
python·数字生命·天赐范式·动态运行时·遗传方差·bulmer效应
泡茶喝茶写代码11 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
Είναι η κοπέλα12 小时前
显存计算与模型选择:你的显卡能跑多大的模型
人工智能·pytorch·python·开源·conda