@@ -662,8 +662,9 @@ def _serialize(self, target_obj, data_type=None, **kwargs):
662662 _serialized .update (_new_attr ) # type: ignore
663663 _new_attr = _new_attr [k ] # type: ignore
664664 _serialized = _serialized [k ]
665- except ValueError :
666- continue
665+ except ValueError as err :
666+ if isinstance (err , SerializationError ):
667+ raise
667668
668669 except (AttributeError , KeyError , TypeError ) as err :
669670 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):
741742
742743 :param data: The data to be serialized.
743744 :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.
744747 :rtype: str
745748 :raises: TypeError if serialization fails.
746749 :raises: ValueError if data is None
@@ -749,10 +752,8 @@ def query(self, name, data, data_type, **kwargs):
749752 # Treat the list aside, since we don't want to encode the div separator
750753 if data_type .startswith ("[" ):
751754 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 ))
756757
757758 # Not a list, regular serialization
758759 output = self .serialize_data (data , data_type , ** kwargs )
@@ -891,6 +892,8 @@ def serialize_iter(self, data, iter_type, div=None, **kwargs):
891892 not be None or empty.
892893 :param str div: If set, this str will be used to combine the elements
893894 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.
894897 :rtype: list, str
895898 """
896899 if isinstance (data , str ):
@@ -903,9 +906,14 @@ def serialize_iter(self, data, iter_type, div=None, **kwargs):
903906 for d in data :
904907 try :
905908 serialized .append (self .serialize_data (d , iter_type , ** kwargs ))
906- except ValueError :
909+ except ValueError as err :
910+ if isinstance (err , SerializationError ):
911+ raise
907912 serialized .append (None )
908913
914+ if kwargs .get ("do_quote" , False ):
915+ serialized = ["" if s is None else quote (str (s ), safe = "" ) for s in serialized ]
916+
909917 if div :
910918 serialized = ["" if s is None else str (s ) for s in serialized ]
911919 serialized = div .join (serialized )
@@ -950,7 +958,9 @@ def serialize_dict(self, attr, dict_type, **kwargs):
950958 for key , value in attr .items ():
951959 try :
952960 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
954964 serialized [self .serialize_unicode (key )] = None
955965
956966 if "xml" in serialization_ctxt :
0 commit comments