为 attrs 和 dataclasses 提供可组合的复杂类支持。
项目描述
cattrs:灵活的对象序列化和验证
因为验证属于边缘。
cattrs是Python中数据(非)结构和验证的瑞士军刀。在实践中,这意味着它将非结构化字典转换为适当的类,然后再转换回来,同时验证其内容。
示例
cattrs与attrs类和dataclasses配合使用效果最佳,后者简单(非)结构化工作良好,即使是嵌套数据,也不会污染你的数据模型,因为不需要序列化细节。
>>> from attrs import define
>>> from cattrs import structure, unstructure
>>> @define
... class C:
... a: int
... b: list[str]
>>> instance = structure({'a': 1, 'b': ['x', 'y']}, C)
>>> instance
C(a=1, b=['x', 'y'])
>>> unstructure(instance)
{'a': 1, 'b': ['x', 'y']}
更多示例请查看为什么选择cattrs?
特性
递归非结构化
- attrs类和dataclasses类似于
attrs.asdict()
转换为字典,或类似于attrs.astuple()
转换为元组。 - 枚举实例转换为它们的值。
- 其他类型不进行转换。这包括整数、字典、列表以及非attrs类的实例。
- 可以使用
register_unstructure_hook
注册任何类型的自定义转换器。
递归结构化
根据指定的类型将非结构化数据递归地转换为结构化数据。以下类型受支持
typing.Optional[T]
及其3.10+形式T | None
。list[T]
、typing.List[T]
、typing.MutableSequence[T]
和typing.Sequence[T]
转换为列表。tuple
和typing.Tuple
(两种变体,tuple[T, ...]
和tuple[X, Y, Z]
)。set[T]
、typing.MutableSet[T]
和typing.Set[T]
转换为集合。frozenset[T]
和typing.FrozenSet[T]
转换为冻结集合。dict[K, V]
、typing.Dict[K, V]
、typing.MutableMapping[K, V]
和typing.Mapping[K, V]
转换为字典。typing.TypedDict
,普通和泛型。typing.NewType
- 3.12+的PEP 695类型别名
- 具有简单属性和常用
__init__
[^simple]的attrs类。 - 所有具有常用
__init__
的attrs类和数据类,如果它们的复杂属性具有类型元数据。 - 支持的所有attrs类的联合,前提是所有这些类都有一个唯一的字段。
- 任何类型的联合,如果你为其提供一个消歧函数。
- 可以使用
register_structure_hook
注册任何类型的自定义转换器。
[^simple]: 简单属性是可以分配非结构化数据(如数字、字符串和非结构化数据集合)的属性。
一应俱全
cattrs附带了对多种序列化库的预配置转换器,包括JSON(标准库,orjson、UltraJSON)、msgpack、cbor2、bson)、PyYAML)、tomlkit和msgspec(目前仅支持JSON)。
有关详细信息,请参阅cattrs.preconf包。
设计决策
cattrs基于几个基本设计决策
- 非/结构化规则与模型分离。这使得模型可以与非/结构化规则保持一对一或多对一的关系,并可以为不属于你且无法更改的模型创建非/结构化规则。(cattrs可以配置为使用模型使用的非/结构化规则,使用
use_class_methods
策略。) - 尽可能少地创新;尽可能重用现有的普通Python。例如,cattrs 之前没有自定义异常类型来分组异常,直到得到Python官方认可的
exceptiongroups
。这个设计决策的副作用是,在许多情况下,当你解决 cattrs 问题时,你实际上是在学习Python而不是学习 cattrs。 - 抵制猜测的诱惑。如果解决问题有两种方法,cattrs 应该拒绝猜测,并让用户自己进行配置。
愚蠢的一致性是小思想的产物,因此这些决策有时会被打破,但它们已经证明是一个良好的基础。
致谢
主要感谢 Hynek Schlawack 创建了 attrs 和其前身,characteristic。
cattrs 由 David R. MacIver 使用 Hypothesis 进行测试。
cattrs 使用 perf 和 pytest-benchmark 进行基准测试。
此软件包使用 Cookiecutter 和 audreyr/cookiecutter-pypackage
项目模板创建。
项目详情
下载文件
下载适合您平台的自定义文件。如果您不确定选择哪一个,请了解有关 安装软件包 的更多信息。
源代码分发
cattrs-24.1.2.tar.gz (426.5 kB 查看散列值)
构建分发
cattrs-24.1.2-py3-none-any.whl (66.4 kB 查看散列值)
关闭
cattrs-24.1.2.tar.gz 的散列值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85 |
|
MD5 | 7d8d5e75cdf166ffc4ea6aadad70235e |
|
BLAKE2b-256 | 6465af6d57da2cb32c076319b7489ae0958f746949d407109e3ccf4d115f147c |
关闭
cattrs-24.1.2-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0 |
|
MD5 | 42e3e2f797aec45b733720325a31fd72 |
|
BLAKE2b-256 | c8d5867e75361fc45f6de75fe277dd085627a9db5ebb511a87f27dc1396b5351 |