跳转到主要内容

用于更改目录、设置属性/envvars等的上下文管理器。

项目描述

Project Status: Active — The project has reached a stable, usable state and is being actively developed. CI Status https://codecov.io/gh/jwodder/morecontext/branch/master/graph/badge.svg https://img.shields.io/pypi/pyversions/morecontext.svg MIT License

GitHub | PyPI | 问题 | 变更日志

morecontext 提供了一些常见操作(特别是更改当前工作目录、对象的属性、dict 字段或环境变量,然后将其设置回原来的值)的上下文管理器。当然,您自己也可以轻松实现这些操作,但为什么要在每次都做同样的事情时麻烦自己,而不是让这个包来帮您完成呢?

类型注解!完全测试!

安装

morecontext 需要 Python 3.6 或更高版本。只需使用 Python 3 的 pip 安装 morecontext

python3 -m pip install morecontext

示例

>>> import os
>>> import morecontext
>>> os.getcwd()
'/some/dir'
>>> with morecontext.dirchanged('/some/other/dir'):
...     # Now we're in /some/other/dir
...     os.getcwd()
...
'/some/other/dir'
>>> # Out of the `with`, back to /some/dir
>>> os.getcwd()
'/some/dir'
>>> d = {"foo": 42}
>>> with morecontext.itemset(d, "foo", "bar"):
...     # d["foo"] == "bar" in here
...     d["foo"]
...     # If we change d["foo"] in here, it'll still be set back to 42 on exit
...     d["foo"] = 3.14
...
'bar'
>>> # Out of the `with`, it's back to 42
>>> d["foo"]
42

API

函数

以下所有上下文管理器函数都使用 contextlib.contextmanager 定义,因此它们也可以作为函数装饰器使用。它们在进入时都返回 None,所以没有必要编写“with dirchanged(path) as foo:”;直接使用“with dirchanged(path):”即可。

这些函数不是线程安全的。

dirchanged(dirpath: Union[str, bytes, os.PathLike]) -> ContextManager[None]

暂时更改当前工作目录。

dirchanged(dirpath) 返回一个上下文管理器。进入时,它存储当前工作目录路径,然后更改当前目录为 dirpath。退出时,它将当前目录更改回存储的路径。

dirrollback() -> ContextManager[None]

保存并恢复当前工作目录。

dirrollback() 返回一个上下文管理器,它在进入时存储当前工作目录,并在退出时更改回该目录。

attrset(obj: Any, name: str, value: Any) -> ContextManager[None]

暂时更改对象的属性值。

attrset(obj, name, value) 返回一个上下文管理器。进入时,它存储对象 obj 中名为 name 的属性的当前值,然后设置该属性为 value。退出时,它将属性恢复到存储的值。

如果给定的属性在进入时未设置,上下文管理器将在退出时取消设置它。

attrdel(obj: Any, name: str) -> ContextManager[None]

暂时取消对象的属性。

attrdel(obj, name) 返回一个上下文管理器。进入时,它存储对象 obj 中名为 name 的属性的当前值,然后取消设置该属性。退出时,它将属性恢复到存储的值。

如果给定的属性在进入时未设置,上下文管理器将在退出时取消设置它。

attrrollback(obj: Any, name: str, copy: bool = False, deepcopy: bool = False) -> ContextManager[None]

保存并恢复对象的属性值。

attrrollback(obj, name) 返回一个上下文管理器,它在进入时存储对象 obj 中名为 name 的属性值,并在退出时将该属性恢复到该值。如果给定的属性在进入时未设置,上下文管理器将在退出时取消设置它。

如果 copy 为真,则保存并恢复属性的浅拷贝。如果 deepcopy 为真,则保存并恢复属性的深拷贝。如果两个选项都为真,则 deepcopy 优先。

itemset(d: MutableMapping[K,V], key: K, value: V) -> ContextManager[None]

暂时更改映射条目的值。

itemset(d, key, value) 返回一个上下文管理器。进入时,它存储 d[key] 的当前值,然后设置该字段为 value。退出时,它将该字段恢复到存储的值。

如果给定的字段在进入时未设置,上下文管理器将在退出时取消设置它。

itemdel(d: MutableMapping[K, Any], key: K) -> ContextManager[None]

暂时取消映射条目。

itemdel(d, key) 返回一个上下文管理器。进入时,它存储 d[key] 的当前值,然后取消设置该字段。退出时,它将该字段恢复到存储的值。

如果给定的字段在进入时未设置,上下文管理器将在退出时取消设置它。

itemrollback(d: MutableMapping[K, Any], key: K, copy: bool = False, deepcopy: bool = False) -> ContextManager[None]

保存并恢复映射条目的值。

itemrollback(d, key) 返回一个上下文管理器,它在进入时存储 d[key] 的值,并在退出时将该字段恢复到该值。如果给定的字段在进入时未设置,上下文管理器将在退出时取消设置它。

如果 copy 为真,则保存并恢复字段的浅拷贝。如果 deepcopy 为真,则保存并恢复字段的深拷贝。如果两个选项都为真,则 deepcopy 优先。

envset(name: str, value: str) -> ContextManager[None]

暂时设置环境变量。

envset(name, value) 返回一个上下文管理器。进入时,它存储环境变量 name 的当前值,然后将其设置为 value。退出时,它将环境变量恢复到存储的值。

如果进入时环境变量未设置,上下文管理器在退出时将取消设置该环境变量。

envdel(name: str) -> ContextManager[None]

暂时取消设置一个环境变量。

envdel(name) 返回一个上下文管理器。进入时,它存储环境变量 name 的当前值,然后取消设置该环境变量。退出时,它将环境变量恢复到存储的值。

如果进入时环境变量未设置,上下文管理器在退出时将取消设置该环境变量。

envrollback(name: str) -> ContextManager[None]

保存并恢复环境变量的值。

envrollback(name) 返回一个上下文管理器,它在进入时存储环境变量 name 的值,并在退出时将该环境变量恢复到该值。如果进入时给定的环境变量未设置,上下文管理器在退出时将取消设置该环境变量。

additem(lst: MutableSequence[T], value: T, prepend: bool = False) -> ContextManager[None]

暂时向序列中添加一个值。

additem(lst, value) 返回一个上下文管理器,它在进入时将 value 追加到序列 lst,并在退出时删除 lst 中最后一个等于 value 的元素(如果有)。

如果 prepend 为 true,则在进入时将 value 预先添加到 lst 中,并在退出时删除 lst 中第一个等于 value 的元素。

class OpenClosable:
    def open(self) -> None:
        ...

    def close(self) -> None:
        ...

用于创建简单 重入 上下文管理器的基础类。 OpenClosable 定义了 __enter____exit__ 方法,这些方法跟踪当前作用域中的嵌套 with 语句数量,并在进入和退出最外层的 with 时调用实例的 open()close() 方法。

子类应覆盖 open() 和/或 close() 以执行所需的代码,在进入和退出最外层的 with 时执行;OpenClosable 定义的默认 open()close() 方法不做任何事情。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

morecontext-0.6.0.tar.gz (12.5 kB 查看哈希值)

上传时间

构建分发

morecontext-0.6.0-py3-none-any.whl (7.4 kB 查看哈希值)

上传时间 Python 3

由以下提供支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面