Remove _reduce_2, it's now implemented in C.

This commit is contained in:
Guido van Rossum 2003-02-21 22:20:31 +00:00
parent 2bc4a47c86
commit be53242f49
1 changed files with 5 additions and 42 deletions

View File

@ -45,7 +45,10 @@ def _reconstructor(cls, base, state):
_HEAPTYPE = 1<<9
def _reduce(self):
# Python code for object.__reduce_ex__ for protocols 0 and 1
def _reduce_ex(self, proto):
assert proto < 2
for base in self.__class__.__mro__:
if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
break
@ -75,51 +78,11 @@ def _reduce(self):
else:
return _reconstructor, args
# A better version of _reduce, used by copy and pickle protocol 2
# Helper for __reduce_ex__ protocol 2
def __newobj__(cls, *args):
return cls.__new__(cls, *args)
def _reduce_2(obj):
cls = obj.__class__
getnewargs = getattr(obj, "__getnewargs__", None)
if getnewargs:
args = getnewargs()
else:
args = ()
getstate = getattr(obj, "__getstate__", None)
if getstate:
state = getstate()
else:
state = getattr(obj, "__dict__", None)
names = _slotnames(cls)
if names:
slots = {}
nil = []
for name in names:
value = getattr(obj, name, nil)
if value is not nil:
slots[name] = value
if slots:
state = (state, slots)
listitems = dictitems = None
if isinstance(obj, list):
listitems = iter(obj)
elif isinstance(obj, dict):
dictitems = obj.iteritems()
return __newobj__, (cls,) + args, state, listitems, dictitems
# Extended reduce:
def _reduce_ex(obj, proto=0):
obj_reduce = getattr(obj, "__reduce__", None)
if obj_reduce and obj.__class__.__reduce__ is not object.__reduce__:
return obj_reduce()
elif proto < 2:
return _reduce(obj)
else:
return _reduce_2(obj)
def _slotnames(cls):
"""Return a list of slot names for a given class.