跳转到主要内容

为 attrs 和 dataclasses 提供可组合的复杂类支持。

项目描述

cattrs:灵活的对象序列化和验证

因为验证属于边缘。

Documentation License: MIT PyPI Supported Python Versions Downloads Coverage


cattrs是Python中数据(非)结构和验证的瑞士军刀。在实践中,这意味着它将非结构化字典转换为适当的类,然后再转换回来,同时验证其内容。

示例

cattrsattrs类和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]转换为列表。
  • tupletyping.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(标准库,orjsonUltraJSON)、msgpackcbor2bson)、PyYAML)、tomlkitmsgspec(目前仅支持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 使用 perfpytest-benchmark 进行基准测试。

此软件包使用 Cookiecutteraudreyr/cookiecutter-pypackage 项目模板创建。

项目详情


下载文件

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

源代码分发

cattrs-24.1.2.tar.gz (426.5 kB 查看散列值)

上传时间 源代码

构建分发

cattrs-24.1.2-py3-none-any.whl (66.4 kB 查看散列值)

上传时间 Python 3

由以下提供支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面