Skip to content

Commit 41de6a5

Browse files
committed
Update copy and copyreg to version from CPython 3.8
1 parent 561f4ee commit 41de6a5

File tree

2 files changed

+20
-27
lines changed

2 files changed

+20
-27
lines changed

Lib/copy.py

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -75,24 +75,20 @@ def copy(x):
7575
if copier:
7676
return copier(x)
7777

78-
try:
79-
issc = issubclass(cls, type)
80-
except TypeError: # cls is not a class
81-
issc = False
82-
if issc:
78+
if issubclass(cls, type):
8379
# treat it as a regular class:
8480
return _copy_immutable(x)
8581

8682
copier = getattr(cls, "__copy__", None)
87-
if copier:
83+
if copier is not None:
8884
return copier(x)
8985

9086
reductor = dispatch_table.get(cls)
91-
if reductor:
87+
if reductor is not None:
9288
rv = reductor(x)
9389
else:
9490
reductor = getattr(x, "__reduce_ex__", None)
95-
if reductor:
91+
if reductor is not None:
9692
rv = reductor(4)
9793
else:
9894
reductor = getattr(x, "__reduce__", None)
@@ -111,7 +107,7 @@ def copy(x):
111107
def _copy_immutable(x):
112108
return x
113109
for t in (type(None), int, float, bool, complex, str, tuple,
114-
bytes, frozenset, type, range, slice,
110+
bytes, frozenset, type, range, slice, property,
115111
types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented),
116112
types.FunctionType, weakref.ref):
117113
d[t] = _copy_immutable
@@ -146,26 +142,22 @@ def deepcopy(x, memo=None, _nil=[]):
146142
cls = type(x)
147143

148144
copier = _deepcopy_dispatch.get(cls)
149-
if copier:
145+
if copier is not None:
150146
y = copier(x, memo)
151147
else:
152-
try:
153-
issc = issubclass(cls, type)
154-
except TypeError: # cls is not a class (old Boost; see SF #502085)
155-
issc = 0
156-
if issc:
148+
if issubclass(cls, type):
157149
y = _deepcopy_atomic(x, memo)
158150
else:
159151
copier = getattr(x, "__deepcopy__", None)
160-
if copier:
152+
if copier is not None:
161153
y = copier(memo)
162154
else:
163155
reductor = dispatch_table.get(cls)
164156
if reductor:
165157
rv = reductor(x)
166158
else:
167159
reductor = getattr(x, "__reduce_ex__", None)
168-
if reductor:
160+
if reductor is not None:
169161
rv = reductor(4)
170162
else:
171163
reductor = getattr(x, "__reduce__", None)
@@ -198,14 +190,12 @@ def _deepcopy_atomic(x, memo):
198190
d[complex] = _deepcopy_atomic
199191
d[bytes] = _deepcopy_atomic
200192
d[str] = _deepcopy_atomic
201-
try:
202-
d[types.CodeType] = _deepcopy_atomic
203-
except AttributeError:
204-
pass
193+
d[types.CodeType] = _deepcopy_atomic
205194
d[type] = _deepcopy_atomic
206195
d[types.BuiltinFunctionType] = _deepcopy_atomic
207196
d[types.FunctionType] = _deepcopy_atomic
208197
d[weakref.ref] = _deepcopy_atomic
198+
d[property] = _deepcopy_atomic
209199

210200
def _deepcopy_list(x, memo, deepcopy=deepcopy):
211201
y = []

Lib/copyreg.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,27 @@ def _reconstructor(cls, base, state):
5353

5454
def _reduce_ex(self, proto):
5555
assert proto < 2
56-
for base in self.__class__.__mro__:
56+
cls = self.__class__
57+
for base in cls.__mro__:
5758
if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
5859
break
5960
else:
6061
base = object # not really reachable
6162
if base is object:
6263
state = None
6364
else:
64-
if base is self.__class__:
65-
raise TypeError("can't pickle %s objects" % base.__name__)
65+
if base is cls:
66+
raise TypeError(f"cannot pickle {cls.__name__!r} object")
6667
state = base(self)
67-
args = (self.__class__, base, state)
68+
args = (cls, base, state)
6869
try:
6970
getstate = self.__getstate__
7071
except AttributeError:
7172
if getattr(self, "__slots__", None):
72-
raise TypeError("a class that defines __slots__ without "
73-
"defining __getstate__ cannot be pickled")
73+
raise TypeError(f"cannot pickle {cls.__name__!r} object: "
74+
f"a class that defines __slots__ without "
75+
f"defining __getstate__ cannot be pickled "
76+
f"with protocol {proto}") from None
7477
try:
7578
dict = self.__dict__
7679
except AttributeError:

0 commit comments

Comments
 (0)