问题描述
import typing as t
from dataclasses import dataclass
from dataclasses_json import DataClassjsonMixin
@dataclass
class B(DataClassjsonMixin):
b_val: int
@dataclass
class A(DataClassjsonMixin):
val: t.Union[str,B]
现在,如果我运行此脚本
import nested
a = nested.A(nested.B(42))
print(f"a.val {a.val} has type {type(a.val)}")
d = a.to_dict()
print(f"d is {d}")
new_a = nested.A.from_dict(d)
print(f"new_a.val {new_a.val} has type {type(new_a.val)}")
我明白了
a.val B(b_val=42) has type <class 'nested.B'>
d is {'val': {'b_val': 42}}
new_a.val {'b_val': 42} has type <class 'dict'>
我看了dataclasses-json
,似乎正在放弃here。
在DataClassjsonMixin
中我们可以不具有非基本类型的并集吗?
解决方法
也许这会适合您:
from dataclasses import dataclass,asdict
from typing import Union
from validated_dc import ValidatedDC
@dataclass
class B(ValidatedDC):
val: int
@dataclass
class A(ValidatedDC):
val: Union[str,B]
data = {"val": "s"}
a = A(**data)
assert a.val == "s"
assert not a.get_errors()
data = {"val": {"val": 1}}
a = A(**data)
assert a.val == B(1)
assert a.val.val == 1
assert asdict(a) == {"val": {"val": 1}}
assert not a.get_errors()
ValidatedDC:https://github.com/EvgeniyBurdin/validated_dc