From 11ade1ddc053dcec884e2431b55fb1c1727c65d7 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 10 Jun 2002 21:10:27 +0000 Subject: 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'. Bugfix candidate. --- Lib/copy.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Lib/copy.py b/Lib/copy.py index 77b7ad3..7d06042 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -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 -- cgit v0.12