Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.

Patch by Daniel Urban.
This commit is contained in:
Alexandre Vassalotti 2013-12-01 13:25:26 -08:00
parent 361e30c17a
commit 5c1c3b4f19
3 changed files with 15 additions and 1 deletions

View File

@ -76,6 +76,14 @@ def copy(x):
if copier:
return copier(x)
try:
issc = issubclass(cls, type)
except TypeError: # cls is not a class
issc = False
if issc:
# treat it as a regular class:
return _copy_immutable(x)
copier = getattr(cls, "__copy__", None)
if copier:
return copier(x)

View File

@ -3,6 +3,7 @@
import copy
import copyreg
import weakref
import abc
from operator import le, lt, ge, gt, eq, ne
import unittest
@ -93,9 +94,11 @@ class TestCopy(unittest.TestCase):
pass
def f():
pass
class WithMetaclass(metaclass=abc.ABCMeta):
pass
tests = [None, 42, 2**100, 3.14, True, False, 1j,
"hello", "hello\u1234", f.__code__,
NewStyle, range(10), Classic, max]
NewStyle, range(10), Classic, max, WithMetaclass]
for x in tests:
self.assertIs(copy.copy(x), x)

View File

@ -24,6 +24,9 @@ Library
- Fixed _pickle.Unpickler to not fail when loading empty strings as
persistent IDs.
- Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Patch by Daniel Urban.
- Issue #6477: Added support for pickling the types of built-in singletons
(i.e., Ellipsis, NotImplemented, None).