]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport:
authorGuido van Rossum <guido@python.org>
Mon, 10 Jun 2002 21:37:00 +0000 (21:37 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 10 Jun 2002 21:37:00 +0000 (21:37 +0000)
SF patch 560794 (Greg Chapman): deepcopy can't handle custom
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'.

Lib/copy.py

index bfe06e342dc6e4694d88d3f99f96856bbfe7fe09..1cb258c2f28fdf5fe1b990dc434e5dc09831012a 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