Fix from SF patch 565085: copy._reduction doesn't __setstate__.
Straightforward fix.
if state:
if deep:
state = deepcopy(state, memo)
- y.__dict__.update(state)
+ if hasattr(y, '__setstate__'):
+ y.__setstate__(state)
+ else:
+ y.__dict__.update(state)
return y
del d
y *= "foo"
vereq(y, (x, "foo"))
+def copy_setstate():
+ if verbose:
+ print "Testing that copy.*copy() correctly uses __setstate__..."
+ import copy
+ class C(object):
+ def __init__(self, foo=None):
+ self.foo = foo
+ self.__foo = foo
+ def setfoo(self, foo=None):
+ self.foo = foo
+ def getfoo(self):
+ return self.__foo
+ def __getstate__(self):
+ return [self.foo]
+ def __setstate__(self, lst):
+ assert len(lst) == 1
+ self.__foo = self.foo = lst[0]
+ a = C(42)
+ a.setfoo(24)
+ vereq(a.foo, 24)
+ vereq(a.getfoo(), 42)
+ b = copy.copy(a)
+ vereq(b.foo, 24)
+ vereq(b.getfoo(), 24)
+ b = copy.deepcopy(a)
+ vereq(b.foo, 24)
+ vereq(b.getfoo(), 24)
+
def test_main():
class_docstrings()
lists()
pickleslots()
docdescriptor()
imulbug()
+ copy_setstate()
if verbose: print "All OK"
if __name__ == "__main__":