@@ -140,8 +140,20 @@ def decode_case(type: Type[_T], name: str) -> str:
140
140
return name
141
141
142
142
143
+ NONETYPE = type (None )
144
+
145
+ __dataclasses_cache : Dict [Type [Any ], Tuple [dataclasses .Field , ...]] = {} # type: ignore
146
+ __handlers_cache : Dict [Type [Any ], Callable [[Any , bool , bool ], Any ]] = {}
147
+
148
+
143
149
def __default (o : Any ) -> Any :
144
150
if dataclasses .is_dataclass (o ):
151
+ t = type (o )
152
+ fields = __dataclasses_cache .get (t , None )
153
+ if fields is None :
154
+ fields = dataclasses .fields (t )
155
+ __dataclasses_cache [t ] = fields
156
+
145
157
return {
146
158
name : value
147
159
for name , value , field in (
@@ -150,7 +162,7 @@ def __default(o: Any) -> Any:
150
162
getattr (o , field .name ),
151
163
field ,
152
164
)
153
- for field in dataclasses . fields ( o )
165
+ for field in fields
154
166
if (field .init or field .metadata .get ("force_json" , False )) and not field .metadata .get ("nosave" , False )
155
167
)
156
168
if value is not None or field .default == dataclasses .MISSING
@@ -366,21 +378,15 @@ def as_dict(
366
378
return cast (Dict [str , Any ], _as_dict_inner (value , remove_defaults , encode ))
367
379
368
380
369
- NONETYPE = type (None )
370
-
371
-
372
381
def _handle_basic_types (value : Any , _remove_defaults : bool , _encode : bool ) -> Any :
373
382
return value
374
383
375
384
376
- __dataclasses_cache : Dict [Type [Any ], Tuple [dataclasses .Field , ...]] = {} # type: ignore
377
-
378
-
379
385
def _handle_dataclass (value : Any , remove_defaults : bool , encode : bool ) -> Dict [str , Any ]:
380
386
t = type (value )
381
387
fields = __dataclasses_cache .get (t , None )
382
388
if fields is None :
383
- fields = dataclasses .fields (value )
389
+ fields = dataclasses .fields (t )
384
390
__dataclasses_cache [t ] = fields
385
391
return {
386
392
encode_case (t , f ) if encode else f .name : _as_dict_inner (getattr (value , f .name ), remove_defaults , encode )
@@ -442,8 +448,6 @@ def _handle_unknown_type(value: Any, _remove_defaults: bool, _encode: bool) -> A
442
448
),
443
449
]
444
450
445
- __handlers_cache : Dict [Type [Any ], Callable [[Any , bool , bool ], Any ]] = {}
446
-
447
451
448
452
def _as_dict_inner (
449
453
value : Any ,
0 commit comments