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

总结

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

相关推荐
迷迭香yy1 小时前
回测过拟合检测体系从样本内外到组合稳健性评估 IG50免费开源股票数据API接口
服务器·开发语言·数据库·人工智能·python
Zane1994121 小时前
`ClassName()` 只是一步?拆开看 `__new__` 和 `__init__` 各自在干什么
开发语言·python
GlueNa2SiO31 小时前
04-Flask数据库操作SQLAlchemy
笔记·python·flask
Data_Journal1 小时前
Playwright vs Selenium:哪个是最佳无头浏览器
开发语言·python·scrapy·microsoft·编辑器
跨境技工小黎1 小时前
LLM蜜罐系统是什么?AI爬虫如何精准绕过?
开发语言·人工智能·python
lskblog1 小时前
Ubuntu 18.04 安装 LibreOffice(用于 Word 在线预览转换)
java·linux·python·ubuntu·word·php·laravel
王志来137944730081 小时前
多元场景催生工控服务器机箱差异化需求匀天以柔性适配回应行业挑战
运维·服务器·人工智能·python
circuitsosk4 小时前
NL2SQL在工业级场景下的精度优化:Schema Linking + 动态Few-shot实战
人工智能·python·sql·大模型·nl2sql
kobe_OKOK_10 小时前
DRF接口幂等操作
python·django