首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套字典到具有默认值的对象

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

Stack Overflow用户
提问于 2020-10-28 09:50:19
回答 1查看 213关注 0票数 1

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

我的应用程序会将请求从dict解码到object,我希望object仍然可以在没有填充每个字段的情况下生成,并用默认值填充空字段。

这是我可能的代码:

代码语言:javascript
复制
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)

然后我会得到错误

代码语言:javascript
复制
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),所以我将代码更改为

代码语言:javascript
复制
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)

我得到了另一个错误

代码语言:javascript
复制
  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

有没有可能在不自己编码的情况下使用内置函数来满足我的需求?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-28 10:35:07

您有字段名称和类型名称冲突。为了让你的代码工作,你必须有不同于类名的JSON字段命名,即你不能有字段"Glasses"和类Glasses,你必须将类重命名为Glasses_或者重命名你的字段名。

另一种选择是为类类型创建别名,即为Glasses创建别名GlassesT

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

Try it online!

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
People(Name='Gino', Age=20, Glasses=Glasses(color='red', size='M', prize=4000), Tshirt=Tshirt(color='red', size='M', prize=4000))

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

Try it online!

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
People(Name='Gino', Age=20, Glasses=Glasses_(color='red', size='M', prize=4000), Tshirt=Tshirt_(color='red', size='M', prize=4000))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64565379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档