0

我想使用 attr 和 cattrs 反序列化 MongoDB 文档。由于 noSQL 没有固定的模式,我需要以某种方式指向 attr.ib-s 可能会丢失它们,并且在这种情况下不要将它们添加到 dict 的对象中。

我以前使用过滤锅来做这种事情,它在 colander.SchemaNode 构造函数中提供了一个“缺失”参数,它通过将“colander.drop”作为参数传递来做到这一点。我想知道如何对这些库做同样的事情,我在文档中没有找到任何东西。所以:

import attr
from cattr import structure

@attr.s
class 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 类,但是我尝试的所有方法都以某种方式返回了该属性。

谢谢你的帮助。

4

1 回答 1

5

(我是 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必须处理神秘缺失的属性,对吗?

于 2019-01-05T22:37:29.570 回答