\section{Built-in Module \sectcode{marshal}}

\bimodindex{marshal}
This module contains functions that can read and write Python
values in a binary format.  The format is specific to Python, but
independent of machine architecture issues (e.g., you can write a
Python value to a file on a PC, transport the file to a Sun, and read
it back there).  Details of the format are undocumented on purpose;
it may change between Python versions (although it rarely does).%
\footnote{The name of this module stems from a bit of terminology used
by the designers of Modula-3 (amongst others), who use the term
``marshalling'' for shipping of data around in a self-contained form.
Strictly speaking, ``to marshal'' means to convert some data from
internal to external form (in an RPC buffer for instance) and
``unmarshalling'' for the reverse process.}

This is not a general ``persistency'' module.  For general persistency
and transfer of Python objects through RPC calls, see the modules
\code{pickle} and \code{shelve}.  The \code{marshal} module exists
mainly to support reading and writing the ``pseudo-compiled'' code for
Python modules of \samp{.pyc} files.
\stmodindex{pickle}
\stmodindex{shelve}
\obindex{code}

Not all Python object types are supported; in general, only objects
whose value is independent from a particular invocation of Python can
be written and read by this module.  The following types are supported:
\code{None}, integers, long integers, floating point numbers,
strings, tuples, lists, dictionaries, and code objects, where it
should be understood that tuples, lists and dictionaries are only
supported as long as the values contained therein are themselves
supported; and recursive lists and dictionaries should not be written
(they will cause infinite loops).

{\bf Caveat:} On machines where C's \code{long int} type has more than
32 bits (such as the DEC Alpha), it
is possible to create plain Python integers that are longer than 32
bits.  Since the current \code{marshal} module uses 32 bits to
transfer plain Python integers, such values are silently truncated.
This particularly affects the use of very long integer literals in
Python modules --- these will be accepted by the parser on such
machines, but will be silently be truncated when the module is read
from the \code{.pyc} instead.%
\footnote{A solution would be to refuse such literals in the parser,
since they are inherently non-portable.  Another solution would be to
let the \code{marshal} module raise an exception when an integer value
would be truncated.  At least one of these solutions will be
implemented in a future version.}

There are functions that read/write files as well as functions
operating on strings.

The module defines these functions:

\renewcommand{\indexsubitem}{(in module marshal)}

\begin{funcdesc}{dump}{value\, file}
  Write the value on the open file.  The value must be a supported
  type.  The file must be an open file object such as
  \code{sys.stdout} or returned by \code{open()} or
  \code{posix.popen()}.
  
  If the value has (or contains an object that has) an unsupported type,
  a \code{ValueError} exception is raised -- but garbage data will also
  be written to the file.  The object will not be properly read back by
  \code{load()}.
\end{funcdesc}

\begin{funcdesc}{load}{file}
  Read one value from the open file and return it.  If no valid value
  is read, raise \code{EOFError}, \code{ValueError} or
  \code{TypeError}.  The file must be an open file object.

  Warning: If an object containing an unsupported type was marshalled
  with \code{dump()}, \code{load()} will substitute \code{None} for the
  unmarshallable type.
\end{funcdesc}

\begin{funcdesc}{dumps}{value}
  Return the string that would be written to a file by
  \code{dump(value, file)}.  The value must be a supported type.
  Raise a \code{ValueError} exception if value has (or contains an
  object that has) an unsupported type.
\end{funcdesc}

\begin{funcdesc}{loads}{string}
  Convert the string to a value.  If no valid value is found, raise
  \code{EOFError}, \code{ValueError} or \code{TypeError}.  Extra
  characters in the string are ignored.
\end{funcdesc}
