@@ -119,9 +119,16 @@ def __init__(
119
119
def __getitem__ (self , subfield : str ) -> "Field" :
120
120
return cast (Field , self ._params .get ("fields" , {})[subfield ])
121
121
122
- def _serialize (self , data : Any ) -> Any :
122
+ def _serialize (self , data : Any , skip_empty : bool ) -> Any :
123
123
return data
124
124
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
+
125
132
def _deserialize (self , data : Any ) -> Any :
126
133
return data
127
134
@@ -133,10 +140,16 @@ def empty(self) -> Optional[Any]:
133
140
return AttrList ([])
134
141
return self ._empty ()
135
142
136
- def serialize (self , data : Any ) -> Any :
143
+ def serialize (self , data : Any , skip_empty : bool = True ) -> Any :
137
144
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 )
140
153
141
154
def deserialize (self , data : Any ) -> Any :
142
155
if isinstance (data , (list , AttrList , tuple )):
@@ -186,7 +199,7 @@ def _deserialize(self, data: Any) -> Range["_SupportsComparison"]:
186
199
data = {k : self ._core_field .deserialize (v ) for k , v in data .items ()} # type: ignore[union-attr]
187
200
return Range (data )
188
201
189
- def _serialize (self , data : Any ) -> Optional [Dict [str , Any ]]:
202
+ def _serialize (self , data : Any , skip_empty : bool ) -> Optional [Dict [str , Any ]]:
190
203
if data is None :
191
204
return None
192
205
if not isinstance (data , collections .abc .Mapping ):
@@ -550,7 +563,7 @@ def _deserialize(self, data: Any) -> "InnerDoc":
550
563
return self ._wrap (data )
551
564
552
565
def _serialize (
553
- self , data : Optional [Union [Dict [str , Any ], "InnerDoc" ]]
566
+ self , data : Optional [Union [Dict [str , Any ], "InnerDoc" ]], skip_empty : bool
554
567
) -> Optional [Dict [str , Any ]]:
555
568
if data is None :
556
569
return None
@@ -559,7 +572,7 @@ def _serialize(
559
572
if isinstance (data , collections .abc .Mapping ):
560
573
return data
561
574
562
- return data .to_dict ()
575
+ return data .to_dict (skip_empty = skip_empty )
563
576
564
577
def clean (self , data : Any ) -> Any :
565
578
data = super ().clean (data )
@@ -768,7 +781,7 @@ def clean(self, data: str) -> str:
768
781
def _deserialize (self , data : Any ) -> bytes :
769
782
return base64 .b64decode (data )
770
783
771
- def _serialize (self , data : Any ) -> Optional [str ]:
784
+ def _serialize (self , data : Any , skip_empty : bool ) -> Optional [str ]:
772
785
if data is None :
773
786
return None
774
787
return base64 .b64encode (data ).decode ()
@@ -2619,7 +2632,7 @@ def _deserialize(self, data: Any) -> Union["IPv4Address", "IPv6Address"]:
2619
2632
# the ipaddress library for pypy only accepts unicode.
2620
2633
return ipaddress .ip_address (unicode (data ))
2621
2634
2622
- def _serialize (self , data : Any ) -> Optional [str ]:
2635
+ def _serialize (self , data : Any , skip_empty : bool ) -> Optional [str ]:
2623
2636
if data is None :
2624
2637
return None
2625
2638
return str (data )
@@ -3367,10 +3380,10 @@ def __init__(
3367
3380
def _deserialize (self , data : Any ) -> "Query" :
3368
3381
return Q (data ) # type: ignore[no-any-return]
3369
3382
3370
- def _serialize (self , data : Any ) -> Optional [Dict [str , Any ]]:
3383
+ def _serialize (self , data : Any , skip_empty : bool ) -> Optional [Dict [str , Any ]]:
3371
3384
if data is None :
3372
3385
return None
3373
- return data .to_dict () # type: ignore[no-any-return]
3386
+ return data .to_dict (skip_empty = skip_empty ) # type: ignore[no-any-return]
3374
3387
3375
3388
3376
3389
class Point (Field ):
0 commit comments