2

我有一些带有 Record 类的 python 库。Record 类仅使用kwargs. 我像这样填充记录,它工作正常:


class Animal(Record):
    name = String(required=True)


animal = Animal(**{'name': 'joe'})

该库还支持这样的嵌套记录:

class Fur(Record):
    color = String(required=True)


class Animal(Record):
    fur = Fur(required=True)

但是,当我尝试填充:

animal = Animal(**{'fur': {'color': 'red'}})

它失败了,因为子记录不接收color=red而是接收{'color': 'red'}

所以我需要一种“递归**”?

4

1 回答 1

2

简单地做些什么呢:

animal = Animal(fur = Fur(color = 'red'))

关于 kwargs 的更多信息:**kwargs 的目的和用途是什么?

不过,我认为你不能用这样的原始字典来做到这一点。如果你看一下 Record 类的__init__here),你会看到 kwargs 只是覆盖了字段的默认值,并用setattr. 因此,如果您这样做animal = Animal(**{'fur': {'color': 'red'}}),您只需将字典影响{'color': 'red'}到字段毛皮。

我能想到的唯一方法是覆盖 Record 类,例如像这样(未测试):

class SRecord(Record):
    def __setattr__(self, key, value):
        if type(self._fields.get(key, None)) is SRecord:
            value = SRecord(value)
        super(SRecord, self).__setattr__(key, value)
于 2019-08-27T15:28:16.357 回答