@@ -18,12 +18,19 @@ def store_error(self, messages, field_name=SCHEMA, index=None):
1818 # field error -> store/merge error messages under field name key
1919 # schema error -> if string or list, store/merge under _schema key
2020 # -> if dict, store/merge with other top-level keys
21+ messages = copy_containers (messages )
2122 if field_name != SCHEMA or not isinstance (messages , dict ):
2223 messages = {field_name : messages }
2324 if index is not None :
2425 messages = {index : messages }
2526 self .errors = merge_errors (self .errors , messages )
2627
28+ def copy_containers (errors ):
29+ if isinstance (errors , list ):
30+ return [copy_containers (val ) for val in errors ]
31+ if isinstance (errors , dict ):
32+ return {key : copy_containers (val ) for key , val in errors .items ()}
33+ return errors
2734
2835def merge_errors (errors1 , errors2 ): # noqa: PLR0911
2936 """Deeply merge two error messages.
@@ -37,24 +44,26 @@ def merge_errors(errors1, errors2): # noqa: PLR0911
3744 return errors1
3845 if isinstance (errors1 , list ):
3946 if isinstance (errors2 , list ):
40- return errors1 + errors2
47+ errors1 .extend (errors2 )
48+ return errors1
4149 if isinstance (errors2 , dict ):
42- return dict (errors2 , ** {SCHEMA : merge_errors (errors1 , errors2 .get (SCHEMA ))})
43- return [* errors1 , errors2 ]
50+ errors2 [SCHEMA ] = merge_errors (errors1 , errors2 .get (SCHEMA ))
51+ return errors2
52+ errors1 .append (errors2 )
53+ return errors1
4454 if isinstance (errors1 , dict ):
45- if isinstance (errors2 , list ):
46- return dict (errors1 , ** {SCHEMA : merge_errors (errors1 .get (SCHEMA ), errors2 )})
4755 if isinstance (errors2 , dict ):
48- errors = dict (errors1 )
4956 for key , val in errors2 .items ():
50- if key in errors :
51- errors [key ] = merge_errors (errors [key ], val )
57+ if key in errors1 :
58+ errors1 [key ] = merge_errors (errors1 [key ], val )
5259 else :
53- errors [key ] = val
54- return errors
55- return dict (errors1 , ** {SCHEMA : merge_errors (errors1 .get (SCHEMA ), errors2 )})
60+ errors1 [key ] = val
61+ return errors1
62+ errors1 [SCHEMA ] = merge_errors (errors1 .get (SCHEMA ), errors2 )
63+ return errors1
5664 if isinstance (errors2 , list ):
5765 return [errors1 , * errors2 ]
5866 if isinstance (errors2 , dict ):
59- return dict (errors2 , ** {SCHEMA : merge_errors (errors1 , errors2 .get (SCHEMA ))})
67+ errors2 [SCHEMA ] = merge_errors (errors1 , errors2 .get (SCHEMA ))
68+ return errors2
6069 return [errors1 , errors2 ]
0 commit comments