@@ -129,32 +129,25 @@ def deepcopy(x, memo=None, _nil=[]):
129129 copier = _deepcopy_dispatch .get (cls )
130130 if copier is not None :
131131 y = copier (x , memo )
132- else :
133- if issubclass (cls , type ):
132+ elif issubclass (cls , type ):
134133 y = x # atomic copy
134+ elif (copier := getattr (x , "__deepcopy__" , None )) is not None :
135+ y = copier (memo )
136+ else :
137+ if (reductor := dispatch_table .get (cls )):
138+ rv = reductor (x )
139+ elif (reductor := getattr (x , "__reduce_ex__" , None )) is not None :
140+ rv = reductor (4 )
141+ elif (reductor := getattr (x , "__reduce__" , None )):
142+ rv = reductor ()
135143 else :
136- copier = getattr (x , "__deepcopy__" , None )
137- if copier is not None :
138- y = copier (memo )
139- else :
140- reductor = dispatch_table .get (cls )
141- if reductor :
142- rv = reductor (x )
143- else :
144- reductor = getattr (x , "__reduce_ex__" , None )
145- if reductor is not None :
146- rv = reductor (4 )
147- else :
148- reductor = getattr (x , "__reduce__" , None )
149- if reductor :
150- rv = reductor ()
151- else :
152- raise Error (
153- "un(deep)copyable object of type %s" % cls )
154- if isinstance (rv , str ):
155- y = x
156- else :
157- y = _reconstruct (x , memo , * rv )
144+ raise Error (
145+ "un(deep)copyable object of type %s" % cls )
146+
147+ if isinstance (rv , str ):
148+ y = x
149+ else :
150+ y = _reconstruct (x , memo , * rv )
158151
159152 # If is its own copy, don't memoize.
160153 if y is not x :
0 commit comments