mirror of
https://github.com/python/cpython.git
synced 2025-08-22 17:55:18 +00:00
bpo-11572: Make minor improvements to copy module (GH-8208)
* When doing getattr lookups with a default of "None", it now uses an "is" comparison against None which is more correct * Removed outdated code Patch by Brandon Rhodes.
This commit is contained in:
parent
9863de0355
commit
2708578736
2 changed files with 10 additions and 25 deletions
29
Lib/copy.py
29
Lib/copy.py
|
@ -75,24 +75,20 @@ def copy(x):
|
||||||
if copier:
|
if copier:
|
||||||
return copier(x)
|
return copier(x)
|
||||||
|
|
||||||
try:
|
if issubclass(cls, type):
|
||||||
issc = issubclass(cls, type)
|
|
||||||
except TypeError: # cls is not a class
|
|
||||||
issc = False
|
|
||||||
if issc:
|
|
||||||
# treat it as a regular class:
|
# treat it as a regular class:
|
||||||
return _copy_immutable(x)
|
return _copy_immutable(x)
|
||||||
|
|
||||||
copier = getattr(cls, "__copy__", None)
|
copier = getattr(cls, "__copy__", None)
|
||||||
if copier:
|
if copier is not None:
|
||||||
return copier(x)
|
return copier(x)
|
||||||
|
|
||||||
reductor = dispatch_table.get(cls)
|
reductor = dispatch_table.get(cls)
|
||||||
if reductor:
|
if reductor is not None:
|
||||||
rv = reductor(x)
|
rv = reductor(x)
|
||||||
else:
|
else:
|
||||||
reductor = getattr(x, "__reduce_ex__", None)
|
reductor = getattr(x, "__reduce_ex__", None)
|
||||||
if reductor:
|
if reductor is not None:
|
||||||
rv = reductor(4)
|
rv = reductor(4)
|
||||||
else:
|
else:
|
||||||
reductor = getattr(x, "__reduce__", None)
|
reductor = getattr(x, "__reduce__", None)
|
||||||
|
@ -146,18 +142,14 @@ def deepcopy(x, memo=None, _nil=[]):
|
||||||
cls = type(x)
|
cls = type(x)
|
||||||
|
|
||||||
copier = _deepcopy_dispatch.get(cls)
|
copier = _deepcopy_dispatch.get(cls)
|
||||||
if copier:
|
if copier is not None:
|
||||||
y = copier(x, memo)
|
y = copier(x, memo)
|
||||||
else:
|
else:
|
||||||
try:
|
if issubclass(cls, type):
|
||||||
issc = issubclass(cls, type)
|
|
||||||
except TypeError: # cls is not a class (old Boost; see SF #502085)
|
|
||||||
issc = 0
|
|
||||||
if issc:
|
|
||||||
y = _deepcopy_atomic(x, memo)
|
y = _deepcopy_atomic(x, memo)
|
||||||
else:
|
else:
|
||||||
copier = getattr(x, "__deepcopy__", None)
|
copier = getattr(x, "__deepcopy__", None)
|
||||||
if copier:
|
if copier is not None:
|
||||||
y = copier(memo)
|
y = copier(memo)
|
||||||
else:
|
else:
|
||||||
reductor = dispatch_table.get(cls)
|
reductor = dispatch_table.get(cls)
|
||||||
|
@ -165,7 +157,7 @@ def deepcopy(x, memo=None, _nil=[]):
|
||||||
rv = reductor(x)
|
rv = reductor(x)
|
||||||
else:
|
else:
|
||||||
reductor = getattr(x, "__reduce_ex__", None)
|
reductor = getattr(x, "__reduce_ex__", None)
|
||||||
if reductor:
|
if reductor is not None:
|
||||||
rv = reductor(4)
|
rv = reductor(4)
|
||||||
else:
|
else:
|
||||||
reductor = getattr(x, "__reduce__", None)
|
reductor = getattr(x, "__reduce__", None)
|
||||||
|
@ -198,10 +190,7 @@ d[bool] = _deepcopy_atomic
|
||||||
d[complex] = _deepcopy_atomic
|
d[complex] = _deepcopy_atomic
|
||||||
d[bytes] = _deepcopy_atomic
|
d[bytes] = _deepcopy_atomic
|
||||||
d[str] = _deepcopy_atomic
|
d[str] = _deepcopy_atomic
|
||||||
try:
|
d[types.CodeType] = _deepcopy_atomic
|
||||||
d[types.CodeType] = _deepcopy_atomic
|
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
||||||
d[type] = _deepcopy_atomic
|
d[type] = _deepcopy_atomic
|
||||||
d[types.BuiltinFunctionType] = _deepcopy_atomic
|
d[types.BuiltinFunctionType] = _deepcopy_atomic
|
||||||
d[types.FunctionType] = _deepcopy_atomic
|
d[types.FunctionType] = _deepcopy_atomic
|
||||||
|
|
|
@ -510,11 +510,7 @@ class _Pickler:
|
||||||
rv = reduce(obj)
|
rv = reduce(obj)
|
||||||
else:
|
else:
|
||||||
# Check for a class with a custom metaclass; treat as regular class
|
# Check for a class with a custom metaclass; treat as regular class
|
||||||
try:
|
if issubclass(t, type):
|
||||||
issc = issubclass(t, type)
|
|
||||||
except TypeError: # t is not a class (old Boost; see SF #502085)
|
|
||||||
issc = False
|
|
||||||
if issc:
|
|
||||||
self.save_global(obj)
|
self.save_global(obj)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue