Unverified Kaydet (Commit) 27085787 authored tarafından Berker Peksag's avatar Berker Peksag Kaydeden (comit) GitHub

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.
üst 9863de03
...@@ -75,24 +75,20 @@ def copy(x): ...@@ -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=[]): ...@@ -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=[]): ...@@ -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 ...@@ -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: ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment