]> granicus.if.org Git - python/commitdiff
Fix from SF patch 565085: copy._reduction doesn't __setstate__.
authorGuido van Rossum <guido@python.org>
Thu, 6 Jun 2002 17:53:03 +0000 (17:53 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 6 Jun 2002 17:53:03 +0000 (17:53 +0000)
Straightforward fix.  Will backport to 2.2.  If there's ever a new 2.1
release, this could be backported there too (since it's an issue with
anything that's got both a __reduce__ and a __setstate__).

Lib/test/test_descr.py

index aa71a2f013d43ef2d075157382692cf4b1756071..b83ace82424b2ddadff964bfd0ea94d25db7529a 100644 (file)
@@ -3071,6 +3071,34 @@ def string_exceptions():
     except:
         raise TestFailed, "string subclass allowed as exception"
 
+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 do_this_first():
     if verbose:
         print "Testing SF bug 551412 ..."
@@ -3153,6 +3181,7 @@ def test_main():
     imulbug()
     docdescriptor()
     string_exceptions()
+    copy_setstate()
     if verbose: print "All OK"
 
 if __name__ == "__main__":