\section{\module{code} ---
         Interpreter base classes}
\declaremodule{standard}{code}

\modulesynopsis{Base classes for interactive Python interpreters.}


The \code{code} module provides facilities to implement
read-eval-print loops in Python.  Two classes and convenience
functions are included which can be used to build applications which
provide an interactive interpreter prompt.


\begin{classdesc}{InteractiveInterpreter}{\optional{locals}}
This class deals with parsing and interpreter state (the user's
namespace); it does not deal with input buffering or prompting or
input file naming (the filename is always passed in explicitly).
The optional \var{locals} argument specifies the dictionary in
which code will be executed; it defaults to a newly created
dictionary with key \code{'__name__'} set to \code{'__console__'}
and key \code{'__doc__'} set to \code{None}.
\end{classdesc}

\begin{classdesc}{InteractiveConsole}{\optional{locals\optional{, filename}}}
Closely emulate the behavior of the interactive Python interpreter.
This class builds on \class{InteractiveInterpreter} and adds
prompting using the familiar \code{sys.ps1} and \code{sys.ps2}, and
input buffering.
\end{classdesc}


\begin{funcdesc}{interact}{\optional{banner\optional{,
                           readfunc\optional{, local}}}}
Convenience function to run a read-eval-print loop.  This creates a
new instance of \class{InteractiveConsole} and sets \var{readfunc}
to be used as the \method{raw_input()} method, if provided.  If
\var{local} is provided, it is passed to the
\class{InteractiveConsole} constructor for use as the default
namespace for the interpreter loop.  The \method{interact()} method
of the instance is then run with \var{banner} passed as the banner
to use, if provided.  The console object is discarded after use.
\end{funcdesc}

\begin{funcdesc}{compile_command}{source\optional{,
                                  filename\optional{, symbol}}}
This function is useful for programs that want to emulate Python's
interpreter main loop (a.k.a. the read-eval-print loop).  The tricky
part is to determine when the user has entered an incomplete command
that can be completed by entering more text (as opposed to a
complete command or a syntax error).  This function
\emph{almost} always makes the same decision as the real interpreter
main loop.

\var{source} is the source string; \var{filename} is the optional
filename from which source was read, defaulting to \code{'<input>'};
and \var{symbol} is the optional grammar start symbol, which should
be either \code{'single'} (the default) or \code{'eval'}.

Returns a code object (the same as \code{compile(\var{source},
\var{filename}, \var{symbol})}) if the command is complete and
valid; \code{None} if the command is incomplete; raises
\exception{SyntaxError} if the command is complete and contains a
syntax error, or raises \exception{OverflowError} or
\exception{ValueError} if the command cotains an invalid literal.
\end{funcdesc}


\subsection{Interactive Interpreter Objects
            \label{interpreter-objects}}

\begin{methoddesc}{runsource}{source\optional{, filename\optional{, symbol}}}
Compile and run some source in the interpreter.
Arguments are the same as for \function{compile_command()}; the
default for \var{filename} is \code{'<input>'}, and for
\var{symbol} is \code{'single'}.  One several things can happen:

\begin{itemize}
\item
The input is incorrect; \function{compile_command()} raised an
exception (\exception{SyntaxError} or \exception{OverflowError}).  A
syntax traceback will be printed by calling the
\method{showsyntaxerror()} method.  \method{runsource()} returns
\code{False}.

\item
The input is incomplete, and more input is required;
\function{compile_command()} returned \code{None}.
\method{runsource()} returns \code{True}.

\item
The input is complete; \function{compile_command()} returned a code
object.  The code is executed by calling the \method{runcode()} (which
also handles run-time exceptions, except for \exception{SystemExit}).
\method{runsource()} returns \code{False}.
\end{itemize}

The return value can be used to decide whether to use
\code{sys.ps1} or \code{sys.ps2} to prompt the next line.
\end{methoddesc}

\begin{methoddesc}{runcode}{code}
Execute a code object.
When an exception occurs, \method{showtraceback()} is called to
display a traceback.  All exceptions are caught except
\exception{SystemExit}, which is allowed to propagate.

A note about \exception{KeyboardInterrupt}: this exception may occur
elsewhere in this code, and may not always be caught.  The caller
should be prepared to deal with it.
\end{methoddesc}

\begin{methoddesc}{showsyntaxerror}{\optional{filename}}
Display the syntax error that just occurred.  This does not display
a stack trace because there isn't one for syntax errors.
If \var{filename} is given, it is stuffed into the exception instead
of the default filename provided by Python's parser, because it
always uses \code{'<string>'} when reading from a string.
The output is written by the \method{write()} method.
\end{methoddesc}

\begin{methoddesc}{showtraceback}{}
Display the exception that just occurred.  We remove the first stack
item because it is within the interpreter object implementation.
The output is written by the \method{write()} method.
\end{methoddesc}

\begin{methoddesc}{write}{data}
Write a string to the standard error stream (\code{sys.stderr}).
Derived classes should override this to provide the appropriate output
handling as needed.
\end{methoddesc}


\subsection{Interactive Console Objects
            \label{console-objects}}

The \class{InteractiveConsole} class is a subclass of
\class{InteractiveInterpreter}, and so offers all the methods of the
interpreter objects as well as the following additions.

\begin{methoddesc}{interact}{\optional{banner}}
Closely emulate the interactive Python console.
The optional banner argument specify the banner to print before the
first interaction; by default it prints a banner similar to the one
printed by the standard Python interpreter, followed by the class
name of the console object in parentheses (so as not to confuse this
with the real interpreter -- since it's so close!).
\end{methoddesc}

\begin{methoddesc}{push}{line}
Push a line of source text to the interpreter.
The line should not have a trailing newline; it may have internal
newlines.  The line is appended to a buffer and the interpreter's
\method{runsource()} method is called with the concatenated contents
of the buffer as source.  If this indicates that the command was
executed or invalid, the buffer is reset; otherwise, the command is
incomplete, and the buffer is left as it was after the line was
appended.  The return value is \code{True} if more input is required,
\code{False} if the line was dealt with in some way (this is the same as
\method{runsource()}).
\end{methoddesc}

\begin{methoddesc}{resetbuffer}{}
Remove any unhandled source text from the input buffer.
\end{methoddesc}

\begin{methoddesc}{raw_input}{\optional{prompt}}
Write a prompt and read a line.  The returned line does not include
the trailing newline.  When the user enters the \EOF{} key sequence,
\exception{EOFError} is raised.  The base implementation uses the
built-in function \function{raw_input()}; a subclass may replace this
with a different implementation.
\end{methoddesc}
