嵌套字典到具有默认值的对象

能源男孩

我正在使用dataclasses+dataclasses_json来实现我的Web API。

我的应用程序将解码从dict到对象的请求,我希望在不填充每个字段的情况下仍可以生成对象,并使用默认值填充空文件。

这是我可能的代码:

from dataclasses import dataclass
from dataclasses_json import dataclass_json

@dataclass
class Glasses:
    color: str
    size: str
    prize: int

@dataclass
class Tshirt:
    color: str
    size: str
    prize: int

@dataclass_json
@dataclass
class People:
    Name : str = 'James'
    Age : int = 25
    Glasses: Glasses = Glasses('black', 'M', 2500)
    Tshirt: Tshirt = Tshirt('black', 'XL', 500)

p = {
    'Name': 'Gino',
    'Age': 20,
    'Glasses': {
        'color' : 'red',
        'size' : 'M',
        'prize' : 4000
    },
    'Tshirt': {
        'color' : 'red',
        'size' : 'M',
        'prize' : 4000
    }
}

a = People.from_dict(p)
print(a)

我会得到错误

Traceback (most recent call last):
  File ".\People.py", line 39, in <module>
    a = People.from_dict(p)
  File "C:\Python3.7\lib\site-packages\dataclasses_json\api.py", line 83, in from_dict
    return _decode_dataclass(cls, kvs, infer_missing)
  File "C:\Python3.7\lib\site-packages\dataclasses_json\core.py", line 133, in _decode_dataclass
    overrides = _user_overrides_or_exts(cls)
  File "C:\Python3.7\lib\site-packages\dataclasses_json\core.py", line 59, in _user_overrides_or_exts
    if field.type in encoders:
TypeError: unhashable type: 'Glasses'

我发现我可以添加(eq = True,Frozen = True)所以我将代码更改为

from dataclasses import dataclass
from dataclasses_json import dataclass_json

@dataclass(eq=True, frozen=True)
class Glasses:
    color: str
    size: str
    prize: int

@dataclass(eq=True, frozen=True)
class Tshirt:
    color: str
    size: str
    prize: int

@dataclass_json
@dataclass
class People:
    Name : str = 'James'
    Age : int = 25
    Glasses: Glasses = Glasses('black', 'M', 2500)
    Tshirt: Tshirt = Tshirt('black', 'XL', 500)

p = {
    'Name': 'Gino',
    'Age': 20,
    'Glasses': {
        'color' : 'red',
        'size' : 'M',
        'prize' : 4000
    },
    'Tshirt': {
        'color' : 'red',
        'size' : 'M',
        'prize' : 4000
    }
}

a = People.from_dict(p)
print(a)

我得到另一个错误

  File ".\People.py", line 39, in <module>
    a = People.from_dict(p)
  File "C:\Python3.7\lib\site-packages\dataclasses_json\api.py", line 83, in from_dict
    return _decode_dataclass(cls, kvs, infer_missing)
  File "C:\Python3.7\lib\site-packages\dataclasses_json\core.py", line 198, in _decode_dataclass
    infer_missing)
  File "C:\Python3.7\lib\site-packages\dataclasses_json\core.py", line 131, in _decode_dataclass
    if isinstance(kvs, cls):
TypeError: isinstance() arg 2 must be a type or tuple of types

有什么可能的方法可以使用内置函数来满足我的要求,而无需自己编写代码?

附庸风雅

您有字段名称和类型名称冲突。为了使您的代码正常工作,您必须具有与类名称不同的JSON字段名称,即您不能具有field"Glasses"和class Glasses,您必须将class重命名为likeGlasses_或重命名字段名称。

另一种选择是对类类型创建别名,即创建别名GlassesTGlasses

带有类型别名的代码版本:

在线尝试!

from dataclasses import dataclass
from dataclasses_json import dataclass_json

@dataclass
class Glasses:
    color: str
    size: str
    prize: int

GlassesT = Glasses

@dataclass
class Tshirt:
    color: str
    size: str
    prize: int
    
TshirtT = Tshirt
    
@dataclass_json
@dataclass
class People:
    Name : str = 'James'
    Age : int = 25
    Glasses: GlassesT = GlassesT('black', 'M', 2500)
    Tshirt: TshirtT = TshirtT('black', 'XL', 500)

p = {
    'Name': 'Gino',
    'Age': 20,
    'Glasses': {
        'color' : 'red',
        'size' : 'M',
        'prize' : 4000
    },
    'Tshirt': {
        'color' : 'red',
        'size' : 'M',
        'prize' : 4000
    }
}

a = People.from_dict(p)
print(a)

输出:

People(Name='Gino', Age=20, Glasses=Glasses(color='red', size='M', prize=4000), Tshirt=Tshirt(color='red', size='M', prize=4000))

带有重命名类的代码版本:

在线尝试!

from dataclasses import dataclass
from dataclasses_json import dataclass_json

@dataclass
class Glasses_:
    color: str
    size: str
    prize: int

@dataclass
class Tshirt_:
    color: str
    size: str
    prize: int

@dataclass_json
@dataclass
class People:
    Name : str = 'James'
    Age : int = 25
    Glasses: Glasses_ = Glasses_('black', 'M', 2500)
    Tshirt: Tshirt_ = Tshirt_('black', 'XL', 500)

p = {
    'Name': 'Gino',
    'Age': 20,
    'Glasses': {
        'color' : 'red',
        'size' : 'M',
        'prize' : 4000
    },
    'Tshirt': {
        'color' : 'red',
        'size' : 'M',
        'prize' : 4000
    }
}

a = People.from_dict(p)
print(a)

输出:

People(Name='Gino', Age=20, Glasses=Glasses_(color='red', size='M', prize=4000), Tshirt=Tshirt_(color='red', size='M', prize=4000))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

添加具有默认值的列

来自分类Dev

Protobuf:具有默认值的枚举

来自分类Dev

具有默认值的常规解析

来自分类Dev

绑定到复杂对象的嵌套字段并在AngularJs中提供默认值?

来自分类Dev

具有默认值的聚合物对象属性

来自分类Dev

仅插入具有默认值或空值的行

来自分类Dev

MySQL:将新列插入到具有其他表默认值的表中

来自分类Dev

哈希默认值是具有相同默认值的哈希

来自分类Dev

具有默认值的Javascript对象

来自分类Dev

如果键在字典中具有伪造的值,则获取默认值

来自分类Dev

使用嵌套对象和默认值进行销毁

来自分类Dev

用作具有默认值的参数

来自分类Dev

如何使具有默认值的对象不传递给类?

来自分类Dev

具有默认值的默认模板参数?

来自分类Dev

使用具有默认值的哈希值初始化ruby对象?

来自分类Dev

具有其自身默认值的对象解构分配

来自分类Dev

给定一组字符串,创建词典字典,将其用作具有默认值的条目的键

来自分类Dev

创建具有默认值的表

来自分类Dev

Protobuf:具有默认值的枚举

来自分类Dev

绑定到复杂对象的嵌套字段并在AngularJs中提供默认值?

来自分类Dev

如何检查是否设置了所有具有默认值的对象字段?

来自分类Dev

具有默认值的嵌套分配的奇怪的哈希行为

来自分类Dev

更改具有默认值的现有表

来自分类Dev

具有默认值的Javascript对象

来自分类Dev

具有默认值和默认属性的对象参数接口

来自分类Dev

对象表中的布尔活动列是否应该具有默认值?

来自分类Dev

python pandas dataframe:创建具有默认值的新列,当默认值是可迭代的

来自分类Dev

具有默认值的快速协议

来自分类Dev

斯卡拉火花。通过 DataType 创建具有默认值的对象

Related 相关文章

  1. 1

    添加具有默认值的列

  2. 2

    Protobuf:具有默认值的枚举

  3. 3

    具有默认值的常规解析

  4. 4

    绑定到复杂对象的嵌套字段并在AngularJs中提供默认值?

  5. 5

    具有默认值的聚合物对象属性

  6. 6

    仅插入具有默认值或空值的行

  7. 7

    MySQL:将新列插入到具有其他表默认值的表中

  8. 8

    哈希默认值是具有相同默认值的哈希

  9. 9

    具有默认值的Javascript对象

  10. 10

    如果键在字典中具有伪造的值,则获取默认值

  11. 11

    使用嵌套对象和默认值进行销毁

  12. 12

    用作具有默认值的参数

  13. 13

    如何使具有默认值的对象不传递给类?

  14. 14

    具有默认值的默认模板参数?

  15. 15

    使用具有默认值的哈希值初始化ruby对象?

  16. 16

    具有其自身默认值的对象解构分配

  17. 17

    给定一组字符串,创建词典字典,将其用作具有默认值的条目的键

  18. 18

    创建具有默认值的表

  19. 19

    Protobuf:具有默认值的枚举

  20. 20

    绑定到复杂对象的嵌套字段并在AngularJs中提供默认值?

  21. 21

    如何检查是否设置了所有具有默认值的对象字段?

  22. 22

    具有默认值的嵌套分配的奇怪的哈希行为

  23. 23

    更改具有默认值的现有表

  24. 24

    具有默认值的Javascript对象

  25. 25

    具有默认值和默认属性的对象参数接口

  26. 26

    对象表中的布尔活动列是否应该具有默认值?

  27. 27

    python pandas dataframe:创建具有默认值的新列,当默认值是可迭代的

  28. 28

    具有默认值的快速协议

  29. 29

    斯卡拉火花。通过 DataType 创建具有默认值的对象

热门标签

归档