pytest的匹配器
项目描述
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 匹配器进行比较来实现的,可以使用 == 操作符,无论是直接比较还是通过比较两个更大的结构体来实现。
如果比较引发 TypeError 或 ValueError(例如,因为您尝试执行 42 == AnyMatch(r'\d+'),该操作试图将正则表达式与整数匹配),则异常将被抑制,比较的结果为 False;所有其他异常都会被传播出去。
可以使用 & 操作符将 anys 匹配器组合起来,以生成新的匹配器,这些匹配器需要两个操作数都成功;例如,AnyGT(23) & AnyLT(42) 将匹配 23 到 42 之间的任何数字(不包括 42),没有其他匹配项。
可以使用 | 操作符将 anys 匹配器组合起来,以生成新的匹配器,这些匹配器至少需要一个操作数成功;例如,ANY_INT | ANY_STR 将匹配任何 int 或 str 类型的值。
类
请注意,除非另有说明,否则 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) 引发一个 TypeError 或 ValueError,它将被抑制,并且 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 实例。你可能不知道,但 datetime 是 date 的子类,因此这也匹配 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
以下常量匹配 感知或无感知 的 datetime 或 time 值
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 56c04f76afe5379a5058aec067befa1fb93070d63cabbd342e04b3d5aff739f8 |
|
MD5 | 15b825d0461d08d643b0ce0776d061a3 |
|
BLAKE2b-256 | e6443dae9eeb1637c3b0bd1136f0e4627d2a9384ad5d3325f3574c5e380a0699 |
anys-0.3.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ae4124d98ab0449a457d1563e86c9f9baa059707bf7bd65248d594b1fdc2a5c2 |
|
MD5 | c9cc384fc3879c152e59d3483468aa98 |
|
BLAKE2b-256 | 824c8a9bf37b3c051dd7d61945676211adbdc6f89f1c27b922e2d488fd32c7bb |