1- from typing import Callable , List , Type , TypeVar
1+ from typing import Any , Callable , Dict , List , Type , TypeVar
22from typing_extensions import Self , dataclass_transform
33
44import dataclasses
@@ -84,6 +84,26 @@ def init(self, **kwargs):
8484 return init
8585
8686
87+ def get_nonalias (cls : Type ["Exact" ], data : dict ) -> dict :
88+ for field in cls .__dataclass_fields__ .values ():
89+ alias = field .metadata .get ("exacting_alias" )
90+ if alias is not None :
91+ item = data .pop (alias )
92+ data [field .name ] = item
93+
94+ return data
95+
96+
97+ def transform_alias (cls : Type ["Exact" ], data : dict ) -> dict :
98+ for field in cls .__dataclass_fields__ .values ():
99+ alias = field .metadata .get ("exacting_alias" )
100+ if alias is not None :
101+ item = data .pop (field .name )
102+ data [alias ] = item
103+
104+ return data
105+
106+
87107@dataclass_transform (kw_only_default = True )
88108class _ModelKwOnly : ...
89109
@@ -97,14 +117,18 @@ def __init_subclass__(cls) -> None:
97117 init = get_exact_init (dataclass (cls ))
98118 setattr (cls , "__init__" , init )
99119
100- def exact_as_dict (self ):
120+ def exact_as_dict (self ) -> Dict [ str , Any ] :
101121 """(exacting) Creates a dictionary representation of this dataclass instance.
102122
123+ Returns:
124+ dict[str, Any]
125+
103126 Raises:
104127 AssertionError: Expected a dataclass
105128 """
106129 assert is_dataclass (self )
107- return asdict (self )
130+ data = asdict (self )
131+ return transform_alias (self .__class__ , data )
108132
109133 def exact_as_bytes (self ) -> bytes :
110134 """(exacting) Convert this instance of dataclass model into bytes."""
@@ -153,9 +177,9 @@ class Person(Exact):
153177 else :
154178 data = jsonc_to_py (raw )
155179
156- return cls (** data )
180+ return cls (** get_nonalias ( cls , data ) )
157181
158182 @classmethod
159183 def exact_from_bytes (cls , raw : bytes ) -> Self :
160184 data = bytes_to_py (raw )
161- return cls (** data )
185+ return cls (** get_nonalias ( cls , data ) )
0 commit comments