跳转到主要内容

pytest的匹配器

项目描述

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

GitHub | PyPI | 问题 | 变更日志

anys提供了pytest风格的断言匹配器。什么是“匹配器”?好吧,假设你正在编写单元测试,并想要断言给定的对象包含正确的值。通常,你只会写

assert foo == {
    "widgets": 42,
    "name": "Alice",
    "subfoo": {
        "created_at": "2021-06-24T18:41:59Z",
        "name": "Bob",
        "widgets": 23,
    }
}

但是等等!如果foo["subfoo"]["created_at"]的值无法预先确定,但你仍然需要检查它是否是一个有效的时间戳怎么办?你将不得不将foo中除该字段之外的所有内容与预期值进行比较,然后单独检查时间戳字段的有效性。这就是匹配器发挥作用的地方:它们是魔法对象,可以与满足给定条件的任何值和所有值相等。对于上述情况,anys允许你只写

from anys import ANY_DATETIME_STR

assert foo == {
    "widgets": 42,
    "name": "Alice",
    "subfoo": {
        "created_at": ANY_DATETIME_STR,
        "name": "Bob",
        "widgets": 23,
    }
}

断言将执行你想要的操作。

安装

anys需要Python 3.7或更高版本。只需使用Python 3的pip即可安装它

python3 -m pip install anys

API

anys 提供以下类和常量,用于匹配满足特定条件的值。匹配是通过将值与 anys 匹配器进行比较来实现的,可以使用 == 操作符,无论是直接比较还是通过比较两个更大的结构体来实现。

如果比较引发 TypeErrorValueError(例如,因为您尝试执行 42 == AnyMatch(r'\d+'),该操作试图将正则表达式与整数匹配),则异常将被抑制,比较的结果为 False;所有其他异常都会被传播出去。

可以使用 & 操作符将 anys 匹配器组合起来,以生成新的匹配器,这些匹配器需要两个操作数都成功;例如,AnyGT(23) & AnyLT(42) 将匹配 23 到 42 之间的任何数字(不包括 42),没有其他匹配项。

可以使用 | 操作符将 anys 匹配器组合起来,以生成新的匹配器,这些匹配器至少需要一个操作数成功;例如,ANY_INT | ANY_STR 将匹配任何 intstr 类型的值。

请注意,除非另有说明,否则 anys 类构造函数不能接受 anys 匹配器作为参数。

AnyContains(key: Any, /)

一个匹配器,它可以匹配任何对于 key in value 为 true 的值。如果 key 是一个 anys 匹配器,则 value == AnyContains(key) 将通过迭代 value 的元素并检查是否任何元素匹配 key 来评估。

AnyFullmatch(pattern: Union[AnyStr, re.Pattern[AnyStr]], /)

一个匹配器,它可以匹配任何字符串 s,对于该字符串,re.fullmatch(pattern, s) 成功。

AnyFunc(func: Callable, /)

一个匹配器,它可以匹配任何值 x,对于该值,func(x) 为 true。如果 func(x) 引发一个 TypeErrorValueError,它将被抑制,并且 x == AnyFunc(func) 将评估为 False。所有其他异常都会被传播出去。

AnyGE(bound: Any, /)

一个匹配器,它可以匹配任何大于或等于 bound 的值。

AnyGT(bound: Any, /)

一个匹配器,它可以匹配任何大于 bound 的值。

AnyIn(iterable: Iterable, /)

一个匹配器,它可以匹配任何等于或匹配 iterable(可能包含 anys 匹配器)元素的值。请注意,如果 iterable 是一个字符串,则只有字符串中的单个字符会匹配;要匹配子字符串,请使用 AnySubstr()

AnyInstance(classinfo, /)

一个匹配器,它可以匹配任何是 classinfo 实例的值。 classinfo 可以是一个类型,也可以是一个类型的元组(或者,从 Python 3.10 开始,是一个类型的 Union)。

提供了一些预定义的 AnyInstance() 值作为常量,以方便您使用;请参见下面的“常量”。

AnyLE(bound: Any, /)

一个匹配器,它可以匹配任何小于或等于 bound 的值。

AnyLT(bound: Any, /)

一个匹配器,它可以匹配任何小于 bound 的值。

AnyMatch(pattern: Union[AnyStr, re.Pattern[AnyStr]], /)

一个匹配器,它可以匹配任何字符串 s,对于该字符串,re.match(pattern, s) 成功。

AnySearch(pattern: Union[AnyStr, re.Pattern[AnyStr]], /)

一个匹配器,它可以匹配任何字符串 s,对于该字符串,re.search(pattern, s) 成功。

AnySubstr(s: AnyStr, /)

一个匹配器,它可以匹配任何字符串 s 的子字符串。

AnyWithAttrs(mapping: Mapping, /)

一个匹配器,匹配任何对象 obj,使得 getattr(obj, k) == v 对于 mapping.items() 中的所有 k,v 都成立。

mapping 的值(而不是键)可以是 anys 匹配器。

AnyWithEntries(mapping: Mapping, /)

一个匹配器,匹配任何对象 obj,使得 obj[k] == v 对于 mapping.items() 中的所有 k,v 都成立。

mapping 的值(而不是键)可以是 anys 匹配器。

Maybe(arg: Any, /)

一个匹配 None 和任何等于或匹配 arg(可以是 anys 匹配器)的值的匹配器

Not(arg: Any, /)

一个匹配不等于或不匹配 arg(可以是 anys 匹配器)的任何事物的匹配器

常量

以下常量匹配给定类型

  • ANY_BOOL

  • ANY_BYTES

  • ANY_COMPLEX

  • ANY_DATE — 匹配 date 实例。你可能不知道,但 datetimedate 的子类,因此这也匹配 datetime。如果你只想匹配实际的 date,请使用 ANY_STRICT_DATE

  • ANY_DATETIME

  • ANY_DICT

  • ANY_FLOAT

  • ANY_INT

  • ANY_ITERABLE

  • ANY_ITERATOR

  • ANY_LIST

  • ANY_MAPPING

  • ANY_NUMBER

  • ANY_SEQUENCE

  • ANY_SET

  • ANY_STR

  • ANY_STRICT_DATE — 匹配不是 datetime 实例的任何 date 实例

  • ANY_TUPLE

以下常量匹配 感知或无感知datetimetime

  • ANY_AWARE_DATETIME

  • ANY_AWARE_TIME

  • ANY_NAIVE_DATETIME

  • ANY_NAIVE_TIME

以下常量匹配 ISO 8601 样式的日期、时间和日期时间字符串。感知匹配器需要时区信息,而无感知匹配器则不允许。

  • ANY_AWARE_DATETIME_STR

  • ANY_AWARE_TIME_STR

  • ANY_DATETIME_STR

  • ANY_DATE_STR

  • ANY_NAIVE_DATETIME_STR

  • ANY_NAIVE_TIME_STR

  • ANY_TIME_STR

其他常量

  • ANY_FALSY — 匹配任何被认为是假的

  • ANY_TRUTHY — 匹配任何被认为是真的

注意:如果你需要一个匹配任何东西的匹配器,Python 已经提供了作为 unittest.mock.ANY 常量。

注意事项:自定义类

当良好行为的类定义了 __eq__ 方法时,它将仅针对同一类的值进行测试,对于其他类型的值返回 NotImplemented[1] 这表示 Python 将通过调用 y__eq__ 方法来评估 x == y。因此,当将 anys 匹配器与良好行为的类的实例进行比较时,匹配器可以在 == 的左边或右边。Python 标准库中的所有类都是良好行为的,不定义 __eq__ 方法的类也是良好行为的,但第三方代码中的一些自定义类不是良好行为的。为了成功地比较 anys 匹配器与不良行为的类,匹配器必须位于 == 操作符的 左边;如果它在右边,则只会咨询自定义类的 __eq__ 方法,这通常意味着比较将始终评估为假。

项目详情


下载文件

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

源代码发行版

anys-0.3.0.tar.gz (17.4 kB 查看哈希值)

上传时间 源代码

构建发行版

anys-0.3.0-py3-none-any.whl (9.1 kB 查看哈希值)

上传时间 Python 3

由以下机构支持