[Python-checkins] CVS: python/dist/src/Doc/lib libpickle.tex,1.28,1.29

Fred L. Drake fdrake@users.sourceforge.net
Tue, 25 Sep 2001 09:29:19 -0700


Update of /cvsroot/python/python/dist/src/Doc/lib
In directory usw-pr-cvs1:/tmp/cvs-serv13605/lib

Modified Files:
	libpickle.tex 
Log Message:
Revise the example to be more resiliant in the face of continued use after
the object has been pickled; don't mutate the instance dict in the
__getstate__() method.  Other minor changes for style.  Broke up the
displayed interactive session to get better page-breaking behavior for
typeset versions, and to point out an important aspect of the example.

This closes SF bug #453914.


Index: libpickle.tex
===================================================================
RCS file: /cvsroot/python/python/dist/src/Doc/lib/libpickle.tex,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** libpickle.tex	2000/10/18 16:47:52	1.28
--- libpickle.tex	2001/09/25 16:29:17	1.29
***************
*** 306,317 ****
  
  \begin{verbatim}
- # illustrate __setstate__ and __getstate__  methods
- # used in pickling.
- 
  class TextReader:
!     "Print and number lines in a text file."
!     def __init__(self,file):
          self.file = file
!         self.fh = open(file,'r')
          self.lineno = 0
  
--- 306,314 ----
  
  \begin{verbatim}
  class TextReader:
!     """Print and number lines in a text file."""
!     def __init__(self, file):
          self.file = file
!         self.fh = open(file)
          self.lineno = 0
  
***************
*** 321,342 ****
          if not line:
              return None
!         return "%d: %s" % (self.lineno,line[:-1])
  
-     # return data representation for pickled object
      def __getstate__(self):
!         odict = self.__dict__    # get attribute dictionary
!         del odict['fh']          # remove filehandle entry
          return odict
  
-     # restore object state from data representation generated 
-     # by __getstate__
      def __setstate__(self,dict):
!         fh = open(dict['file'])  # reopen file
!         count = dict['lineno']   # read from file...
!         while count:             # until line count is restored
              fh.readline()
              count = count - 1
!         dict['fh'] = fh          # create filehandle entry
!         self.__dict__ = dict     # make dict our attribute dictionary
  \end{verbatim}
  
--- 318,338 ----
          if not line:
              return None
!         if line.endswith("\n"):
!             line = line[:-1]
!         return "%d: %s" % (self.lineno, line)
  
      def __getstate__(self):
!         odict = self.__dict__.copy() # copy the dict since we change it
!         del odict['fh']              # remove filehandle entry
          return odict
  
      def __setstate__(self,dict):
!         fh = open(dict['file'])      # reopen file
!         count = dict['lineno']       # read from file...
!         while count:                 # until line count is restored
              fh.readline()
              count = count - 1
!         self.__dict__.update(dict)   # update attributes
!         self.fh = fh                 # save the file object
  \end{verbatim}
  
***************
*** 353,359 ****
  >>> import pickle
  >>> pickle.dump(obj,open('save.p','w'))
  
!   (start another Python session)
  
  >>> import pickle
  >>> reader = pickle.load(open('save.p'))
--- 349,359 ----
  >>> import pickle
  >>> pickle.dump(obj,open('save.p','w'))
+ \end{verbatim}
  
! If you want to see that \refmodule{pickle} works across Python
! processes, start another Python session, before continuing.  What
! follows can happen from either the same process or a new process.
  
+ \begin{verbatim}
  >>> import pickle
  >>> reader = pickle.load(open('save.p'))