@@ -662,8 +662,9 @@ def _serialize(self, target_obj, data_type=None, **kwargs):
662
662
_serialized .update (_new_attr ) # type: ignore
663
663
_new_attr = _new_attr [k ] # type: ignore
664
664
_serialized = _serialized [k ]
665
- except ValueError :
666
- continue
665
+ except ValueError as err :
666
+ if isinstance (err , SerializationError ):
667
+ raise
667
668
668
669
except (AttributeError , KeyError , TypeError ) as err :
669
670
msg = "Attribute {} in object {} cannot be serialized.\n {}" .format (attr_name , class_name , str (target_obj ))
@@ -741,6 +742,8 @@ def query(self, name, data, data_type, **kwargs):
741
742
742
743
:param data: The data to be serialized.
743
744
:param str data_type: The type to be serialized from.
745
+ :keyword bool skip_quote: Whether to skip quote the serialized result.
746
+ Defaults to False.
744
747
:rtype: str
745
748
:raises: TypeError if serialization fails.
746
749
:raises: ValueError if data is None
@@ -749,10 +752,8 @@ def query(self, name, data, data_type, **kwargs):
749
752
# Treat the list aside, since we don't want to encode the div separator
750
753
if data_type .startswith ("[" ):
751
754
internal_data_type = data_type [1 :- 1 ]
752
- data = [self .serialize_data (d , internal_data_type , ** kwargs ) if d is not None else "" for d in data ]
753
- if not kwargs .get ("skip_quote" , False ):
754
- data = [quote (str (d ), safe = "" ) for d in data ]
755
- return str (self .serialize_iter (data , internal_data_type , ** kwargs ))
755
+ do_quote = not kwargs .get ("skip_quote" , False )
756
+ return str (self .serialize_iter (data , internal_data_type , do_quote = do_quote , ** kwargs ))
756
757
757
758
# Not a list, regular serialization
758
759
output = self .serialize_data (data , data_type , ** kwargs )
@@ -891,6 +892,8 @@ def serialize_iter(self, data, iter_type, div=None, **kwargs):
891
892
not be None or empty.
892
893
:param str div: If set, this str will be used to combine the elements
893
894
in the iterable into a combined string. Default is 'None'.
895
+ :keyword bool do_quote: Whether to quote the serialized result of each iterable element.
896
+ Defaults to False.
894
897
:rtype: list, str
895
898
"""
896
899
if isinstance (data , str ):
@@ -903,9 +906,14 @@ def serialize_iter(self, data, iter_type, div=None, **kwargs):
903
906
for d in data :
904
907
try :
905
908
serialized .append (self .serialize_data (d , iter_type , ** kwargs ))
906
- except ValueError :
909
+ except ValueError as err :
910
+ if isinstance (err , SerializationError ):
911
+ raise
907
912
serialized .append (None )
908
913
914
+ if kwargs .get ("do_quote" , False ):
915
+ serialized = ["" if s is None else quote (str (s ), safe = "" ) for s in serialized ]
916
+
909
917
if div :
910
918
serialized = ["" if s is None else str (s ) for s in serialized ]
911
919
serialized = div .join (serialized )
@@ -950,7 +958,9 @@ def serialize_dict(self, attr, dict_type, **kwargs):
950
958
for key , value in attr .items ():
951
959
try :
952
960
serialized [self .serialize_unicode (key )] = self .serialize_data (value , dict_type , ** kwargs )
953
- except ValueError :
961
+ except ValueError as err :
962
+ if isinstance (err , SerializationError ):
963
+ raise
954
964
serialized [self .serialize_unicode (key )] = None
955
965
956
966
if "xml" in serialization_ctxt :
0 commit comments