1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
from dataclasses import dataclass
from typing import Generic, List, Optional, TypeVar
from dacite import from_dict
T = TypeVar("T")
@dataclass
class Person:
name: str
children: Optional[List["Person"]] = None
@dataclass
class Club:
name: str
members: List["Person"]
@dataclass
class Employee:
name: str
@dataclass
class Team(Generic[T]):
name: str
members: Optional[List[T]] = None
subteams: Optional[List["Team[T]"]] = None
def test_self_reference():
data = {"name": "John Doe", "children": [{"name": "Jane Doe"}]}
result = from_dict(Person, data)
assert result == Person(name="John Doe", children=[Person(name="Jane Doe")])
def test_other_reference():
data = {"name": "FooBar", "members": [{"name": "John Doe", "children": [{"name": "Jane Doe"}]}]}
result = from_dict(Club, data)
assert result == Club(name="FooBar", members=[Person(name="John Doe", children=[Person(name="Jane Doe")])])
def test_generic_self_reference():
data = {"name": "foo", "members": [{"name": "John"}], "subteams": [{"name": "bar", "members": [{"name": "Jane"}]}]}
result = from_dict(Team[Employee], data)
assert result == Team(
name="foo", members=[Employee(name="John")], subteams=[Team(name="bar", members=[Employee(name="Jane")])]
)
|