为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 attrs 和 cattrs 反序列化带有可选字段的 json

如何使用 attrs 和 cattrs 反序列化带有可选字段的 json

慕容森 2021-09-25 21:49:44
我想使用 attr 和 cattrs 反序列化 MongoDB 文档。由于 noSQL 没有固定模式,我需要以某种方式指向 attr.ib-s,它们可能会被遗漏,而不是在这种情况下将它们添加到 dict 的对象中。我之前使用过漏勺来做这种事情,它在漏勺.SchemaNode 构造函数中提供了一个“缺失”的参数,它通过将“漏勺”作为参数传递来做到这一点。我想知道如何对这些库做同样的事情,我在文档中没有找到任何内容。所以:import attrfrom cattr import structure@attr.sclass ABC:    A: float = attr.ib()    B: float = attr.ib()    C: float = attr.ib()d = {'A': 1, 'B': 2}obj = structure(d, ABC)应该返回一个只有 A 和 B 属性的对象。我一直在尝试使用一些参数(init、default...),甚至使用来自键入 lib 的 Optional 类,但是我尝试的所有方法都以某种方式返回了该属性。谢谢你的帮助。
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

(我是 cattrs 的作者,也是 attrs 的核心贡献者。)


你好,


根据定义,一个 attrs Python 类将在 instance 中拥有它的所有字段__dict__。当您说结构化“应该返回一个只有 A 和 B 属性的对象”时,我假设您希望AttributeError在您尝试访问obj.C.


据我所知,这对于 attrs 是不可能的,也不符合 attrs 的精神。您已将类定义为具有三个属性,因此它应该在这些属性中具有值。


您可以做的是None用作缺失值的值标记;这是通常在 Python 中表示缺失值的常用方法。代码片段变为:


from typing import Optional


import attr

from cattr import structure


@attr.s

class ABC:

    A: float = attr.ib()

    B: float = attr.ib()

    C: Optional[float] = attr.ib(default=None)


d = {'A': 1, 'B': 2}

obj = structure(d, ABC)

您不希望期望 的实例ABC必须处理神秘丢失的属性的代码,对吗?


查看完整回答
反对 回复 2021-09-25
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信