@@ -119,9 +119,16 @@ def __init__(
119119 def __getitem__ (self , subfield : str ) -> "Field" :
120120 return cast (Field , self ._params .get ("fields" , {})[subfield ])
121121
122- def _serialize (self , data : Any ) -> Any :
122+ def _serialize (self , data : Any , skip_empty : bool ) -> Any :
123123 return data
124124
125+ def _safe_serialize (self , data : Any , skip_empty : bool ) -> Any :
126+ try :
127+ return self ._serialize (data , skip_empty )
128+ except TypeError :
129+ # older method signature, without skip_empty
130+ return self ._serialize (data ) # type: ignore[call-arg]
131+
125132 def _deserialize (self , data : Any ) -> Any :
126133 return data
127134
@@ -133,10 +140,16 @@ def empty(self) -> Optional[Any]:
133140 return AttrList ([])
134141 return self ._empty ()
135142
136- def serialize (self , data : Any ) -> Any :
143+ def serialize (self , data : Any , skip_empty : bool = True ) -> Any :
137144 if isinstance (data , (list , AttrList , tuple )):
138- return list (map (self ._serialize , cast (Iterable [Any ], data )))
139- return self ._serialize (data )
145+ return list (
146+ map (
147+ self ._safe_serialize ,
148+ cast (Iterable [Any ], data ),
149+ [skip_empty ] * len (data ),
150+ )
151+ )
152+ return self ._safe_serialize (data , skip_empty )
140153
141154 def deserialize (self , data : Any ) -> Any :
142155 if isinstance (data , (list , AttrList , tuple )):
@@ -186,7 +199,7 @@ def _deserialize(self, data: Any) -> Range["_SupportsComparison"]:
186199 data = {k : self ._core_field .deserialize (v ) for k , v in data .items ()} # type: ignore[union-attr]
187200 return Range (data )
188201
189- def _serialize (self , data : Any ) -> Optional [Dict [str , Any ]]:
202+ def _serialize (self , data : Any , skip_empty : bool ) -> Optional [Dict [str , Any ]]:
190203 if data is None :
191204 return None
192205 if not isinstance (data , collections .abc .Mapping ):
@@ -550,7 +563,7 @@ def _deserialize(self, data: Any) -> "InnerDoc":
550563 return self ._wrap (data )
551564
552565 def _serialize (
553- self , data : Optional [Union [Dict [str , Any ], "InnerDoc" ]]
566+ self , data : Optional [Union [Dict [str , Any ], "InnerDoc" ]], skip_empty : bool
554567 ) -> Optional [Dict [str , Any ]]:
555568 if data is None :
556569 return None
@@ -559,7 +572,7 @@ def _serialize(
559572 if isinstance (data , collections .abc .Mapping ):
560573 return data
561574
562- return data .to_dict ()
575+ return data .to_dict (skip_empty = skip_empty )
563576
564577 def clean (self , data : Any ) -> Any :
565578 data = super ().clean (data )
@@ -768,7 +781,7 @@ def clean(self, data: str) -> str:
768781 def _deserialize (self , data : Any ) -> bytes :
769782 return base64 .b64decode (data )
770783
771- def _serialize (self , data : Any ) -> Optional [str ]:
784+ def _serialize (self , data : Any , skip_empty : bool ) -> Optional [str ]:
772785 if data is None :
773786 return None
774787 return base64 .b64encode (data ).decode ()
@@ -2619,7 +2632,7 @@ def _deserialize(self, data: Any) -> Union["IPv4Address", "IPv6Address"]:
26192632 # the ipaddress library for pypy only accepts unicode.
26202633 return ipaddress .ip_address (unicode (data ))
26212634
2622- def _serialize (self , data : Any ) -> Optional [str ]:
2635+ def _serialize (self , data : Any , skip_empty : bool ) -> Optional [str ]:
26232636 if data is None :
26242637 return None
26252638 return str (data )
@@ -3367,7 +3380,7 @@ def __init__(
33673380 def _deserialize (self , data : Any ) -> "Query" :
33683381 return Q (data ) # type: ignore[no-any-return]
33693382
3370- def _serialize (self , data : Any ) -> Optional [Dict [str , Any ]]:
3383+ def _serialize (self , data : Any , skip_empty : bool ) -> Optional [Dict [str , Any ]]:
33713384 if data is None :
33723385 return None
33733386 return data .to_dict () # type: ignore[no-any-return]
0 commit comments