@@ -116,6 +116,8 @@ class Serializer:
116116 def __init__ (self , ** kwargs ):
117117 self .set_serialization_depth (0 )
118118 self .set_options (Options (** kwargs ))
119+ self .init_callbacks ()
120+
119121 self .schema = Schema ()
120122
121123 def __call__ (self , value , only = (), extend = ()):
@@ -136,10 +138,9 @@ def set_serialization_depth(self, value: int):
136138
137139 def set_options (self , opts : Options ):
138140 self .opts = opts
139- self .apply_opts ()
140141
141- def apply_opts (self ):
142- """Apply current Options to callbacks"""
142+ def init_callbacks (self ):
143+ """Initialize callbacks"""
143144 self .serialize_types = (
144145 * (self .opts .serialize_types or ()),
145146 (self .atomic_types , lambda x : x ), # Should be checked before any other type
@@ -187,17 +188,17 @@ def is_forkable(self, value):
187188 value , (Iterable , dict , SerializerMixin )
188189 )
189190
190- def fork (self , value , key : str ):
191+ def fork (self , key : str ) -> "Serializer" :
191192 """
192- Process data in a separate serializer
193+ Return new serializer for a key
193194 :return: serialized value
194195 """
195196 serializer = Serializer (** self .opts ._asdict ())
196197 serializer .set_serialization_depth (self .serialization_depth + 1 )
197198 serializer .schema = self .schema .fork (key = key )
198199
199- logger .debug ("Fork serializer for type:%s key:%s" , get_type ( value ) , key )
200- return serializer ( value )
200+ logger .debug ("Fork serializer for key:%s" , key )
201+ return serializer
201202
202203 def serialize (self , value ):
203204 if self .is_valid_callable (value ):
@@ -225,10 +226,12 @@ def serialize_dict(self, value: dict) -> dict:
225226 for k , v in value .items ():
226227 if self .schema .is_included (k ): # TODO: Skip check if is NOT greedy
227228 logger .debug ("Serialize key:%s type:%s of dict" , k , get_type (v ))
229+
230+ serializer = self
228231 if self .is_forkable (v ):
229- res [ k ] = self .fork (key = k , value = v )
230- else :
231- res [k ] = self .serialize (v )
232+ serializer = self .fork (key = k )
233+
234+ res [k ] = serializer .serialize (v )
232235 else :
233236 logger .debug ("Skip key:%s of dict" , k )
234237 return res
@@ -247,10 +250,12 @@ def serialize_model(self, value) -> dict:
247250 logger .debug (
248251 "Serialize key:%s type:%s model:%s" , k , get_type (v ), get_type (value )
249252 )
253+
254+ serializer = self
250255 if self .is_forkable (v ):
251- res [ k ] = self .fork (key = k , value = v )
252- else :
253- res [k ] = self .serialize (v )
256+ serializer = self .fork (key = k )
257+
258+ res [k ] = serializer .serialize (v )
254259
255260 else :
256261 logger .debug ("Skip key:%s of model:%s" , k , get_type (value ))
0 commit comments