问题描述
@H_404_1@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]
现在,如果我运行此脚本
@H_404_1@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)}")
我明白了
@H_404[email protected] B(b_val=42) has type <class 'nested.B'>
@H_404_1@d is {'val': {'b_val': 42}}
@H_404_1@new_a.val {'b_val': 42} has type <class 'dict'>
我看了@H_404_1@dataclasses-json,似乎正在放弃here。
在@H_404_1@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