from __future__ import annotations
from dataclasses import dataclass
from typing import Annotated
from databind.json import JsonConverter, load
@dataclass(frozen=True)
class Inner:
one: str
two: str
def __str__(self) -> str:
f"{self.one}.{self.two}"
@classmethod
def from_string(cls, val: str) -> Inner:
vals = val.split(".")
return Inner(one=vals[0], two=vals[1])
@dataclass(frozen=True)
class Outer:
number: int
inner: Annotated[
Inner,
JsonConverter.using_classmethods(
Inner, serialize="__str__", deserialize="from_string"
),
]
dict = {"number": 3, "inner": "hello.world"}
loaded = load(dict, Outer)
print(loaded)
Expected Behaviour
Inner struct is parsed using from_string class method and print out:
MyClass(number=3, inner=Inner(one='hello', two='world'))
Actual Behaviour
databind.core.converter.ConversionError: expected typing.Mapping, got str instead
Trace:
$: TypeHint(__main__.Outer)
.inner: TypeHint(typing.Annotated[__main__.Inner, <databind.json.settings.JsonConverter object at 0x1034aec50>])
Reactions are currently unavailable
from __future__ import annotations from dataclasses import dataclass from typing import Annotated from databind.json import JsonConverter, load @dataclass(frozen=True) class Inner: one: str two: str def __str__(self) -> str: f"{self.one}.{self.two}" @classmethod def from_string(cls, val: str) -> Inner: vals = val.split(".") return Inner(one=vals[0], two=vals[1]) @dataclass(frozen=True) class Outer: number: int inner: Annotated[ Inner, JsonConverter.using_classmethods( Inner, serialize="__str__", deserialize="from_string" ), ] dict = {"number": 3, "inner": "hello.world"} loaded = load(dict, Outer) print(loaded)Expected Behaviour
Inner struct is parsed using from_string class method and print out:
Actual Behaviour
databind.core.converter.ConversionError: expected typing.Mapping, got str instead Trace: $: TypeHint(__main__.Outer) .inner: TypeHint(typing.Annotated[__main__.Inner, <databind.json.settings.JsonConverter object at 0x1034aec50>])