嵌套字典到具有默认值的对象
Nested dict to object with default value
我正在使用 dataclasses
+ dataclasses_json
来实现我的网站 api。
我的应用程序会将请求从dict解码为object,我希望在没有填充每个字段的情况下仍然可以生成对象,并用默认值填充空字段。
这是我可能的代码:
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 字段的名称不同于 classes 名称,即你不能有字段 "Glasses"
和 class Glasses
,您必须将 class 重命名为 Glasses_
或重命名您的字段名称。
另一种选择是为 classes 类型创建别名,即为 Glasses
.
创建别名 GlassesT
类型别名的代码版本:
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))
重命名后的代码版本 classes:
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))
我正在使用 dataclasses
+ dataclasses_json
来实现我的网站 api。
我的应用程序会将请求从dict解码为object,我希望在没有填充每个字段的情况下仍然可以生成对象,并用默认值填充空字段。
这是我可能的代码:
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 字段的名称不同于 classes 名称,即你不能有字段 "Glasses"
和 class Glasses
,您必须将 class 重命名为 Glasses_
或重命名您的字段名称。
另一种选择是为 classes 类型创建别名,即为 Glasses
.
GlassesT
类型别名的代码版本:
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))
重命名后的代码版本 classes:
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))