]> granicus.if.org Git - python/commitdiff
SF patch 560794 (Greg Chapman): deepcopy can't handle custom
authorGuido van Rossum <guido@python.org>
Mon, 10 Jun 2002 21:10:27 +0000 (21:10 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 10 Jun 2002 21:10:27 +0000 (21:10 +0000)
metaclasses.

This is essentially the same problem as that reported in bug 494904
for pickle: deepcopy should treat instances of custom metaclasses the
same way it treats instances of type 'type'.

Bugfix candidate.

Lib/copy.py

index 77b7ad3a005de12f2963ecf53976166e493fc9fd..7d06042ac946415f29e8702140a239e4d80c5828 100644 (file)
@@ -164,17 +164,24 @@ def deepcopy(x, memo = None):
         copierfunction = _deepcopy_dispatch[type(x)]
     except KeyError:
         try:
-            copier = x.__deepcopy__
-        except AttributeError:
+            issc = issubclass(type(x), type)
+        except TypeError:
+            issc = 0
+        if issc:
+            y = _deepcopy_dispatch[type](x, memo)
+        else:
             try:
-                reductor = x.__reduce__
+                copier = x.__deepcopy__
             except AttributeError:
-                raise error, \
-                      "un-deep-copyable object of type %s" % type(x)
+                try:
+                    reductor = x.__reduce__
+                except AttributeError:
+                    raise error, \
+                       "un-deep-copyable object of type %s" % type(x)
+                else:
+                    y = _reconstruct(x, reductor(), 1, memo)
             else:
-                y = _reconstruct(x, reductor(), 1, memo)
-        else:
-            y = copier(memo)
+                y = copier(memo)
     else:
         y = copierfunction(x, memo)
     memo[d] = y