深入理解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.函数进而就会抛出一个异常现象出来。借由运用这个函数的方式,我们能够选择去忽略掉这个异常情况, 最终达成使得代码就算处在文件不存在这样一种状况下, 依然能够保持正常运行的效果。

总结

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

相关推荐
niucloud-admin28 分钟前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
小叶肥辉33 分钟前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
2401_873479401 小时前
IP属地为什么有时显示外省?用IP查询工具核查动态分配、运营商出口与GeoIP库
python·tcp/ip·ip
OKkankan3 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
山哥ol4 小时前
【Geany 环境配置与中文乱码解决参考】
python
会飞锦鲤4 小时前
基于 Mask R-CNN 的药片缺陷检测系统
人工智能·pytorch·python·神经网络·resnet-50
默 语4 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
清水白石0085 小时前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
Patrick在香港5 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
IT毕设梦工厂5 小时前
计算机毕业设计选题推荐:基于大数据的草鱼价格分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·python·数据挖掘·数据分析·课程设计·大数据毕设项目