summaryrefslogtreecommitdiff
path: root/Lib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2002-06-10 21:10:27 +0000
committerGuido van Rossum <guido@python.org>2002-06-10 21:10:27 +0000
commit9bff172698057b98807c674f25a51603be494434 (patch)
tree4438d96033bb05276746cd0b8b156d21ae6ac553 /Lib
parentfafa34ce9bbbcb343f34681cad42de5259f9d0a3 (diff)
downloadcpython-9bff172698057b98807c674f25a51603be494434.tar.gz
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.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/copy.py23
1 files changed, 15 insertions, 8 deletions
diff --git a/Lib/copy.py b/Lib/copy.py
index 77b7ad3a00..7d06042ac9 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