DataClassJsonMixin.from_dict将嵌套的dict保留为dict

问题描述

文件nested.py我有

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