\section{\module{copy_reg} ---
         Register \module{pickle} support functions}

\declaremodule[copyreg]{standard}{copy_reg}
\modulesynopsis{Register \module{pickle} support functions.}


The \module{copy_reg} module provides support for the
\refmodule{pickle}\refstmodindex{pickle}\ and
\refmodule{cPickle}\refbimodindex{cPickle}\ modules.  The
\refmodule{copy}\refstmodindex{copy}\ module is likely to use this in the
future as well.  It provides configuration information about object
constructors which are not classes.  Such constructors may be factory
functions or class instances.


\begin{funcdesc}{constructor}{object}
  Declares \var{object} to be a valid constructor.  If \var{object} is
  not callable (and hence not valid as a constructor), raises
  \exception{TypeError}.
\end{funcdesc}

\begin{funcdesc}{pickle}{type, function\optional{, constructor}}
  Declares that \var{function} should be used as a ``reduction''
  function for objects of type \var{type}; \var{type} must not be a
  ``classic'' class object.  (Classic classes are handled differently;
  see the documentation for the \refmodule{pickle} module for
  details.)  \var{function} should return either a string or a tuple
  containing two or three elements.

  The optional \var{constructor} parameter, if provided, is a
  callable object which can be used to reconstruct the object when
  called with the tuple of arguments returned by \var{function} at
  pickling time.  \exception{TypeError} will be raised if
  \var{object} is a class or \var{constructor} is not callable.

  See the \refmodule{pickle} module for more
  details on the interface expected of \var{function} and
  \var{constructor}.
\end{funcdesc}
