Issue #11480: Fixed copy.copy to work with classes with custom metaclasses.
Patch by Daniel Urban.
This commit is contained in:
parent
361e30c17a
commit
5c1c3b4f19
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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).
|
||||
|
||||
|
|
Loading…
Reference in New Issue