[Python-checkins] CVS: python/dist/src/Lib/test test_descr.py,1.75,1.76 test_descrtut.py,1.7,1.8

Guido van Rossum gvanrossum@users.sourceforge.net
Tue, 25 Sep 2001 09:26:00 -0700


Update of /cvsroot/python/python/dist/src/Lib/test
In directory usw-pr-cvs1:/tmp/cvs-serv12467/Lib/test

Modified Files:
	test_descr.py test_descrtut.py 
Log Message:
- Provisional support for pickling new-style objects. (*)

- Made cls.__module__ writable.

- Ensure that obj.__dict__ is returned as {}, not None, even upon first
  reference; it simply springs into life when you ask for it.

(*) The pickling support is provisional for the following reasons:

- It doesn't support classes with __slots__.

- It relies on additional support in copy_reg.py: the C method
  __reduce__, defined in the object class, really calls calling
  copy_reg._reduce(obj).  Eventually the Python code in copy_reg.py
  needs to be migrated to C, but I'd like to experiment with the
  Python implementation first.  The _reduce() code also relies on an
  additional helper function, _reconstructor(), defined in
  copy_reg.py; this should also be reimplemented in C.



Index: test_descr.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_descr.py,v
retrieving revision 1.75
retrieving revision 1.76
diff -C2 -d -r1.75 -r1.76
*** test_descr.py	2001/09/25 03:43:42	1.75
--- test_descr.py	2001/09/25 16:25:58	1.76
***************
*** 786,790 ****
          pass
      x = Cdict()
!     verify(x.__dict__ is None)
      x.foo = 1
      verify(x.foo == 1)
--- 786,790 ----
          pass
      x = Cdict()
!     verify(x.__dict__ == {})
      x.foo = 1
      verify(x.foo == 1)
***************
*** 2033,2037 ****
--- 2033,2097 ----
      cant(list(), object)
  
+ def pickles():
+     if verbose: print "Testing pickling new-style classes and objects..."
+     import pickle, cPickle
+ 
+     def sorteditems(d):
+         L = d.items()
+         L.sort()
+         return L
+ 
+     global C
+     class C(object):
+         def __init__(self, a, b):
+             super(C, self).__init__()
+             self.a = a
+             self.b = b
+         def __repr__(self):
+             return "C(%r, %r)" % (self.a, self.b)
+ 
+     global C1
+     class C1(list):
+         def __new__(cls, a, b):
+             return super(C1, cls).__new__(cls)
+         def __init__(self, a, b):
+             self.a = a
+             self.b = b
+         def __repr__(self):
+             return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
  
+     global C2
+     class C2(int):
+         def __new__(cls, a, b, val=0):
+             return super(C2, cls).__new__(cls, val)
+         def __init__(self, a, b, val=0):
+             self.a = a
+             self.b = b
+         def __repr__(self):
+             return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
+ 
+     for p in pickle, cPickle:
+         for bin in 0, 1:
+ 
+             for cls in C, C1, C2:
+                 s = p.dumps(cls, bin)
+                 cls2 = p.loads(s)
+                 verify(cls2 is cls)
+ 
+             a = C1(1, 2); a.append(42); a.append(24)
+             b = C2("hello", "world", 42)
+             s = p.dumps((a, b), bin)
+             x, y = p.loads(s)
+             assert x.__class__ == a.__class__
+             assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
+             assert y.__class__ == b.__class__
+             assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
+             assert `x` == `a`
+             assert `y` == `b`
+             if verbose:
+                 print "a = x =", a
+                 print "b = y =", b
+ 
+ 
  def test_main():
      lists()
***************
*** 2076,2079 ****
--- 2136,2140 ----
      descrdoc()
      setclass()
+     pickles()
      if verbose: print "All OK"
  

Index: test_descrtut.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_descrtut.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** test_descrtut.py	2001/09/25 03:56:29	1.7
--- test_descrtut.py	2001/09/25 16:25:58	1.8
***************
*** 207,210 ****
--- 207,211 ----
       '__ne__',
       '__new__',
+      '__reduce__',
       '__repr__',
       '__rmul__',