diff --git a/Doc/tut.tex b/Doc/tut.tex
index 3406ac4..4291595 100644
--- a/Doc/tut.tex
+++ b/Doc/tut.tex
@@ -1,6 +1,13 @@
 \documentstyle[twoside,11pt,myformat]{report}
 
-\title{Python Tutorial}
+% Things to do:
+% Add a section on file I/O
+% Write a chapter entitled ``Some Useful Modules''
+%  --regex, math+cmath
+% Should really move the Python startup file info to an appendix
+%
+
+\title{Python Tutorial -- DRAFT of \today}
 
 \input{boilerplate}
 
@@ -17,8 +24,7 @@
 \noindent
 Python is a simple, yet powerful programming language that bridges the
 gap between C and shell programming, and is thus ideally suited for
-``throw-away programming''
-and rapid prototyping.  Its syntax is put
+``throw-away programming'' and rapid prototyping.  Its syntax is put
 together from constructs borrowed from a variety of other languages;
 most prominent are influences from ABC, C, Modula-3 and Icon.
 
@@ -27,7 +33,7 @@
 language for highly customizable C applications such as editors or
 window managers.
 
-Python is available for various operating systems, amongst which
+Python is available for many operating systems:
 several flavors of \UNIX{}, the Apple Macintosh, MS-DOS, Windows
 (3.1(1), '95 and NT flavors), OS/2, and others.
 
@@ -58,29 +64,41 @@
 \section{Disclaimer}
 
 Now that there are several books out on Python, this tutorial has lost
-its role as the only introduction to Python for most new users.  It
-takes time to keep a document like this up to date in the face of
-additions to the language, and I simply don't have enough time to do a
-good job.  Therefore, this version of the tutorial is almost unchanged
-since the previous release.  This doesn't mean that the tutorial is
-out of date --- all the examples still work exactly as before.  There
-are simply some new areas of the language that aren't covered.
+its role as the only introduction to Python for most new users.  This
+tutorial does not attempt to be comprehensive and cover every single
+feature, or even every commonly used feature.  Instead, it introduces
+many of Python's most noteworthy features, and will give you a good
+idea of the language's flavor and style.
 
-To make up for this, there are some chapters at the end cover
-important changes in recent Python releases, and these are up to date
-with the current release.
+%It takes time to keep a document like this up to date in the face of
+%additions to the language, and I simply don't have enough time to do a
+%good job.  Therefore, this version of the tutorial is almost unchanged
+%since the previous release.  This doesn't mean that the tutorial is
+%out of date --- all the examples still work exactly as before.  There
+%are simply some new areas of the language that aren't covered.
+
+%To make up for this, there are some chapters at the end that cover
+%important changes in recent Python releases, and these are up to date
+%with the current release.
 
 \section{Introduction}
 
 If you ever wrote a large shell script, you probably know this
 feeling: you'd love to add yet another feature, but it's already so
 slow, and so big, and so complicated; or the feature involves a system
-call or other function that is only accessible from C \ldots  Usually
+call or other function that is only accessible from C \ldots Usually
 the problem at hand isn't serious enough to warrant rewriting the
-script in C; perhaps because the problem requires variable-length
-strings or other data types (like sorted lists of file names) that are
-easy in the shell but lots of work to implement in C; or perhaps just
-because you're not sufficiently familiar with C.
+script in C; perhaps the problem requires variable-length strings or
+other data types (like sorted lists of file names) that are easy in
+the shell but lots of work to implement in C, or perhaps you're not
+sufficiently familiar with C.
+
+Another situation: perhaps you have to work with several C libraries,
+and the usual C write/compile/test/re-compile cycle is too slow.  You
+need to develop software more quickly.  Possibly perhaps you've
+written a program that could use an extension language, and you don't
+want to design a language, write and debug an interpreter for it, then
+tie it into your application.
 
 In such cases, Python may be just the language for you.  Python is
 simple to use, but it is a real programming language, offering much
@@ -98,7 +116,7 @@
 standard modules that you can use as the basis of your programs --- or
 as examples to start learning to program in Python.  There are also
 built-in modules that provide things like file I/O, system calls,
-sockets, and even a generic interface to window systems (STDWIN).
+sockets, and even interfaces to GUI toolkits like Tk.  
 
 Python is an interpreted language, which can save you considerable time
 during program development because no compilation and linking is
@@ -122,17 +140,17 @@
 \end{itemize}
 
 Python is {\em extensible}: if you know how to program in C it is easy
-to add a new built-in
-function or
-module to the interpreter, either to
+to add a new built-in function or module to the interpreter, either to
 perform critical operations at maximum speed, or to link Python
 programs to libraries that may only be available in binary form (such
 as a vendor-specific graphics library).  Once you are really hooked,
 you can link the Python interpreter into an application written in C
 and use it as an extension or command language for that application.
 
-By the way, the language is named after the BBC show ``Monty
-Python's Flying Circus'' and has nothing to do with nasty reptiles...
+By the way, the language is named after the BBC show ``Monty Python's
+Flying Circus'' and has nothing to do with nasty reptiles.  Making
+references to Monty Python skits in documentation is not only allowed,
+it is encouraged.  
 
 \section{Where From Here}
 
@@ -150,12 +168,6 @@
 and finally touching upon advanced concepts like exceptions
 and user-defined classes.
 
-When you're through with the tutorial (or just getting bored), you
-should read the Library Reference, which gives complete (though terse)
-reference material about built-in and standard types, functions and
-modules that can save you a lot of time when writing Python programs.
-
-
 \chapter{Using the Python Interpreter}
 
 \section{Invoking the Interpreter}
@@ -174,11 +186,28 @@
 your local Python guru or system administrator.  (E.g., {\tt
 /usr/local/python} is a popular alternative location.)
 
+Typing an EOF character (Control-D on \UNIX{}, Control-Z or F6 on DOS
+or Windows) at the primary prompt causes the interpreter to exit with
+a zero exit status.  If that doesn't work, you can exit the
+interpreter by typing the following commands: \code{import sys ;
+sys.exit()}.
+
+The interpreter's line-editing features usually aren't very
+sophisticated.  On Unix, whoever installed the interpreter may have
+enabled support for the GNU readline library, which adds more
+elaborate interactive editing and history features. Perhaps the
+quickest check to see whether command line editing is supported is
+typing Control-P to the first Python prompt you get.  If it beeps, you
+have command line editing; see Appendix A for an introduction to the
+keys.  If nothing appears to happen, or if \verb/^P/ is echoed,
+command line editing isn't available; you'll only be able to use
+backspace to remove characters from the current line.
+
 The interpreter operates somewhat like the \UNIX{} shell: when called
 with standard input connected to a tty device, it reads and executes
 commands interactively; when called with a file name argument or with
 a file as standard input, it reads and executes a {\em script} from
-that file.
+that file. 
 
 A third way of starting the interpreter is
 ``{\tt python -c command [arg] ...}'', which
@@ -188,7 +217,7 @@
 command} in its entirety with double quotes.
 
 Note that there is a difference between ``{\tt python file}'' and
-``{\tt python $<$file}''.  In the latter case, input requests from the
+``{\tt python <file}''.  In the latter case, input requests from the
 program, such as calls to {\tt input()} and {\tt raw_input()}, are
 satisfied from {\em file}.  Since this file has already been read
 until the end by the parser before the program starts executing, the
@@ -222,10 +251,7 @@
 with the {\em primary\ prompt}, usually three greater-than signs ({\tt
 >>>}); for continuation lines it prompts with the
 {\em secondary\ prompt},
-by default three dots ({\tt ...}).  Typing an EOF character
-(Control-D on \UNIX{}, Control-Z on DOS or Windows)
-at the primary prompt causes the interpreter to exit with a zero exit
-status.
+by default three dots ({\tt ...}).  
 
 The interpreter prints a welcome message stating its version number
 and a copyright notice before printing the first prompt, e.g.:
@@ -263,44 +289,6 @@
 KeyboardInterrupt} exception, which may be handled by a {\tt try}
 statement.
 
-\subsection{The Module Search Path}
-
-When a module named {\tt spam} is imported, the interpreter searches
-for a file named {\tt spam.py} in the current directory,
-and then in the list of directories specified by
-the environment variable {\tt PYTHONPATH}.  This has the same syntax as
-the \UNIX{} shell variable {\tt PATH}, i.e., a list of colon-separated
-directory names.  When {\tt PYTHONPATH} is not set, or when the file
-is not found there, the search continues in an installation-dependent
-default path, usually {\tt .:/usr/local/lib/python}.
-
-Actually, modules are searched in the list of directories given by the 
-variable {\tt sys.path} which is initialized from the directory 
-containing the input script (or the current directory), {\tt 
-PYTHONPATH} and the installation-dependent default.  This allows 
-Python programs that know what they're doing to modify or replace the 
-module search path.  See the section on Standard Modules later.
-
-\subsection{``Compiled'' Python files}
-
-As an important speed-up of the start-up time for short programs that
-use a lot of standard modules, if a file called {\tt spam.pyc} exists
-in the directory where {\tt spam.py} is found, this is assumed to
-contain an already-``compiled'' version of the module {\tt spam}.  The
-modification time of the version of {\tt spam.py} used to create {\tt
-spam.pyc} is recorded in {\tt spam.pyc}, and the file is ignored if
-these don't match.
-
-Normally, you don't need to do anything to create the {\tt spam.pyc} file.
-Whenever {\tt spam.py} is successfully compiled, an attempt is made to
-write the compiled version to {\tt spam.pyc}.  It is not an error if
-this attempt fails; if for any reason the file is not written
-completely, the resulting {\tt spam.pyc} file will be recognized as
-invalid and thus ignored later.  The contents of the {\tt spam.pyc}
-file is platform independent, so a Python module directory can be
-shared by machines of different architectures.  (Tip for experts:
-the module {\tt compileall} creates {\tt .pyc} files for all modules.)
-
 \subsection{Executable Python scripts}
 
 On BSD'ish \UNIX{} systems, Python scripts can be made directly
@@ -316,6 +304,9 @@
 
 \subsection{The Interactive Startup File}
 
+XXX This should probably be dumped in an appendix, since most people
+don't use Python interactively in non-trivial ways.
+
 When you use Python interactively, it is frequently handy to have some
 standard commands executed every time the interpreter is started.  You
 can do this by setting an environment variable named {\tt
@@ -338,102 +329,6 @@
 in a script, you must write this explicitly in the script, e.g.
 \verb\import os;\ \verb\execfile(os.environ['PYTHONSTARTUP'])\.
 
-\section{Interactive Input Editing and History Substitution}
-
-Some versions of the Python interpreter support editing of the current
-input line and history substitution, similar to facilities found in
-the Korn shell and the GNU Bash shell.  This is implemented using the
-{\em GNU\ Readline} library, which supports Emacs-style and vi-style
-editing.  This library has its own documentation which I won't
-duplicate here; however, the basics are easily explained.
-
-Perhaps the quickest check to see whether command line editing is
-supported is typing Control-P to the first Python prompt you get.  If
-it beeps, you have command line editing.  If nothing appears to
-happen, or if \verb/^P/ is echoed, you can skip the rest of this
-section.
-
-\subsection{Line Editing}
-
-If supported, input line editing is active whenever the interpreter
-prints a primary or secondary prompt.  The current line can be edited
-using the conventional Emacs control characters.  The most important
-of these are: C-A (Control-A) moves the cursor to the beginning of the
-line, C-E to the end, C-B moves it one position to the left, C-F to
-the right.  Backspace erases the character to the left of the cursor,
-C-D the character to its right.  C-K kills (erases) the rest of the
-line to the right of the cursor, C-Y yanks back the last killed
-string.  C-underscore undoes the last change you made; it can be
-repeated for cumulative effect.
-
-\subsection{History Substitution}
-
-History substitution works as follows.  All non-empty input lines
-issued are saved in a history buffer, and when a new prompt is given
-you are positioned on a new line at the bottom of this buffer.  C-P
-moves one line up (back) in the history buffer, C-N moves one down.
-Any line in the history buffer can be edited; an asterisk appears in
-front of the prompt to mark a line as modified.  Pressing the Return
-key passes the current line to the interpreter.  C-R starts an
-incremental reverse search; C-S starts a forward search.
-
-\subsection{Key Bindings}
-
-The key bindings and some other parameters of the Readline library can
-be customized by placing commands in an initialization file called
-{\tt \$HOME/.inputrc}.  Key bindings have the form
-
-\bcode\begin{verbatim}
-key-name: function-name
-\end{verbatim}\ecode
-%
-or
-
-\bcode\begin{verbatim}
-"string": function-name
-\end{verbatim}\ecode
-%
-and options can be set with
-
-\bcode\begin{verbatim}
-set option-name value
-\end{verbatim}\ecode
-%
-For example:
-
-\bcode\begin{verbatim}
-# I prefer vi-style editing:
-set editing-mode vi
-# Edit using a single line:
-set horizontal-scroll-mode On
-# Rebind some keys:
-Meta-h: backward-kill-word
-"\C-u": universal-argument
-"\C-x\C-r": re-read-init-file
-\end{verbatim}\ecode
-%
-Note that the default binding for TAB in Python is to insert a TAB
-instead of Readline's default filename completion function.  If you
-insist, you can override this by putting
-
-\bcode\begin{verbatim}
-TAB: complete
-\end{verbatim}\ecode
-%
-in your {\tt \$HOME/.inputrc}.  (Of course, this makes it hard to type
-indented continuation lines...)
-
-\subsection{Commentary}
-
-This facility is an enormous step forward compared to previous
-versions of the interpreter; however, some wishes are left: It would
-be nice if the proper indentation were suggested on continuation lines
-(the parser knows if an indent token is required next).  The
-completion mechanism might use the interpreter's symbol table.  A
-command to check (or even suggest) matching parentheses, quotes etc.
-would also be useful.
-
-
 \chapter{An Informal Introduction to Python}
 
 In the following examples, input and output are distinguished by the
@@ -441,11 +336,11 @@
 the example, you must type everything after the prompt, when the
 prompt appears; lines that do not begin with a prompt are output from
 the interpreter.%
-\footnote{
-        I'd prefer to use different fonts to distinguish input
-        from output, but the amount of LaTeX hacking that would require
-        is currently beyond my ability.
-}
+%\footnote{
+%        I'd prefer to use different fonts to distinguish input
+%        from output, but the amount of LaTeX hacking that would require
+%        is currently beyond my ability.
+%}
 Note that a secondary prompt on a line by itself in an example means
 you must type a blank line; this is used to end a multi-line command.
 
@@ -512,13 +407,82 @@
 3.0303030303
 >>> 7.0 / 2
 3.5
->>> 
 \end{verbatim}\ecode
+%
+Complex numbers are also supported; imaginary numbers are written with
+a suffix of \code{'j'} or \code{'J'}.  Complex numbers with a nonzero
+real component are written as \code{(\var{real}+\var{imag}j)}, or can
+be created with the \code{complex(\var{real}, \var{imag})} function.
+
+\bcode\begin{verbatim}
+>>> 1j * 1J
+(-1+0j)
+>>> 1j * complex(0,1)
+(-1+0j)
+>>> 3+1j*3
+(3+3j)
+>>> (3+1j)*3
+(9+3j)
+>>> (1+2j)/(1+1j)
+(1.5+0.5j)
+\end{verbatim}\ecode
+%
+Complex numbers are always represented as two floating point numbers,
+the real and imaginary part.  To extract these parts from a complex
+number \code{z}, use \code{z.real} and \code{z.imag}.  
+
+\bcode\begin{verbatim}
+>>> a=1.5+0.5j
+>>> a.real
+1.5
+>>> a.imag
+0.5
+\end{verbatim}\ecode
+%
+The conversion functions to floating point and integer
+(\code{float()}, \code{int()} and \code{long()}) don't work for
+complex numbers --- there is no one correct way to convert a complex
+number to a real number.  Use \code{abs(z)} to get its magnitude (as a
+float) or \code{z.real} to get its real part.
+
+\bcode\begin{verbatim}
+>>> a=1.5+0.5j
+>>> float(a)
+Traceback (innermost last):
+  File "<stdin>", line 1, in ?
+TypeError: can't convert complex to float; use e.g. abs(z)
+>>> a.real
+1.5
+>>> abs(a)
+1.58113883008
+\end{verbatim}\ecode
+%
+In interactive mode, the last printed expression is assigned to the
+variable \code{_}.  This means that when you are using Python as a
+desk calculator, it is somewhat easier to continue calculations, for
+example:
+
+\begin{verbatim}
+>>> tax = 17.5 / 100
+>>> price = 3.50
+>>> price * tax
+0.6125
+>>> price + _
+4.1125
+>>> round(_, 2)
+4.11
+\end{verbatim}
+
+This variable should be treated as read-only by the user.  Don't
+explicitly assign a value to it --- you would create an independent
+local variable with the same name masking the built-in variable with
+its magic behavior.
 
 \subsection{Strings}
 
-Besides numbers, Python can also manipulate strings, enclosed in
-single quotes or double quotes:
+Besides numbers, Python can also manipulate strings, which can be
+expressed in several ways.  They can be enclosed in single quotes or
+double quotes:
 
 \bcode\begin{verbatim}
 >>> 'spam eggs'
@@ -536,12 +500,50 @@
 >>> 
 \end{verbatim}\ecode
 %
-Strings are written the same way as they are typed for input: inside
-quotes and with quotes and other funny characters escaped by backslashes,
-to show the precise value.  The string is enclosed in double quotes if
-the string contains a single quote and no double quotes, else it's
-enclosed in single quotes.  (The {\tt print} statement, described later,
-can be used to write strings without quotes or escapes.)
+String literals can span multiple lines in several ways.  Newlines can be escaped with backslashes, e.g.
+
+\begin{verbatim}
+hello = "This is a rather long string containing\n\
+several lines of text just as you would do in C.\n\
+    Note that whitespace at the beginning of the line is\
+ significant.\n"
+print hello
+\end{verbatim}
+
+which would print the following:
+\begin{verbatim}
+This is a rather long string containing
+several lines of text just as you would do in C.
+    Note that whitespace at the beginning of the line is significant.
+\end{verbatim}
+
+Or, strings can be surrounded in a pair of matching triple-quotes:
+\code{"""} or \code {'''}.  End of lines do not need to be escaped
+when using triple-quotes, but they will be included in the string.
+
+\begin{verbatim}
+print """
+Usage: thingy [OPTIONS] 
+     -h                        Display this usage message
+     -H hostname               Hostname to connect to
+"""
+\end{verbatim}
+
+produces the following output:
+
+\bcode\begin{verbatim}
+Usage: thingy [OPTIONS] 
+     -h                        Display this usage message
+     -H hostname               Hostname to connect to
+\end{verbatim}\ecode
+%
+The interpreter prints the result of string operations in the same way
+as they are typed for input: inside quotes, and with quotes and other
+funny characters escaped by backslashes, to show the precise
+value.  The string is enclosed in double quotes if the string contains
+a single quote and no double quotes, else it's enclosed in single
+quotes.  (The {\tt print} statement, described later, can be used to
+write strings without quotes or escapes.)
 
 Strings can be concatenated (glued together) with the {\tt +}
 operator, and repeated with {\tt *}:
@@ -555,12 +557,15 @@
 >>> 
 \end{verbatim}\ecode
 %
-Strings can be subscripted (indexed); like in C, the first character of
-a string has subscript (index) 0.
+Two string literals next to each other are automatically concatenated;
+the first line above could also have been written \code{word = 'Help'
+'A'}; this only works with two literals, not with arbitrary string expressions.
 
-There is no separate character type; a character is simply a string of
-size one.  Like in Icon, substrings can be specified with the {\em
-slice} notation: two indices separated by a colon.
+Strings can be subscripted (indexed); like in C, the first character
+of a string has subscript (index) 0.  There is no separate character
+type; a character is simply a string of size one.  Like in Icon,
+substrings can be specified with the {\em slice} notation: two indices
+separated by a colon.
 
 \bcode\begin{verbatim}
 >>> word[4]
@@ -1026,6 +1031,7 @@
 
 \bcode\begin{verbatim}
 >>> def fib(n):    # write Fibonacci series up to n
+...     "Print a Fibonacci series up to n"
 ...     a, b = 0, 1
 ...     while b < n:
 ...           print b,
@@ -1039,16 +1045,21 @@
 %
 The keyword {\tt def} introduces a function {\em definition}.  It must
 be followed by the function name and the parenthesized list of formal
-parameters.  The statements that form the body of the function starts at
-the next line, indented by a tab stop.
+parameters.  The statements that form the body of the function start
+at the next line, indented by a tab stop.  The first statement of the
+function body can optionally be a string literal; this string literal
+is the function's documentation string, or \dfn{docstring}.  There are
+tools which use docstrings to automatically produce printed
+documentation, or to let the user interactively browse through code;
+it's good practice to include docstrings in code that you write, so
+try to make a habit of it.
 
 The {\em execution} of a function introduces a new symbol table used
 for the local variables of the function.  More precisely, all variable
 assignments in a function store the value in the local symbol table;
-whereas
-variable references first look in the local symbol table, then
+whereas variable references first look in the local symbol table, then
 in the global symbol table, and then in the table of built-in names.
-Thus,
+Thus, 
 global variables cannot be directly assigned a value within a
 function (unless named in a {\tt global} statement), although
 they may be referenced.
@@ -1102,6 +1113,7 @@
 
 \bcode\begin{verbatim}
 >>> def fib2(n): # return Fibonacci series up to n
+...     "Return a list containing the Fibonacci series up to n"
 ...     result = []
 ...     a, b = 0, 1
 ...     while b < n:
@@ -1142,8 +1154,137 @@
 
 \end{itemize}
 
+\section{More on Defining Functions}
 
-\chapter{Odds and Ends}
+It is also possible to define functions with a variable number of
+arguments.  There are three forms, which can be combined.
+
+\subsection{Default Argument Values}
+
+The most useful form is to specify a default value for one or more
+arguments.  This creates a function that can be called with fewer
+arguments than it is defined, e.g.
+
+\begin{verbatim}
+        def ask_ok(prompt, retries = 4, complaint = 'Yes or no, please!'):
+                while 1:
+                        ok = raw_input(prompt)
+                        if ok in ('y', 'ye', 'yes'): return 1
+                        if ok in ('n', 'no', 'nop', 'nope'): return 0
+                        retries = retries - 1
+                        if retries < 0: raise IOError, 'refusenik user'
+                        print complaint
+\end{verbatim}
+
+This function can be called either like this:
+\verb\ask_ok('Do you really want to quit?')\ or like this:
+\verb\ask_ok('OK to overwrite the file?', 2)\.
+
+The default values are evaluated at the point of function definition
+in the {\em defining} scope, so that e.g.
+
+\begin{verbatim}
+        i = 5
+        def f(arg = i): print arg
+        i = 6
+        f()
+\end{verbatim}
+
+will print \verb\5\.
+
+\subsection{Keyword Arguments}
+
+Functions can also be called using
+keyword arguments of the form \code{\var{keyword} = \var{value}}.  For
+instance, the following function:
+
+\begin{verbatim}
+def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
+    print "-- This parrot wouldn't", action,
+    print "if you put", voltage, "Volts through it."
+    print "-- Lovely plumage, the", type
+    print "-- It's", state, "!"
+\end{verbatim}
+
+could be called in any of the following ways:
+
+\begin{verbatim}
+parrot(1000)
+parrot(action = 'VOOOOOM', voltage = 1000000)
+parrot('a thousand', state = 'pushing up the daisies')
+parrot('a million', 'bereft of life', 'jump')
+\end{verbatim}
+
+but the following calls would all be invalid:
+
+\begin{verbatim}
+parrot()                     # required argument missing
+parrot(voltage=5.0, 'dead')  # non-keyword argument following keyword
+parrot(110, voltage=220)     # duplicate value for argument
+parrot(actor='John Cleese')  # unknown keyword
+\end{verbatim}
+
+In general, an argument list must have any positional arguments
+followed by any keyword arguments, where the keywords must be chosen
+from the formal parameter names.  It's not important whether a formal
+parameter has a default value or not.  No argument must receive a
+value more than once --- formal parameter names corresponding to
+positional arguments cannot be used as keywords in the same calls.
+
+When a final formal parameter of the form \code{**\var{name}} is
+present, it receives a dictionary containing all keyword arguments
+whose keyword doesn't correspond to a formal parameter.  This may be
+combined with a formal parameter of the form \code{*\var{name}}
+(described in the next subsection) which receives a tuple containing
+the positional arguments beyond the formal parameter list.
+(\code{*\var{name}} must occur before \code{**\var{name}}.)  For
+example, if we define a function like this:
+
+\begin{verbatim}
+def cheeseshop(kind, *arguments, **keywords):
+    print "-- Do you have any", kind, '?'
+    print "-- I'm sorry, we're all out of", kind
+    for arg in arguments: print arg
+    print '-'*40
+    for kw in keywords.keys(): print kw, ':', keywords[kw]
+\end{verbatim}
+
+It could be called like this:
+
+\begin{verbatim}
+cheeseshop('Limburger', "It's very runny, sir.",
+           "It's really very, VERY runny, sir.",
+           client='John Cleese',
+           shopkeeper='Michael Palin',
+           sketch='Cheese Shop Sketch')
+\end{verbatim}
+
+and of course it would print:
+
+\begin{verbatim}
+-- Do you have any Limburger ?
+-- I'm sorry, we're all out of Limburger
+It's very runny, sir.
+It's really very, VERY runny, sir.
+----------------------------------------
+client : John Cleese
+shopkeeper : Michael Palin
+sketch : Cheese Shop Sketch
+\end{verbatim}
+
+\subsection{Arbitrary Argument Lists}
+
+Finally, the least frequently used option is to specify that a
+function can be called with an arbitrary number of arguments.  These
+arguments will be wrapped up in a tuple.  Before the variable number
+of arguments, zero or more normal arguments may occur.
+
+\begin{verbatim}
+        def fprintf(file, format, *args):
+                file.write(format % args)
+\end{verbatim}
+
+\chapter{Data Structures}
 
 This chapter describes some things you've learned about already in
 more detail, and adds some new things as well.
@@ -1207,6 +1348,88 @@
 >>>
 \end{verbatim}\ecode
 
+\subsection{Functional Programming Tools}
+
+There are three built-in functions that are very useful when used with
+lists: \verb\filter\, \verb\map\, and \verb\reduce\.
+
+\verb\filter(function, sequence)\ returns a sequence (of the same
+type, if possible) consisting of those items from the sequence for
+which \verb\function(item)\ is true.  For example, to compute some
+primes:
+
+\begin{verbatim}
+        >>> def f(x): return x%2 != 0 and x%3 != 0
+        ...
+        >>> filter(f, range(2, 25))
+        [5, 7, 11, 13, 17, 19, 23]
+        >>>
+\end{verbatim}
+
+\verb\map(function, sequence)\ calls \verb\function(item)\ for each of
+the sequence's items and returns a list of the return values.  For
+example, to compute some cubes:
+
+\begin{verbatim}
+	>>> def cube(x): return x*x*x
+        ...
+        >>> map(cube, range(1, 11))
+        [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
+        >>>
+\end{verbatim}
+
+More than one sequence may be passed; the function must then have as
+many arguments as there are sequences and is called with the
+corresponding item from each sequence (or \verb\None\ if some sequence
+is shorter than another).  If \verb\None\ is passed for the function,
+a function returning its argument(s) is substituted.
+
+Combining these two special cases, we see that
+\verb\map(None, list1, list2)\  is a convenient way of turning a pair
+of lists into a list of pairs.  For example:
+
+\begin{verbatim}
+        >>> seq = range(8)
+	>>> def square(x): return x*x
+        ...
+        >>> map(None, seq, map(square, seq))
+        [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]
+        >>> 
+\end{verbatim}
+
+\verb\reduce(func, sequence)\ returns a single value constructed
+by calling the binary function \verb\func\ on the first two items of the
+sequence, then on the result and the next item, and so on.  For
+example, to compute the sum of the numbers 1 through 10:
+
+\begin{verbatim}
+	>>> def add(x,y): return x+y
+        ...
+        >>> reduce(add, range(1, 11))
+        55
+        >>> 
+\end{verbatim}
+
+If there's only one item in the sequence, its value is returned; if
+the sequence is empty, an exception is raised.
+
+A third argument can be passed to indicate the starting value.  In this
+case the starting value is returned for an empty sequence, and the
+function is first applied to the starting value and the first sequence
+item, then to the result and the next item, and so on.  For example,
+
+\begin{verbatim}
+        >>> def sum(seq):
+        ...     def add(x,y): return x+y
+        ...     return reduce(add, seq, 0)
+        ... 
+        >>> sum(range(1, 11))
+        55
+        >>> sum([])
+        0
+        >>> 
+\end{verbatim}
+
 \section{The {\tt del} statement}
 
 There is a way to remove an item from a list given its index instead
@@ -1323,8 +1546,11 @@
 Dictionaries are sometimes found in other languages as ``associative
 memories'' or ``associative arrays''.  Unlike sequences, which are
 indexed by a range of numbers, dictionaries are indexed by {\em keys},
-which are strings (the use of non-string values as keys
-is supported, but beyond the scope of this tutorial).
+which can be any non-mutable type; strings and numbers can always be
+keys.  Tuples can be used as keys if they contain only strings,
+numbers, or tuples.  You can't use lists as keys, since lists can be
+modified in place using their \code{append()} method.
+
 It is best to think of a dictionary as an unordered set of
 {\em key:value} pairs, with the requirement that the keys are unique
 (within one dictionary).
@@ -1527,6 +1753,7 @@
 >>> 
 \end{verbatim}\ecode
 
+
 \section{More on Modules}
 
 A module can contain executable statements as well as function
@@ -1587,6 +1814,46 @@
 This imports all names except those beginning with an underscore
 ({\tt _}).
 
+\subsection{The Module Search Path}
+
+When a module named {\tt spam} is imported, the interpreter searches
+for a file named {\tt spam.py} in the current directory,
+and then in the list of directories specified by
+the environment variable {\tt PYTHONPATH}.  This has the same syntax as
+the \UNIX{} shell variable {\tt PATH}, i.e., a list of colon-separated
+directory names.  When {\tt PYTHONPATH} is not set, or when the file
+is not found there, the search continues in an installation-dependent
+default path, usually {\tt .:/usr/local/lib/python}.
+
+Actually, modules are searched in the list of directories given by the 
+variable {\tt sys.path} which is initialized from the directory 
+containing the input script (or the current directory), {\tt 
+PYTHONPATH} and the installation-dependent default.  This allows 
+Python programs that know what they're doing to modify or replace the 
+module search path.  See the section on Standard Modules later.
+
+\subsection{``Compiled'' Python files}
+
+As an important speed-up of the start-up time for short programs that
+use a lot of standard modules, if a file called {\tt spam.pyc} exists
+in the directory where {\tt spam.py} is found, this is assumed to
+contain an already-``compiled'' version of the module {\tt spam}.  The
+modification time of the version of {\tt spam.py} used to create {\tt
+spam.pyc} is recorded in {\tt spam.pyc}, and the file is ignored if
+these don't match.
+
+Normally, you don't need to do anything to create the {\tt spam.pyc} file.
+Whenever {\tt spam.py} is successfully compiled, an attempt is made to
+write the compiled version to {\tt spam.pyc}.  It is not an error if
+this attempt fails; if for any reason the file is not written
+completely, the resulting {\tt spam.pyc} file will be recognized as
+invalid and thus ignored later.  The contents of the {\tt spam.pyc}
+file is platform independent, so a Python module directory can be
+shared by machines of different architectures.  (Tip for experts:
+the module {\tt compileall} creates {\tt .pyc} files for all modules.)
+
+XXX Should optimization with -O be covered here?
+
 \section{Standard Modules}
 
 Python comes with a library of standard modules, described in a separate
@@ -1682,8 +1949,13 @@
 \end{verbatim}\ecode
 
 
-\chapter{Output Formatting}
+\chapter{Input and Output}
 
+There are several ways to present the output of a program; data can be
+printed in a human-readable form, or written to a file for future use.
+This chapter will discuss some of the possibilities.
+
+\section{Fancier Output Formatting}
 So far we've encountered two ways of writing values: {\em expression
 statements} and the {\tt print} statement.  (A third way is using the
 {\tt write} method of file objects; the standard output file can be
@@ -1691,19 +1963,21 @@
 information on this.)
 
 Often you'll want more control over the formatting of your output than
-simply printing space-separated values.  The key to nice formatting in
-Python is to do all the string handling yourself; using string slicing
-and concatenation operations you can create any lay-out you can imagine.
-The standard module {\tt string} contains some useful operations for
-padding strings to a given column width; these will be discussed shortly.
-Finally, the \code{\%} operator (modulo) with a string left argument
-interprets this string as a C sprintf format string to be applied to the
-right argument, and returns the string resulting from this formatting
-operation.
+simply printing space-separated values.  There are two ways to format
+your output; the first way is to do all the string handling yourself;
+using string slicing and concatenation operations you can create any
+lay-out you can imagine.  The standard module {\tt string} contains
+some useful operations for padding strings to a given column width;
+these will be discussed shortly.  The second way is to use the
+\code{\%} operator with a string as the left argument.  \code{\%}
+interprets the left argument as a \C\ \code{sprintf()}-style format
+string to be applied to the right argument, and returns the string
+resulting from this formatting operation.
 
 One question remains, of course: how do you convert values to strings?
-Luckily, Python has a way to convert any value to a string: just write
-the value between reverse quotes (\verb/``/).  Some examples:
+Luckily, Python has a way to convert any value to a string: pass it to
+the \verb/repr()/ function, or just write the value between reverse
+quotes (\verb/``/).  Some examples:
 
 \bcode\begin{verbatim}
 >>> x = 10 * 3.14
@@ -1713,7 +1987,7 @@
 The value of x is 31.4, and y is 40000...
 >>> # Reverse quotes work on other types besides numbers:
 ... p = [x, y]
->>> ps = `p`
+>>> ps = repr(p)
 >>> ps
 '[31.4, 40000]'
 >>> # Converting a string adds string quotes and backslashes:
@@ -1788,6 +2062,222 @@
 '3.14159265359'
 >>>
 \end{verbatim}\ecode
+%
+Using the \code{\%} operator looks like this:
+
+\begin{verbatim}
+        >>> import math
+        >>> print 'The value of PI is approximately %5.3f.' % math.pi
+        The value of PI is approximately 3.142.
+        >>> 
+\end{verbatim}
+
+If there is more than one format in the string you pass a tuple as
+right operand, e.g.
+
+\begin{verbatim}
+        >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
+        >>> for name, phone in table.items():
+        ...     print '%-10s ==> %10d' % (name, phone)
+        ... 
+        Jack       ==>       4098
+        Dcab       ==>    8637678
+        Sjoerd     ==>       4127
+        >>> 
+\end{verbatim}
+
+Most formats work exactly as in C and require that you pass the proper
+type; however, if you don't you get an exception, not a core dump.
+The \verb\%s\ format is more relaxed: if the corresponding argument is
+not a string object, it is converted to string using the \verb\str()\
+built-in function.  Using \verb\*\ to pass the width or precision in
+as a separate (integer) argument is supported.  The C formats
+\verb\%n\ and \verb\%p\ are not supported.
+
+If you have a really long format string that you don't want to split
+up, it would be nice if you could reference the variables to be
+formatted by name instead of by position.  This can be done by using
+an extension of C formats using the form \verb\%(name)format\, e.g.
+
+\begin{verbatim}
+        >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
+        >>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table
+        Jack: 4098; Sjoerd: 4127; Dcab: 8637678
+        >>> 
+\end{verbatim}
+
+This is particularly useful in combination with the new built-in
+\verb\vars()\ function, which returns a dictionary containing all
+local variables.
+
+\section{Reading and Writing Files}
+% Opening files 
+\code{open()} returns a file object, and is most commonly used with
+two arguments: \code{open(\var{filename},\var{mode})}.  
+
+\bcode\begin{verbatim}
+>>> f=open('/tmp/workfile', 'w')
+>>> print f
+<open file '/tmp/workfile', mode 'w' at 80a0960>
+\end{verbatim}\ecode
+%
+The first argument is a string containing the filename.  The second
+argument is another string containing a few characters describing the
+way in which the file will be used.  \var{mode} can be \code{'r'} when
+the file will only be read, \code{'w'} for only writing (an existing
+file with the same name will be erased), and \code{'a'} opens the file
+for appending; any data written to the file is automatically added to
+the end.  \code{'r+'} opens the file for both reading and writing.
+The \var{mode} argument is optional; \code{'r'} will be assumed if
+it's omitted.
+
+On Windows, (XXX does the Mac need this too?) \code{'b'} appended to the
+mode opens the file in binary mode, so there are also modes like
+\code{'rb'}, \code{'wb'}, and \code{'r+b'}.  Windows makes a
+distinction between text and binary files; the end-of-line characters
+in text files are automatically altered slightly when data is read or
+written.  This behind-the-scenes modification to file data is fine for
+ASCII text files, but it'll corrupt binary data like that in JPEGs or
+.EXE files.  Be very careful to use binary mode when reading and
+writing such files.
+
+\subsection{Methods of file objects}
+
+The rest of the examples in this section will assume that a file
+object called \code{f} has already been created.
+
+To read a file's contents, call \code{f.read(\var{size})}, which reads
+some quantity of data and returns it as a string.  \var{size} is an
+optional numeric argument.  When \var{size} is omitted or negative,
+the entire contents of the file will be read and returned; it's your
+problem if the file is twice as large as your machine's memory.
+Otherwise, at most \var{size} bytes are read and returned.  If the end
+of the file has been reached, \code{f.read()} will return an empty
+string (\code {""}).
+\bcode\begin{verbatim}
+>>> f.read()
+'This is the entire file.\012'
+>>> f.read()
+''
+\end{verbatim}\ecode
+%
+\code{f.readline()} reads a single line from the file; a newline
+character (\verb/\n/) is left at the end of the string, and is only
+omitted on the last line of the file if the file doesn't end in a
+newline.  This makes the return value unambiguous; if
+\code{f.readline()} returns an empty string, the end of the file has
+been reached, while a blank line is represented by \verb/'\n'/, a
+string containing only a single newline.  
+
+\bcode\begin{verbatim}
+>>> f.readline()
+'This is the first line of the file.\012'
+>>> f.readline()
+'Second line of the file\012'
+>>> f.readline()
+''
+\end{verbatim}\ecode
+%
+\code{f.readlines()} uses {\code{f.readline()} repeatedly, and returns
+a list containing all the lines of data in the file.
+
+\bcode\begin{verbatim}
+>>> f.readlines()
+['This is the first line of the file.\012', 'Second line of the file\012']
+\end{verbatim}\ecode
+%
+\code{f.write(\var{string})} writes the contents of \var{string} to
+the file, returning \code{None}.  
+
+\bcode\begin{verbatim}
+>>> f.write('This is a test\n')
+\end{verbatim}\ecode
+%
+\code{f.tell()} returns an integer giving the file object's current
+position in the file, measured in bytes from the beginning of the
+file.  To change the file object's position, use
+\code{f.seek(\var{offset}, \var{from_what})}.  The position is
+computed from adding \var{offset} to a reference point; the reference
+point is selected by the \var{from_what} argument.  A \var{from_what}
+value of 0 measures from the beginning of the file, 1 uses the current
+file position, and 2 uses the end of the file as the reference point.
+\var{from_what}
+can be omitted and defaults to 0, using the beginning of the file as the reference point.
+
+\bcode\begin{verbatim}
+>>> f=open('/tmp/workfile', 'r+')
+>>> f.write('0123456789abcdef')
+>>> f.seek(5)     # Go to the 5th byte in the file
+>>> f.read(1)        
+'5'
+>>> f.seek(-3, 2) # Go to the 3rd byte before the end
+>>> f.read(1)
+'d'
+\end{verbatim}\ecode
+%
+When you're done with a file, call \code{f.close()} to close it and
+free up any system resources taken up by the open file.  After calling
+\code{f.close()}, attempts to use the file object will automatically fail.
+
+\bcode\begin{verbatim}
+>>> f.close()
+>>> f.read()
+Traceback (innermost last):
+  File "<stdin>", line 1, in ?
+ValueError: I/O operation on closed file
+\end{verbatim}\ecode
+%
+File objects have some additional methods, such as \code{isatty()} and
+\code{truncate()} which are less frequently used; consult the Library
+Reference for a complete guide to file objects.
+
+\subsection{The pickle module}
+
+Strings can easily be written to and read from a file. Numbers take a
+bit more effort, since the \code{read()} method only returns strings,
+which will have to be passed to a function like \code{string.atoi()},
+which takes a string like \code{'123'} and returns its numeric value
+123.  However, when you want to save more complex data types like
+lists, dictionaries, or class instances, things get a lot more
+complicated.  
+
+Rather than have users be constantly writing and debugging code to
+save complicated data types, Python provides a standard module called
+\code{pickle}.  code{pickle} is an amazing module that can take almost
+any Python object (even some forms of Python code!), and convert it to
+a string representation; this process is called \dfn{pickling}.  
+Reconstructing the object from the string representation is called
+\dfn{unpickling}.  Between pickling and unpickling, the string
+representing the object may have been stored in a file or data, or
+sent over a network connection to some distant machine.
+
+If you have an object \code{x}, and a file object \code{f} that's been
+opened for writing, the simplest way to pickle the object takes only
+one line of code:
+
+\bcode\begin{verbatim}
+pickle.dump(x, f)
+\end{verbatim}\ecode
+%
+To unpickle the object again, if \code{f} is a file object which has been
+opened for reading:
+
+\bcode\begin{verbatim}
+x = pickle.load(f)
+\end{verbatim}\ecode
+%
+(There are other variants of this, used when pickling many objects or
+when you don't want to write the pickled data to a file; consult the
+complete documentation for \code{pickle} in the Library Reference.)
+
+\code{pickle} is the standard way to make Python objects which can be
+stored and reused by other programs or by a future invocation of the
+same program; the technical term for this is a \dfn{persistent}
+object.  Because \code{pickle} is so widely used, many authors who
+write Python extensions take care to ensure that new data types such
+as matrices, XXX more examples needed XXX, can be properly pickled and
+unpickled.
+
 
 
 \chapter{Errors and Exceptions}
@@ -1884,7 +2374,7 @@
 ...         print 1.0 / x
 ...     except ZeroDivisionError:
 ...         print '*** has no inverse ***'
-... 
+...     
 0.3333 3.00030003
 2.5 0.4
 0 *** has no inverse ***
@@ -1934,6 +2424,23 @@
 Use this with extreme caution, since it is easy to mask a real
 programming error in this way!
 
+The \verb\try...except\ statement has an optional \verb\else\ clause,
+which must follow all \verb\except\ clauses.  It is useful to place
+code that must be executed if the \verb\try\ clause does not raise an
+exception.  For example:
+
+\begin{verbatim}
+        for arg in sys.argv:
+                try:
+                        f = open(arg, 'r')
+                except IOError:
+                        print 'cannot open', arg
+                else:
+                        print arg, 'has', len(f.readlines()), 'lines'
+                        f.close()
+\end{verbatim}
+
+
 When an exception occurs, it may have an associated value, also known as
 the exceptions's
 {\em argument}.
@@ -1970,8 +2477,9 @@
 ...     print 'Handling run-time error:', detail
 ... 
 Handling run-time error: integer division or modulo
->>> 
+>>>
 \end{verbatim}\ecode
+%
 
 \section{Raising Exceptions}
 
@@ -1990,6 +2498,8 @@
 The first argument to {\tt raise} names the exception to be raised.
 The optional second argument specifies the exception's argument.
 
+%
+
 \section{User-defined Exceptions}
 
 Programs may name their own exceptions by assigning a string to a
@@ -2014,6 +2524,8 @@
 Many standard modules use this to report errors that may occur in
 functions they define.
 
+%
+
 \section{Defining Clean-up Actions}
 
 The {\tt try} statement has another optional clause which is intended to
@@ -2043,7 +2555,6 @@
 A {\tt try} statement must either have one or more {\tt except}
 clauses or one {\tt finally} clause, but not both.
 
-
 \chapter{Classes}
 
 Python's class mechanism adds classes to the language with a minimum
@@ -2071,7 +2582,6 @@
 built-in operators with special syntax (arithmetic operators,
 subscripting etc.) can be redefined for class members.
 
-
 \section{A word about terminology}
 
 Lacking universally accepted terminology to talk about classes, I'll
@@ -2264,6 +2774,7 @@
 
 \begin{verbatim}
         class MyClass:
+                "A simple example class"
                 i = 12345
                 def f(x):
                         return 'hello world'
@@ -2271,8 +2782,10 @@
 
 then \verb\MyClass.i\ and \verb\MyClass.f\ are valid attribute
 references, returning an integer and a function object, respectively.
-Class attributes can also be assigned to, so you can change the
-value of \verb\MyClass.i\ by assignment.
+Class attributes can also be assigned to, so you can change the value
+of \verb\MyClass.i\ by assignment.  \verb\__doc__\ is also a valid
+attribute that's read-only, returning the docstring belonging to
+the class: \verb\"A simple example class"\).  
 
 Class {\em instantiation} uses function notation.  Just pretend that
 the class object is a parameterless function that returns a new
@@ -2600,6 +3113,75 @@
 not clear that these semantics are in any way useful.
 
 
+\section{Private variables through name mangling}
+
+There is now limited support for class-private
+identifiers.  Any identifier of the form \code{__spam} (at least two
+leading underscores, at most one trailing underscore) is now textually
+replaced with \code{_classname__spam}, where \code{classname} is the
+current class name with leading underscore(s) stripped.  This mangling
+is done without regard of the syntactic position of the identifier, so
+it can be used to define class-private instance and class variables,
+methods, as well as globals, and even to store instance variables
+private to this class on instances of {\em other} classes.  Truncation
+may occur when the mangled name would be longer than 255 characters.
+Outside classes, or when the class name consists of only underscores,
+no mangling occurs.
+
+Name mangling is intended to give classes an easy way to define
+``private'' instance variables and methods, without having to worry
+about instance variables defined by derived classes, or mucking with
+instance variables by code outside the class.  Note that the mangling
+rules are designed mostly to avoid accidents; it still is possible for
+a determined soul to access or modify a variable that is considered
+private.  This can even be useful, e.g. for the debugger, and that's
+one reason why this loophole is not closed.  (Buglet: derivation of a
+class with the same name as the base class makes use of private
+variables of the base class possible.)
+
+Notice that code passed to \code{exec}, \code{eval()} or
+\code{evalfile()} does not consider the classname of the invoking 
+class to be the current class; this is similar to the effect of the 
+\code{global} statement, the effect of which is likewise restricted to 
+code that is byte-compiled together.  The same restriction applies to
+\code{getattr()}, \code{setattr()} and \code{delattr()}, as well as
+when referencing \code{__dict__} directly.
+
+Here's an example of a class that implements its own
+\code{__getattr__} and \code{__setattr__} methods and stores all
+attributes in a private variable, in a way that works in Python 1.4 as
+well as in previous versions:
+
+\begin{verbatim}
+class VirtualAttributes:
+    __vdict = None
+    __vdict_name = locals().keys()[0]
+     
+    def __init__(self):
+        self.__dict__[self.__vdict_name] = {}
+    
+    def __getattr__(self, name):
+        return self.__vdict[name]
+    
+    def __setattr__(self, name, value):
+        self.__vdict[name] = value
+\end{verbatim}
+
+%{\em Warning: this is an experimental feature.}  To avoid all
+%potential problems, refrain from using identifiers starting with
+%double underscore except for predefined uses like \code{__init__}.  To
+%use private names while maintaining future compatibility: refrain from
+%using the same private name in classes related via subclassing; avoid
+%explicit (manual) mangling/unmangling; and assume that at some point
+%in the future, leading double underscore will revert to being just a
+%naming convention.  Discussion on extensive compile-time declarations
+%are currently underway, and it is impossible to predict what solution
+%will eventually be chosen for private names.  Double leading
+%underscore is still a candidate, of course --- just not the only one.
+%It is placed in the distribution in the belief that it is useful, and
+%so that widespread experience with its use can be gained.  It will not
+%be removed without providing a better solution and a migration path.
+
 \section{Odds and ends}
 
 Sometimes it is useful to have a data type similar to the Pascal
@@ -2636,608 +3218,7 @@
 object of which the method is an instance, and \verb\m.im_func\ is the
 function object corresponding to the method.
 
-
-\chapter{Recent Additions as of Release 1.1}
-
-Python is an evolving language.  Since this tutorial was last
-thoroughly revised, several new features have been added to the
-language.  While ideally I should revise the tutorial to incorporate
-them in the mainline of the text, lack of time currently requires me
-to take a more modest approach.  In this chapter I will briefly list the
-most important improvements to the language and how you can use them
-to your benefit.
-
-\section{The Last Printed Expression}
-
-In interactive mode, the last printed expression is assigned to the
-variable \code{_}.  This means that when you are using Python as a
-desk calculator, it is somewhat easier to continue calculations, for
-example:
-
-\begin{verbatim}
-        >>> tax = 17.5 / 100
-        >>> price = 3.50
-        >>> price * tax
-        0.6125
-        >>> price + _
-        4.1125
-        >>> round(_, 2)
-        4.11
-        >>> 
-\end{verbatim}
-
-For reasons too embarrassing to explain, this variable is implemented
-as a built-in (living in the module \code{__builtin__}), so it should
-be treated as read-only by the user.  I.e. don't explicitly assign a
-value to it --- you would create an independent local variable with
-the same name masking the built-in variable with its magic behavior.
-
-\section{String Literals}
-
-\subsection{Double Quotes}
-
-Python can now also use double quotes to surround string literals,
-e.g. \verb\"this doesn't hurt a bit"\.  There is no semantic
-difference between strings surrounded by single or double quotes.
-
-\subsection{Continuation Of String Literals}
-
-String literals can span multiple lines by escaping newlines with
-backslashes, e.g.
-
-\begin{verbatim}
-        hello = "This is a rather long string containing\n\
-        several lines of text just as you would do in C.\n\
-            Note that whitespace at the beginning of the line is\
-         significant.\n"
-        print hello
-\end{verbatim}
-
-which would print the following:
-\begin{verbatim}
-        This is a rather long string containing
-        several lines of text just as you would do in C.
-            Note that whitespace at the beginning of the line is significant.
-\end{verbatim}
-
-\subsection{Triple-quoted strings}
-
-In some cases, when you need to include really long strings (e.g.
-containing several paragraphs of informational text), it is annoying
-that you have to terminate each line with \verb@\n\@, especially if
-you would like to reformat the text occasionally with a powerful text
-editor like Emacs.  For such situations, ``triple-quoted'' strings can
-be used, e.g.
-
-\begin{verbatim}
-        hello = """
-
-            This string is bounded by triple double quotes (3 times ").
-        Unescaped newlines in the string are retained, though \
-        it is still possible\nto use all normal escape sequences.
-
-            Whitespace at the beginning of a line is
-        significant.  If you need to include three opening quotes
-        you have to escape at least one of them, e.g. \""".
-
-            This string ends in a newline.
-        """
-\end{verbatim}
-
-Triple-quoted strings can be surrounded by three single quotes as
-well, again without semantic difference.
-
-\subsection{String Literal Juxtaposition}
-
-One final twist: you can juxtapose multiple string literals.  Two or
-more adjacent string literals (but not arbitrary expressions!)
-separated only by whitespace will be concatenated (without intervening
-whitespace) into a single string object at compile time.  This makes
-it possible to continue a long string on the next line without
-sacrificing indentation or performance, unlike the use of the string
-concatenation operator \verb\+\ or the continuation of the literal
-itself on the next line (since leading whitespace is significant
-inside all types of string literals).  Note that this feature, like
-all string features except triple-quoted strings, is borrowed from
-Standard C.
-
-\section{The Formatting Operator}
-
-\subsection{Basic Usage}
-
-The chapter on output formatting is really out of date: there is now
-an almost complete interface to C-style printf formats.  This is done
-by overloading the modulo operator (\verb\%\) for a left operand
-which is a string, e.g.
-
-\begin{verbatim}
-        >>> import math
-        >>> print 'The value of PI is approximately %5.3f.' % math.pi
-        The value of PI is approximately 3.142.
-        >>> 
-\end{verbatim}
-
-If there is more than one format in the string you pass a tuple as
-right operand, e.g.
-
-\begin{verbatim}
-        >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
-        >>> for name, phone in table.items():
-        ...     print '%-10s ==> %10d' % (name, phone)
-        ... 
-        Jack       ==>       4098
-        Dcab       ==>    8637678
-        Sjoerd     ==>       4127
-        >>> 
-\end{verbatim}
-
-Most formats work exactly as in C and require that you pass the proper
-type (however, if you don't you get an exception, not a core dump).
-The \verb\%s\ format is more relaxed: if the corresponding argument is
-not a string object, it is converted to string using the \verb\str()\
-built-in function.  Using \verb\*\ to pass the width or precision in
-as a separate (integer) argument is supported.  The C formats
-\verb\%n\ and \verb\%p\ are not supported.
-
-\subsection{Referencing Variables By Name}
-
-If you have a really long format string that you don't want to split
-up, it would be nice if you could reference the variables to be
-formatted by name instead of by position.  This can be done by using
-an extension of C formats using the form \verb\%(name)format\, e.g.
-
-\begin{verbatim}
-        >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
-        >>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table
-        Jack: 4098; Sjoerd: 4127; Dcab: 8637678
-        >>> 
-\end{verbatim}
-
-This is particularly useful in combination with the new built-in
-\verb\vars()\ function, which returns a dictionary containing all
-local variables.
-
-\section{Optional Function Arguments}
-
-It is now possible to define functions with a variable number of
-arguments.  There are two forms, which can be combined.
-
-\subsection{Default Argument Values}
-
-The most useful form is to specify a default value for one or more
-arguments.  This creates a function that can be called with fewer
-arguments than it is defined, e.g.
-
-\begin{verbatim}
-        def ask_ok(prompt, retries = 4, complaint = 'Yes or no, please!'):
-                while 1:
-                        ok = raw_input(prompt)
-                        if ok in ('y', 'ye', 'yes'): return 1
-                        if ok in ('n', 'no', 'nop', 'nope'): return 0
-                        retries = retries - 1
-                        if retries < 0: raise IOError, 'refusenik user'
-                        print complaint
-\end{verbatim}
-
-This function can be called either like this:
-\verb\ask_ok('Do you really want to quit?')\ or like this:
-\verb\ask_ok('OK to overwrite the file?', 2)\.
-
-The default values are evaluated at the point of function definition
-in the {\em defining} scope, so that e.g.
-
-\begin{verbatim}
-        i = 5
-        def f(arg = i): print arg
-        i = 6
-        f()
-\end{verbatim}
-
-will print \verb\5\.
-
-\subsection{Arbitrary Argument Lists}
-
-It is also possible to specify that a function can be called with an
-arbitrary number of arguments.  These arguments will be wrapped up in
-a tuple.  Before the variable number of arguments, zero or more normal
-arguments may occur, e.g.
-
-\begin{verbatim}
-        def fprintf(file, format, *args):
-                file.write(format % args)
-\end{verbatim}
-
-This feature may be combined with the previous, e.g.
-
-\begin{verbatim}
-        def but_is_it_useful(required, optional = None, *remains):
-                print "I don't know"
-\end{verbatim}
-
-\section{Lambda And Functional Programming Tools}
-
-\subsection{Lambda Forms}
-
-By popular demand, a few features commonly found in functional
-programming languages and Lisp have been added to Python.  With the
-\verb\lambda\ keyword, small anonymous functions can be created.
-Here's a function that returns the sum of its two arguments:
-\verb\lambda a, b: a+b\.  Lambda forms can be used wherever function
-objects are required.  They are syntactically restricted to a single
-expression.  Semantically, they are just syntactic sugar for a normal
-function definition.  Like nested function definitions, lambda forms
-cannot reference variables from the containing scope, but this can be
-overcome through the judicious use of default argument values, e.g.
-
-\begin{verbatim}
-        def make_incrementor(n):
-                return lambda x, incr=n: x+incr
-\end{verbatim}
-
-\subsection{Map, Reduce and Filter}
-
-Three new built-in functions on sequences are good candidate to pass
-lambda forms.
-
-\subsubsection{Map.}
-
-\verb\map(function, sequence)\ calls \verb\function(item)\ for each of
-the sequence's items and returns a list of the return values.  For
-example, to compute some cubes:
-
-\begin{verbatim}
-        >>> map(lambda x: x*x*x, range(1, 11))
-        [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
-        >>>
-\end{verbatim}
-
-More than one sequence may be passed; the function must then have as
-many arguments as there are sequences and is called with the
-corresponding item from each sequence (or \verb\None\ if some sequence
-is shorter than another).  If \verb\None\ is passed for the function,
-a function returning its argument(s) is substituted.
-
-Combining these two special cases, we see that
-\verb\map(None, list1, list2)\  is a convenient way of turning a pair
-of lists into a list of pairs.  For example:
-
-\begin{verbatim}
-        >>> seq = range(8)
-        >>> map(None, seq, map(lambda x: x*x, seq))
-        [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]
-        >>> 
-\end{verbatim}
-
-\subsubsection{Filter.}
-
-\verb\filter(function, sequence)\ returns a sequence (of the same
-type, if possible) consisting of those items from the sequence for
-which \verb\function(item)\ is true.  For example, to compute some
-primes:
-
-\begin{verbatim}
-        >>> filter(lambda x: x%2 != 0 and x%3 != 0, range(2, 25))
-        [5, 7, 11, 13, 17, 19, 23]
-        >>>
-\end{verbatim}
-
-\subsubsection{Reduce.}
-
-\verb\reduce(function, sequence)\ returns a single value constructed
-by calling the (binary) function on the first two items of the
-sequence, then on the result and the next item, and so on.  For
-example, to compute the sum of the numbers 1 through 10:
-
-\begin{verbatim}
-        >>> reduce(lambda x, y: x+y, range(1, 11))
-        55
-        >>> 
-\end{verbatim}
-
-If there's only one item in the sequence, its value is returned; if
-the sequence is empty, an exception is raised.
-
-A third argument can be passed to indicate the starting value.  In this
-case the starting value is returned for an empty sequence, and the
-function is first applied to the starting value and the first sequence
-item, then to the result and the next item, and so on.  For example,
-
-\begin{verbatim}
-        >>> def sum(seq):
-        ...     return reduce(lambda x, y: x+y, seq, 0)
-        ... 
-        >>> sum(range(1, 11))
-        55
-        >>> sum([])
-        0
-        >>> 
-\end{verbatim}
-
-\section{Continuation Lines Without Backslashes}
-
-While the general mechanism for continuation of a source line on the
-next physical line remains to place a backslash on the end of the
-line, expressions inside matched parentheses (or square brackets, or
-curly braces) can now also be continued without using a backslash.
-This is particularly useful for calls to functions with many
-arguments, and for initializations of large tables.
-
-For example:
-
-\begin{verbatim}
-        month_names = ['Januari', 'Februari', 'Maart', 
-                       'April',   'Mei',      'Juni', 
-                       'Juli',    'Augustus', 'September',
-                       'Oktober', 'November', 'December']
-\end{verbatim}
-
-and
-
-\begin{verbatim}
-        CopyInternalHyperLinks(self.context.hyperlinks,
-                               copy.context.hyperlinks,
-                               uidremap)
-\end{verbatim}
-
-\section{Regular Expressions}
-
-While C's printf-style output formats, transformed into Python, are
-adequate for most output formatting jobs, C's scanf-style input
-formats are not very powerful.  Instead of scanf-style input, Python
-offers Emacs-style regular expressions as a powerful input and
-scanning mechanism.  Read the corresponding section in the Library
-Reference for a full description.
-
-\section{Generalized Dictionaries}
-
-The keys of dictionaries are no longer restricted to strings --- they
-can be any immutable basic type including strings, numbers, tuples, or
-(certain) class instances.  (Lists and dictionaries are not acceptable
-as dictionary keys, in order to avoid problems when the object used as
-a key is modified.)
-
-Dictionaries have two new methods: \verb\d.values()\ returns a list of
-the dictionary's values, and \verb\d.items()\ returns a list of the
-dictionary's (key, value) pairs.  Like \verb\d.keys()\, these
-operations are slow for large dictionaries.  Examples:
-
-\begin{verbatim}
-        >>> d = {100: 'honderd', 1000: 'duizend', 10: 'tien'}
-        >>> d.keys()
-        [100, 10, 1000]
-        >>> d.values()
-        ['honderd', 'tien', 'duizend']
-        >>> d.items()
-        [(100, 'honderd'), (10, 'tien'), (1000, 'duizend')]
-        >>> 
-\end{verbatim}
-
-\section{Miscellaneous New Built-in Functions}
-
-The function \verb\vars()\ returns a dictionary containing the current
-local variables.  With a module argument, it returns that module's
-global variables.  The old function \verb\dir(x)\ returns
-\verb\vars(x).keys()\.
-
-The function \verb\round(x)\ returns a floating point number rounded
-to the nearest integer (but still expressed as a floating point
-number).  E.g. \verb\round(3.4) == 3.0\ and \verb\round(3.5) == 4.0\.
-With a second argument it rounds to the specified number of digits,
-e.g. \verb\round(math.pi, 4) == 3.1416\ or even
-\verb\round(123.4, -2) == 100.0\. 
-
-The function \verb\hash(x)\ returns a hash value for an object.
-All object types acceptable as dictionary keys have a hash value (and
-it is this hash value that the dictionary implementation uses).
-
-The function \verb\id(x)\ return a unique identifier for an object.
-For two objects x and y, \verb\id(x) == id(y)\ if and only if
-\verb\x is y\.  (In fact the object's address is used.)
-
-The function \verb\hasattr(x, name)\ returns whether an object has an
-attribute with the given name (a string value).  The function
-\verb\getattr(x, name)\ returns the object's attribute with the given
-name.  The function \verb\setattr(x, name, value)\ assigns a value to
-an object's attribute with the given name.  These three functions are
-useful if the attribute names are not known beforehand.  Note that
-\verb\getattr(x, 'spam')\ is equivalent to \verb\x.spam\, and
-\verb\setattr(x, 'spam', y)\ is equivalent to \verb\x.spam = y\.  By
-definition, \verb\hasattr(x, name)\ returns true if and only if
-\verb\getattr(x, name)\ returns without raising an exception.
-
-\section{Else Clause For Try Statement}
-
-The \verb\try...except\ statement now has an optional \verb\else\
-clause, which must follow all \verb\except\ clauses.  It is useful to
-place code that must be executed if the \verb\try\ clause does not
-raise an exception.  For example:
-
-\begin{verbatim}
-        for arg in sys.argv:
-                try:
-                        f = open(arg, 'r')
-                except IOError:
-                        print 'cannot open', arg
-                else:
-                        print arg, 'has', len(f.readlines()), 'lines'
-                        f.close()
-\end{verbatim}
-
-
-\section{New Class Features in Release 1.1}
-
-Some changes have been made to classes: the operator overloading
-mechanism is more flexible, providing more support for non-numeric use
-of operators (including calling an object as if it were a function),
-and it is possible to trap attribute accesses.
-
-\subsection{New Operator Overloading}
-
-It is no longer necessary to coerce both sides of an operator to the
-same class or type.  A class may still provide a \code{__coerce__}
-method, but this method may return objects of different types or
-classes if it feels like it.  If no \code{__coerce__} is defined, any
-argument type or class is acceptable.
-
-In order to make it possible to implement binary operators where the
-right-hand side is a class instance but the left-hand side is not,
-without using coercions, right-hand versions of all binary operators
-may be defined.  These have an `r' prepended to their name,
-e.g. \code{__radd__}.
-
-For example, here's a very simple class for representing times.  Times
-are initialized from a number of seconds (like time.time()).  Times
-are printed like this: \code{Wed Mar 15 12:28:48 1995}.  Subtracting
-two Times gives their difference in seconds.  Adding or subtracting a
-Time and a number gives a new Time.  You can't add two times, nor can
-you subtract a Time from a number.
-
-\begin{verbatim}
-import time
-
-class Time:
-    def __init__(self, seconds):
-        self.seconds = seconds
-    def __repr__(self):
-        return time.ctime(self.seconds)
-    def __add__(self, x):
-        return Time(self.seconds + x)
-    __radd__ = __add__            # support for x+t
-    def __sub__(self, x):
-        if hasattr(x, 'seconds'): # test if x could be a Time
-            return self.seconds - x.seconds
-        else:
-            return self.seconds - x
-
-now = Time(time.time())
-tomorrow = 24*3600 + now
-yesterday = now - today
-print tomorrow - yesterday        # prints 172800
-\end{verbatim}
-
-\subsection{Trapping Attribute Access}
-
-You can define three new ``magic'' methods in a class now:
-\code{__getattr__(self, name)}, \code{__setattr__(self, name, value)}
-and \code{__delattr__(self, name)}.
-
-The \code{__getattr__} method is called when an attribute access fails,
-i.e. when an attribute access would otherwise raise AttributeError ---
-this is {\em after} the instance's dictionary and its class hierarchy
-have been searched for the named attribute.  Note that if this method
-attempts to access any undefined instance attribute it will be called
-recursively!
-
-The \code{__setattr__} and \code{__delattr__} methods are called when
-assignment to, respectively deletion of an attribute are attempted.
-They are called {\em instead} of the normal action (which is to insert
-or delete the attribute in the instance dictionary).  If either of
-these methods most set or delete any attribute, they can only do so by
-using the instance dictionary directly --- \code{self.__dict__} --- else
-they would be called recursively.
-
-For example, here's a near-universal ``Wrapper'' class that passes all
-its attribute accesses to another object.  Note how the
-\code{__init__} method inserts the wrapped object in
-\code{self.__dict__} in order to avoid endless recursion
-(\code{__setattr__} would call \code{__getattr__} which would call
-itself recursively).
-
-\begin{verbatim}
-class Wrapper:
-    def __init__(self, wrapped):
-        self.__dict__['wrapped'] = wrapped
-    def __getattr__(self, name):
-        return getattr(self.wrapped, name)
-    def __setattr__(self, name, value):
-        setattr(self.wrapped, name, value)
-    def __delattr__(self, name):
-        delattr(self.wrapped, name)
-
-import sys
-f = Wrapper(sys.stdout)
-f.write('hello world\n')          # prints 'hello world'
-\end{verbatim}
-
-A simpler example of \code{__getattr__} is an attribute that is
-computed each time (or the first time) it it accessed.  For instance:
-
-\begin{verbatim}
-from math import pi
-
-class Circle:
-    def __init__(self, radius):
-        self.radius = radius
-    def __getattr__(self, name):
-        if name == 'circumference':
-            return 2 * pi * self.radius
-        if name == 'diameter':
-            return 2 * self.radius
-        if name == 'area':
-           return pi * pow(self.radius, 2)
-        raise AttributeError, name
-\end{verbatim}
-
-\subsection{Calling a Class Instance}
-
-If a class defines a method \code{__call__} it is possible to call its
-instances as if they were functions.  For example:
-
-\begin{verbatim}
-class PresetSomeArguments:
-    def __init__(self, func, *args):
-        self.func, self.args = func, args
-    def __call__(self, *args):
-        return apply(self.func, self.args + args)
-
-f = PresetSomeArguments(pow, 2)    # f(i) computes powers of 2
-for i in range(10): print f(i),    # prints 1 2 4 8 16 32 64 128 256 512
-print                              # append newline
-\end{verbatim}
-
-
-\chapter{New in Release 1.2}
-
-
-This chapter describes even more recent additions to the Python
-language and library.
-
-
-\section{New Class Features}
-
-The semantics of \code{__coerce__} have been changed to be more
-reasonable.  As an example, the new standard module \code{Complex}
-implements fairly complete complex numbers using this.  Additional
-examples of classes with and without \code{__coerce__} methods can be
-found in the \code{Demo/classes} subdirectory, modules \code{Rat} and
-\code{Dates}.
-
-If a class defines no \code{__coerce__} method, this is equivalent to
-the following definition:
-
-\begin{verbatim}
-def __coerce__(self, other): return self, other
-\end{verbatim}
-
-If \code{__coerce__} coerces itself to an object of a different type,
-the operation is carried out using that type --- in release 1.1, this
-would cause an error.
-
-Comparisons involving class instances now invoke \code{__coerce__}
-exactly as if \code{cmp(x, y)} were a binary operator like \code{+}
-(except if \code{x} and \code{y} are the same object).
-
-\section{Unix Signal Handling}
-
-On \UNIX{}, Python now supports signal handling.  The module
-\code{signal} exports functions \code{signal}, \code{pause} and
-\code{alarm}, which act similar to their \UNIX{} counterparts.  The
-module also exports the conventional names for the various signal
-classes (also usable with \code{os.kill()}) and \code{SIG_IGN} and
-\code{SIG_DFL}.  See the section on \code{signal} in the Library
-Reference Manual for more information.
-
-\section{Exceptions Can Be Classes}
+\subsection{Exceptions Can Be Classes}
 
 User-defined exceptions are no longer limited to being string objects
 --- they can be identified by classes as well.  Using this mechanism it
@@ -3295,163 +3276,76 @@
 
 In this release, the built-in exceptions are still strings.
 
+\chapter{What Now?}
 
-\section{Object Persistency and Object Copying}
+Hopefully reading this tutorial has reinforced your interest in using
+Python.  Now what should you do?
 
-Two new modules, \code{pickle} and \code{shelve}, support storage and
-retrieval of (almost) arbitrary Python objects on disk, using the
-\code{dbm} package.  A third module, \code{copy}, provides flexible
-object copying operations.  More information on these modules is
-provided in the Library Reference Manual.
+You should read, or at least page through, the Library Reference,
+which gives complete (though terse) reference material about types,
+functions, and modules that can save you a lot of time when writing
+Python programs.  The standard Python distribution includes a
+\emph{lot} of code in both C and Python; there are modules to read
+Unix mailboxes, retrieve documents via HTTP, generate random numbers,
+parse command-line options, write CGI programs, compress data, and a
+lot more; skimming through the Library Reference will give you an idea
+of what's available.
 
-\subsection{Persistent Objects}
+The major Python Web site is \code{http://www.python.org}; it contains
+code, documentation, and pointers to Python-related pages around the
+Web.  \code{www.python.org} is mirrored in various places around the
+world, such as Europe, Japan, and Australia; a mirror may be faster
+than the main site, depending on your geographical location.  A more
+informal site is \code{http://starship.skyport.net}, which contains a
+bunch of Python-related personal home pages; many people have
+downloadable software here.
 
-The module \code{pickle} provides a general framework for objects to
-disassemble themselves into a stream of bytes and to reassemble such a
-stream back into an object.  It copes with reference sharing,
-recursive objects and instances of user-defined classes, but not
-(directly) with objects that have ``magical'' links into the operating
-system such as open files, sockets or windows.
+For Python-related questions and problem reports, you can post to the
+newsgroup \code{comp.lang.python}, or send them to the mailing list at
+\code{python-list@cwi.nl}.  The newsgroup and mailing list are
+gatewayed, so messages posted to one will automatically be forwarded
+to the other.  There are around 20--30 postings a day, asking (and
+answering) questions, suggesting new features, and announcing new
+modules.  But before posting, be sure to check the list of Frequently
+Asked Questions (also called the FAQ), at
+\code{http://www.python.org/doc/FAQ.html}, or look for it in the
+\code{Misc/} directory of the Python source distribution.  The FAQ
+answers many of the questions that come up again and again, and may
+already contain the solution for your problem.
 
-The \code{pickle} module defines a simple protocol whereby
-user-defined classes can control how they are disassembled and
-assembled.  The method \code{__getinitargs__()}, if defined, returns
-the argument list for the constructor to be used at assembly time (by
-default the constructor is called without arguments).  The methods
-\code{__getstate__()} and \code{__setstate__()} are used to pass
-additional state from disassembly to assembly; by default the
-instance's \code{__dict__} is passed and restored.
+You can support the Python community by joining the Python Software
+Activity, which runs the python.org web, ftp and email servers, and
+organizes Python workshops.  See \code{http://www.python.org/psa/} for
+information on how to join.
 
-Note that \code{pickle} does not open or close any files --- it can be
-used equally well for moving objects around on a network or store them
-in a database.  For ease of debugging, and the inevitable occasional
-manual patch-up, the constructed byte streams consist of printable
-\ASCII{} characters only (though it's not designed to be pretty).
 
-The module \code{shelve} provides a simple model for storing objects
-on files.  The operation \code{shelve.open(filename)} returns a
-``shelf'', which is a simple persistent database with a
-dictionary-like interface.  Database keys are strings, objects stored
-in the database can be anything that \code{pickle} will handle.
+\chapter{Recent Additions as of Release 1.1}
 
-\subsection{Copying Objects}
+XXX Should the stuff in this chapter be deleted, or can a home be found or it elsewhere in the Tutorial?
 
-The module \code{copy} exports two functions: \code{copy()} and
-\code{deepcopy()}.  The \code{copy()} function returns a ``shallow''
-copy of an object; \code{deepcopy()} returns a ``deep'' copy.  The
-difference between shallow and deep copying is only relevant for
-compound objects (objects that contain other objects, like lists or
-class instances):
+\section{Lambda Forms}
 
-\begin{itemize}
+XXX Where to put this?  Or just leave it out?
 
-\item
-A shallow copy constructs a new compound object and then (to the
-extent possible) inserts {\em the same objects} into in that the
-original contains.
+By popular demand, a few features commonly found in functional
+programming languages and Lisp have been added to Python.  With the
+\verb\lambda\ keyword, small anonymous functions can be created.
+Here's a function that returns the sum of its two arguments:
+\verb\lambda a, b: a+b\.  Lambda forms can be used wherever function
+objects are required.  They are syntactically restricted to a single
+expression.  Semantically, they are just syntactic sugar for a normal
+function definition.  Like nested function definitions, lambda forms
+cannot reference variables from the containing scope, but this can be
+overcome through the judicious use of default argument values, e.g.
 
-\item
-A deep copy constructs a new compound object and then, recursively,
-inserts {\em copies} into it of the objects found in the original.
-
-\end{itemize}
-
-Both functions have the same restrictions and use the same protocols
-as \code{pickle} --- user-defined classes can control how they are
-copied by providing methods named \code{__getinitargs__()},
-\code{__getstate__()} and \code{__setstate__()}.
-
+\begin{verbatim}
+        def make_incrementor(n):
+                return lambda x, incr=n: x+incr
+\end{verbatim}
 
 \section{Documentation Strings}
 
-A variety of objects now have a new attribute, \code{__doc__}, which
-is supposed to contain a documentation string (if no documentation is
-present, the attribute is \code{None}).  New syntax, compatible with
-the old interpreter, allows for convenient initialization of the
-\code{__doc__} attribute of modules, classes and functions by placing
-a string literal by itself as the first statement in the suite.  It
-must be a literal --- an expression yielding a string object is not
-accepted as a documentation string, since future tools may need to
-derive documentation from source by parsing.
-
-Here is a hypothetical, amply documented module called \code{Spam}:
-
-\begin{verbatim}
-"""Spam operations.
-
-This module exports two classes, a function and an exception:
-
-class Spam: full Spam functionality --- three can sizes
-class SpamLight: limited Spam functionality --- only one can size
-
-def open(filename): open a file and return a corresponding Spam or
-SpamLight object
-
-GoneOff: exception raised for errors; should never happen
-
-Note that it is always possible to convert a SpamLight object to a
-Spam object by a simple method call, but that the reverse operation is
-generally costly and may fail for a number of reasons.
-"""
-
-class SpamLight:
-    """Limited spam functionality.
-
-    Supports a single can size, no flavor, and only hard disks.
-    """
-
-    def __init__(self, size=12):
-        """Construct a new SpamLight instance.
-
-        Argument is the can size.
-        """
-        # etc.
-
-    # etc.
-
-class Spam(SpamLight):
-    """Full spam functionality.
-
-    Supports three can sizes, two flavor varieties, and all floppy
-    disk formats still supported by current hardware.
-    """
-
-    def __init__(self, size1=8, size2=12, size3=20):
-        """Construct a new Spam instance.
-
-        Arguments are up to three can sizes.
-        """
-        # etc.
-
-    # etc.
-
-def open(filename = "/dev/null"):
-    """Open a can of Spam.
-
-    Argument must be an existing file.
-    """
-    # etc.
-
-class GoneOff:
-    """Class used for Spam exceptions.
-
-    There shouldn't be any.
-    """
-    pass
-\end{verbatim}
-
-After executing ``\code{import Spam}'', the following expressions
-return the various documentation strings from the module:
-
-\begin{verbatim}
-Spam.__doc__
-Spam.SpamLight.__doc__
-Spam.SpamLight.__init__.__doc__
-Spam.Spam.__doc__
-Spam.Spam.__init__.__doc__
-Spam.open.__doc__
-Spam.GoneOff.__doc__
-\end{verbatim}
+XXX Where to put this?  Or just leave it out?
 
 There are emerging conventions about the content and formatting of
 documentation strings.
@@ -3484,755 +3378,97 @@
 whitespace should be stripped.  Equivalence of whitespace should be
 tested after expansion of tabs (to 8 spaces, normally).
 
-In this release, few of the built-in or standard functions and modules
-have documentation strings.
 
+\appendix\chapter{Interactive Input Editing and History Substitution}
 
-\section{Customizing Import and Built-Ins}
+Some versions of the Python interpreter support editing of the current
+input line and history substitution, similar to facilities found in
+the Korn shell and the GNU Bash shell.  This is implemented using the
+{\em GNU\ Readline} library, which supports Emacs-style and vi-style
+editing.  This library has its own documentation which I won't
+duplicate here; however, the basics are easily explained.
 
-In preparation for a ``restricted execution mode'' which will be
-usable to run code received from an untrusted source (such as a WWW
-server or client), the mechanism by which modules are imported has
-been redesigned.  It is now possible to provide your own function
-\code{__import__} which is called whenever an \code{import} statement
-is executed.  There's a built-in function \code{__import__} which
-provides the default implementation, but more interesting, the various
-steps it takes are available separately from the new built-in module
-\code{imp}.  (See the section on \code{imp} in the Library Reference
-Manual for more information on this module --- it also contains a
-complete example of how to write your own \code{__import__} function.)
+\subsection{Line Editing}
 
-When you do \code{dir()} in a fresh interactive interpreter you will
-see another ``secret'' object that's present in every module:
-\code{__builtins__}.  This is either a dictionary or a module
-containing the set of built-in objects used by functions defined in
-current module.  Although normally all modules are initialized with a
-reference to the same dictionary, it is now possible to use a
-different set of built-ins on a per-module basis.  Together with the
-fact that the \code{import} statement uses the \code{__import__}
-function it finds in the importing modules' dictionary of built-ins,
-this forms the basis for a future restricted execution mode.
+If supported, input line editing is active whenever the interpreter
+prints a primary or secondary prompt.  The current line can be edited
+using the conventional Emacs control characters.  The most important
+of these are: C-A (Control-A) moves the cursor to the beginning of the
+line, C-E to the end, C-B moves it one position to the left, C-F to
+the right.  Backspace erases the character to the left of the cursor,
+C-D the character to its right.  C-K kills (erases) the rest of the
+line to the right of the cursor, C-Y yanks back the last killed
+string.  C-underscore undoes the last change you made; it can be
+repeated for cumulative effect.
 
+\subsection{History Substitution}
 
-\section{Python and the World-Wide Web}
+History substitution works as follows.  All non-empty input lines
+issued are saved in a history buffer, and when a new prompt is given
+you are positioned on a new line at the bottom of this buffer.  C-P
+moves one line up (back) in the history buffer, C-N moves one down.
+Any line in the history buffer can be edited; an asterisk appears in
+front of the prompt to mark a line as modified.  Pressing the Return
+key passes the current line to the interpreter.  C-R starts an
+incremental reverse search; C-S starts a forward search.
 
-There is a growing number of modules available for writing WWW tools.
-The previous release already sported modules \code{gopherlib},
-\code{ftplib}, \code{httplib} and \code{urllib} (which unifies the
-other three) for accessing data through the commonest WWW protocols.
-This release also provides \code{cgi}, to ease the writing of
-server-side scripts that use the Common Gateway Interface protocol,
-supported by most WWW servers.  The module \code{urlparse} provides
-precise parsing of a URL string into its components (address scheme,
-network location, path, parameters, query, and fragment identifier).
+\subsection{Key Bindings}
 
-A rudimentary, parser for HTML files is available in the module
-\code{htmllib}.  It currently supports a subset of HTML 1.0 (if you
-bring it up to date, I'd love to receive your fixes!).  Unfortunately
-Python seems to be too slow for real-time parsing and formatting of
-HTML such as required by interactive WWW browsers --- but it's good
-enough to write a ``robot'' (an automated WWW browser that searches
-the web for information).
+The key bindings and some other parameters of the Readline library can
+be customized by placing commands in an initialization file called
+{\tt \$HOME/.inputrc}.  Key bindings have the form
 
+\bcode\begin{verbatim}
+key-name: function-name
+\end{verbatim}\ecode
+%
+or
 
-\section{Miscellaneous}
+\bcode\begin{verbatim}
+"string": function-name
+\end{verbatim}\ecode
+%
+and options can be set with
 
-\begin{itemize}
+\bcode\begin{verbatim}
+set option-name value
+\end{verbatim}\ecode
+%
+For example:
 
-\item
-The \code{socket} module now exports all the needed constants used for
-socket operations, such as \code{SO_BROADCAST}.
+\bcode\begin{verbatim}
+# I prefer vi-style editing:
+set editing-mode vi
+# Edit using a single line:
+set horizontal-scroll-mode On
+# Rebind some keys:
+Meta-h: backward-kill-word
+"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+\end{verbatim}\ecode
+%
+Note that the default binding for TAB in Python is to insert a TAB
+instead of Readline's default filename completion function.  If you
+insist, you can override this by putting
 
-\item
-The functions \code{popen()} and \code{fdopen()} in the \code{os}
-module now follow the pattern of the built-in function \code{open()}:
-the default mode argument is \code{'r'} and the optional third
-argument specifies the buffer size, where \code{0} means unbuffered,
-\code{1} means line-buffered, and any larger number means the size of
-the buffer in bytes.
+\bcode\begin{verbatim}
+TAB: complete
+\end{verbatim}\ecode
+%
+in your {\tt \$HOME/.inputrc}.  (Of course, this makes it hard to type
+indented continuation lines...)
 
-\end{itemize}
+\subsection{Commentary}
 
+This facility is an enormous step forward compared to previous
+versions of the interpreter; however, some wishes are left: It would
+be nice if the proper indentation were suggested on continuation lines
+(the parser knows if an indent token is required next).  The
+completion mechanism might use the interpreter's symbol table.  A
+command to check (or even suggest) matching parentheses, quotes etc.
+would also be useful.
 
-\chapter{New in Release 1.3}
-
-
-This chapter describes yet more recent additions to the Python
-language and library.
-
-
-\section{Keyword Arguments}
-
-Functions and methods written in Python can now be called using
-keyword arguments of the form \code{\var{keyword} = \var{value}}.  For
-instance, the following function:
-
-\begin{verbatim}
-def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
-    print "-- This parrot wouldn't", action,
-    print "if you put", voltage, "Volts through it."
-    print "-- Lovely plumage, the", type
-    print "-- It's", state, "!"
-\end{verbatim}
-
-could be called in any of the following ways:
-
-\begin{verbatim}
-parrot(1000)
-parrot(action = 'VOOOOOM', voltage = 1000000)
-parrot('a thousand', state = 'pushing up the daisies')
-parrot('a million', 'bereft of life', 'jump')
-\end{verbatim}
-
-but the following calls would all be invalid:
-
-\begin{verbatim}
-parrot()                     # required argument missing
-parrot(voltage=5.0, 'dead')  # non-keyword argument following keyword
-parrot(110, voltage=220)     # duplicate value for argument
-parrot(actor='John Cleese')  # unknown keyword
-\end{verbatim}
-
-In general, an argument list must have the form: zero or more
-positional arguments followed by zero or more keyword arguments, where
-the keywords must be chosen from the formal parameter names.  It's not
-important whether a formal parameter has a default value or not.  No
-argument must receive a value more than once --- formal parameter names
-corresponding to positional arguments cannot be used as keywords in
-the same calls.
-
-Note that no special syntax is required to allow a function to be
-called with keyword arguments.  The additional costs incurred by
-keyword arguments are only present when a call uses them.
-
-(As far as I know, these rules are exactly the same as used by
-Modula-3, even if they are enforced by totally different means.  This
-is intentional.)
-
-When a final formal parameter of the form \code{**\var{name}} is
-present, it receives a dictionary containing all keyword arguments
-whose keyword doesn't correspond to a formal parameter.  This may be
-combined with a formal parameter of the form \code{*\var{name}} which
-receives a tuple containing the positional arguments beyond the formal
-parameter list.  (\code{*\var{name}} must occur before
-\code{**\var{name}}.)  For example, if we define a function like this:
-
-\begin{verbatim}
-def cheeseshop(kind, *arguments, **keywords):
-    print "-- Do you have any", kind, '?'
-    print "-- I'm sorry, we're all out of", kind
-    for arg in arguments: print arg
-    print '-'*40
-    for kw in keywords.keys(): print kw, ':', keywords[kw]
-\end{verbatim}
-
-It could be called like this:
-
-\begin{verbatim}
-cheeseshop('Limburger', "It's very runny, sir.",
-           "It's really very, VERY runny, sir.",
-           client='John Cleese',
-           shopkeeper='Michael Palin',
-           sketch='Cheese Shop Sketch')
-\end{verbatim}
-
-and of course it would print:
-
-\begin{verbatim}
--- Do you have any Limburger ?
--- I'm sorry, we're all out of Limburger
-It's very runny, sir.
-It's really very, VERY runny, sir.
-----------------------------------------
-client : John Cleese
-shopkeeper : Michael Palin
-sketch : Cheese Shop Sketch
-\end{verbatim}
-
-Consequences of this change include:
-
-\begin{itemize}
-
-\item
-The built-in function \code{apply()} now has an optional third
-argument, which is a dictionary specifying any keyword arguments to be
-passed.  For example,
-\begin{verbatim}
-apply(parrot, (), {'voltage': 20, 'action': 'voomm'})
-\end{verbatim}
-is equivalent to
-\begin{verbatim}
-parrot(voltage=20, action='voomm')
-\end{verbatim}
-
-\item
-There is also a mechanism for functions and methods defined in an
-extension module (i.e., implemented in C or C++) to receive a
-dictionary of their keyword arguments.  By default, such functions do
-not accept keyword arguments, since the argument names are not
-available to the interpreter.
-
-\item
-In the effort of implementing keyword arguments, function and
-especially method calls have been sped up significantly --- for a
-method with ten formal parameters, the call overhead has been cut in
-half; for a function with one formal parameters, the overhead has been
-reduced by a third.
-
-\item
-The format of \code{.pyc} files has changed (again).
-
-\item
-The \code{access} statement has been disabled.  The syntax is still
-recognized but no code is generated for it.  (There were some
-unpleasant interactions with changes for keyword arguments, and my
-plan is to get rid of \code{access} altogether in favor of a different
-approach.)
-
-\end{itemize}
-
-\section{Changes to the WWW and Internet tools}
-
-\begin{itemize}
-
-\item
-The \code{htmllib} module has been rewritten in an incompatible
-fashion.  The new version is considerably more complete (HTML 2.0
-except forms, but including all ISO-8859-1 entity definitions), and
-easy to use.  Small changes to \code{sgmllib} have also been made, to
-better match the tokenization of HTML as recognized by other web
-tools.
-
-\item
-A new module \code{formatter} has been added, for use with the new
-\code{htmllib} module.
-
-\item
-The \code{urllib}and \code{httplib} modules have been changed somewhat
-to allow overriding unknown URL types and to support authentication.
-They now use \code{mimetools.Message} instead of \code{rfc822.Message}
-to parse headers.  The \code{endrequest()} method has been removed
-from the HTTP class since it breaks the interaction with some servers.
-
-\item
-The \code{rfc822.Message} class has been changed to allow a flag to be
-passed in that says that the file is unseekable.
-
-\item
-The \code{ftplib} module has been fixed to be (hopefully) more robust
-on Linux.
-
-\item
-Several new operations that are optionally supported by servers have
-been added to \code{nntplib}: \code{xover}, \code{xgtitle},
-\code{xpath} and \code{date}. % thanks to Kevan Heydon
-
-\end{itemize}
-
-\section{Other Language Changes}
-
-\begin{itemize}
-
-\item
-The \code{raise} statement now takes an optional argument which
-specifies the traceback to be used when printing the exception's stack
-trace.  This must be a traceback object, such as found in
-\code{sys.exc_traceback}.  When omitted or given as \code{None}, the
-old behavior (to generate a stack trace entry for the current stack
-frame) is used.
-
-\item
-The tokenizer is now more tolerant of alien whitespace.  Control-L in
-the leading whitespace of a line resets the column number to zero,
-while Control-R just before the end of the line is ignored.
-
-\end{itemize}
-
-\section{Changes to Built-in Operations}
-
-\begin{itemize}
-
-\item
-For file objects, \code{\var{f}.read(0)} and
-\code{\var{f}.readline(0)} now return an empty string rather than
-reading an unlimited number of bytes.  For the latter, omit the
-argument altogether or pass a negative value.
-
-\item
-A new system variable, \code{sys.platform}, has been added.  It
-specifies the current platform, e.g. \code{sunos5} or \code{linux1}.
-
-\item
-The built-in functions \code{input()} and \code{raw_input()} now use
-the GNU readline library when it has been configured (formerly, only
-interactive input to the interpreter itself was read using GNU
-readline).  The GNU readline library provides elaborate line editing
-and history.  The Python debugger (\code{pdb}) is the first
-beneficiary of this change.
-
-\item
-Two new built-in functions, \code{globals()} and \code{locals()},
-provide access to dictionaries containming current global and local
-variables, respectively.  (These augment rather than replace
-\code{vars()}, which returns the current local variables when called
-without an argument, and a module's global variables when called with
-an argument of type module.)
-
-\item
-The built-in function \code{compile()} now takes a third possible
-value for the kind of code to be compiled: specifying \code{'single'}
-generates code for a single interactive statement, which prints the
-output of expression statements that evaluate to something else than
-\code{None}.
-
-\end{itemize}
-
-\section{Library Changes}
-
-\begin{itemize}
-
-\item
-There are new module \code{ni} and \code{ihooks} that support
-importing modules with hierarchical names such as \code{A.B.C}.  This
-is enabled by writing \code{import ni; ni.ni()} at the very top of the
-main program.  These modules are amply documented in the Python
-source.
-
-\item
-The module \code{rexec} has been rewritten (incompatibly) to define a
-class and to use \code{ihooks}.
-
-\item
-The \code{string.split()} and \code{string.splitfields()} functions
-are now the same function (the presence or absence of the second
-argument determines which operation is invoked); similar for
-\code{string.join()} and \code{string.joinfields()}.
-
-\item
-The \code{Tkinter} module and its helper \code{Dialog} have been
-revamped to use keyword arguments.  Tk 4.0 is now the standard.  A new
-module \code{FileDialog} has been added which implements standard file
-selection dialogs.
-
-\item
-The optional built-in modules \code{dbm} and \code{gdbm} are more
-coordinated --- their \code{open()} functions now take the same values
-for their \var{flag} argument, and the \var{flag} and \var{mode}
-argument have default values (to open the database for reading only,
-and to create the database with mode \code{0666} minuse the umask,
-respectively).  The memory leaks have finally been fixed.
-
-\item
-A new dbm-like module, \code{bsddb}, has been added, which uses the
-BSD DB package's hash method. % thanks to David Ely
-
-\item
-A portable (though slow) dbm-clone, implemented in Python, has been
-added for systems where none of the above is provided.  It is aptly
-dubbed \code{dumbdbm}.
-
-\item
-The module \code{anydbm} provides a unified interface to \code{bsddb},
-\code{gdbm}, \code{dbm}, and \code{dumbdbm}, choosing the first one
-available.
-
-\item
-A new extension module, \code{binascii}, provides a variety of
-operations for conversion of text-encoded binary data.
-
-\item
-There are three new or rewritten companion modules implemented in
-Python that can encode and decode the most common such formats:
-\code{uu} (uuencode), \code{base64} and \code{binhex}.
-
-\item
-A module to handle the MIME encoding quoted-printable has also been
-added: \code{quopri}.
-
-\item
-The parser module (which provides an interface to the Python parser's
-abstract syntax trees) has been rewritten (incompatibly) by Fred
-Drake.  It now lets you change the parse tree and compile the result!
-
-\item
-The \code{syslog} module has been upgraded and documented.
-% thanks to Steve Clift
-
-\end{itemize}
-
-\section{Other Changes}
-
-\begin{itemize}
-
-\item
-The dynamic module loader recognizes the fact that different filenames
-point to the same shared library and loads the library only once, so
-you can have a single shared library that defines multiple modules.
-(SunOS / SVR4 style shared libraries only.)
-
-\item
-Jim Fulton's ``abstract object interface'' has been incorporated into
-the run-time API.  For more detailes, read the files
-\code{Include/abstract.h} and \code{Objects/abstract.c}.
-
-\item
-The Macintosh version is much more robust now.
-
-\item
-Numerous things I have forgotten or that are so obscure no-one will
-notice them anyway :-)
-
-\end{itemize}
-
-
-\chapter{New in Release 1.4}
-
-
-This chapter describes the major additions to the Python language and 
-library in version 1.4.  Many minor changes are not listed here;
-it is recommended to read the file \code{Misc/NEWS} in the Python 
-source distribution for a complete listing of changes.  In particular,
-changes that only affect C programmers or the build and installation
-process are not described in this chapter (the new installation
-lay-out is explained below under \code{sys.prefix} though).
-
-\section{Language Changes}
-
-\begin{itemize}
-
-\item
-Power operator.  \code{x**y} is equivalent to \code{pow(x, y)}.
-This operator binds more tightly than \code{*}, \code{/} or \code{\%},
-and binds from right to left when repeated or combined with unary 
-operators.  For example, \code{x**y**z} is equivalent to 
-\code{x**(y**z)}, and \code{-x**y} is \code{-(x**y)}.
-
-\item
-Complex numbers.  Imaginary literals are writen with a \code{'j'}
-suffix (\code{'J'} is allowed as well.) Complex numbers with a nonzero
-real component are written as \code{(\var{real}+\var{imag}j)}.  You
-can also use the new built-in function \code{complex()} which takes
-one or two arguments: \code{complex(x)} is equivalent to \code{x +
-0j}, and \code{complex(x, y)} is \code{x + y*0j}.  For example,
-\code{1j**2} yields \code{complex(-1.0)} (which is another way of
-saying ``the real value 1.0 represented as a complex number.''
-
-Complex numbers are always represented as two floating point numbers,
-the real and imaginary part.
-To extract these parts from a complex number \code{z}, 
-use \code{z.real} and \code{z.imag}.  The conversion functions to 
-floating point and integer (\code{float()}, \code{int()} and 
-\code{long()}) don't work for complex numbers --- there is no one 
-correct way to convert a complex number to a real number.  Use 
-\code{abs(z)} to get its magnitude (as a float) or \code{z.real} to 
-get its real part.
-
-Module \code{cmath} provides versions of all math functions that take 
-complex arguments and return complex results.  (Module \code{math} 
-only supports real numbers, so that \code{math.sqrt(-1)} still raises 
-a \code{ValueError} exception.  Numerical experts agree that this is 
-the way it should be.)
-
-\item
-New indexing syntax.  It is now possible to use a tuple as an indexing
-expression for a mapping object without parenthesizing it,
-e.g. \code{x[1, 2, 3]} is equivalent to \code{x[(1, 2, 3)]}.
-
-\item
-New slicing syntax.  In support of the Numerical Python extension
-(distributed independently), slice indices of the form
-\code{x[lo:hi:stride]} are possible, multiple slice indices separated by
-commas are allowed, and an index position may be replaced by an ellipsis,
-as follows: \code{x[a, ..., z]}.  There's also a new built-in function
-\code{slice(lo, hi, stride)} and a new built-in object
-\code{Ellipsis}, which yield the same effect without using special
-syntax.  None of the standard sequence types support indexing with
-slice objects or ellipses yet.
-
-Note that when this new slicing syntax is used, the mapping interface
-will be used, not the sequence interface.  In particular, when a
-user-defined class instance is sliced using this new slicing syntax,
-its \code{__getitem__} method is invoked --- the
-\code{__getslice__} method is only invoked when a single old-style
-slice is used, i.e. \code{x[lo:hi]}, with possible omission of
-\code{lo} and/or \code{hi}.  Some examples:
-
-\begin{verbatim}
-x[0:10:2]        -> slice(0, 10, 2)
-x[:2:]           -> slice(None, 2, None)
-x[::-1]          -> slice(None, None, -1)
-x[::]            -> slice(None, None, None)
-x[1, 2:3]        -> (1, slice(2, 3, None))
-x[1:2, 3:4]      -> (slice(1, 2, None), slice(3, 4, None))
-x[1:2, ..., 3:4] -> (slice(1, 2, None), Ellipsis,
-                     slice(3, 4, None))
-\end{verbatim}
-
-For more help with this you are referred to the matrix-sig.
-
-\item
-The \code{access} statement is now truly gone; \code{access} is no 
-longer a reserved word.  This saves a few cycles here and there.
-
-\item
-Private variables through name mangling.
-There is now limited support for class-private
-identifiers.  Any identifier of the form \code{__spam} (at least two
-leading underscores, at most one trailing underscore) is now textually
-replaced with \code{_classname__spam}, where \code{classname} is the
-current class name with leading underscore(s) stripped.  This mangling
-is done without regard of the syntactic position of the identifier, so
-it can be used to define class-private instance and class variables,
-methods, as well as globals, and even to store instance variables
-private to this class on instances of {\em other} classes.  Truncation
-may occur when the mangled name would be longer than 255 characters.
-Outside classes, or when the class name consists of only underscores,
-no mangling occurs.
-
-Name mangling is intended to give classes an easy way to define
-``private'' instance variables and methods, without having to worry
-about instance variables defined by derived classes, or mucking with
-instance variables by code outside the class.  Note that the mangling
-rules are designed mostly to avoid accidents; it still is possible for
-a determined soul to access or modify a variable that is considered
-private.  This can even be useful, e.g. for the debugger, and that's
-one reason why this loophole is not closed.  (Buglet: derivation of a
-class with the same name as the base class makes use of private
-variables of the base class possible.)
-
-Notice that code passed to \code{exec}, \code{eval()} or
-\code{evalfile()} does not consider the classname of the invoking 
-class to be the current class; this is similar to the effect of the 
-\code{global} statement, the effect of which is likewise restricted to 
-code that is byte-compiled together.  The same restriction applies to
-\code{getattr()}, \code{setattr()} and \code{delattr()}, as well as
-when referencing \code{__dict__} directly.
-
-Here's an example of a class that implements its own
-\code{__getattr__} and \code{__setattr__} methods and stores all
-attributes in a private variable, in a way that works in Python 1.4 as
-well as in previous versions:
-
-\begin{verbatim}
-class VirtualAttributes:
-    __vdict = None
-    __vdict_name = locals().keys()[0]
-     
-    def __init__(self):
-        self.__dict__[self.__vdict_name] = {}
-    
-    def __getattr__(self, name):
-        return self.__vdict[name]
-    
-    def __setattr__(self, name, value):
-        self.__vdict[name] = value
-\end{verbatim}
-
-{\em Warning: this is an experimental feature.}  To avoid all
-potential problems, refrain from using identifiers starting with
-double underscore except for predefined uses like \code{__init__}.  To
-use private names while maintaining future compatibility: refrain from
-using the same private name in classes related via subclassing; avoid
-explicit (manual) mangling/unmangling; and assume that at some point
-in the future, leading double underscore will revert to being just a
-naming convention.  Discussion on extensive compile-time declarations
-are currently underway, and it is impossible to predict what solution
-will eventually be chosen for private names.  Double leading
-underscore is still a candidate, of course --- just not the only one.
-It is placed in the distribution in the belief that it is useful, and
-so that widespread experience with its use can be gained.  It will not
-be removed without providing a better solution and a migration path.
-
-\end{itemize}
-
-\section{Run-time Changes}
-
-\begin{itemize}
-
-\item
-New built-in function \code{list()} converts any sequence to a new list.
-Note that when the argument is a list, the return value is a fresh 
-copy, similar to what would be returned by \code{a[:]}.
-
-\item
-Improved syntax error message.  Syntax errors detected by the code
-generation phase of the Python bytecode compiler now include a line
-number.  The line number is appended in parentheses.  It is suppressed
-if the error occurs in line 1 (this usually happens in interactive
-use).
-
-\item
-Different exception raised.
-Unrecognized keyword arguments now raise a \code{TypeError} exception 
-rather than \code{KeyError}.
-
-\item
-Exceptions in \code{__del__} methods.  When a \code{__del__} method
-raises an exception, a warning is written to \code{sys.stderr} and the
-exception is ignored.  Formerly, such exceptions were ignored without
-warning.  (Propagating the exception is not an option since it it is
-invoked from an object finalizer, which cannot return any kind of
-status or error.)  (Buglet: The new behavior, while needed in order to
-debug failing \code{__del__} methods, is occasionally annoying,
-because if affects the program's standard error stream.  It honors
-assignments to \code{sys.stderr}, so it can be redirected from within
-a program if desired.)
-
-\item
-You can now discover from which file (if any) a module was loaded by 
-inspecting its \code{__file__} attribute.  This attribute is not 
-present for built-in or frozen modules.  It points to the shared 
-library file for dynamically loaded modules.  (Buglet: this may be a 
-relative path and is stored in the \code{.pyc} file on compilation.  
-If you manipulate the current directory with \code{os.chdir()} or move 
-\code{.pyc} files around, the value may be incorrect.)
-
-\end{itemize}
-
-\section{New or Updated Modules}
-
-\begin{itemize}
-
-\item
-New built-in module \code{operator}.  While undocumented, the concept
-is real simply: \code{operator.__add__(x, y)} does exactly the same
-thing as \code{x+y} (for all types --- built-in, user-defined,
-extension-defined).  As a convenience, \code{operator.add} does the
-same thing, but beware --- you can't use \code{operator.and} and a few
-others where the ``natural'' name for an operator is a reserved
-keyword.  You can add a single trailing underscore in such cases.
-
-\item
-New built-in module \code{errno}.  See the Library Reference Manual.
-
-\item
-Rewritten \code{cgi} module.  See the Library Reference Manual.
-
-\item
-Improved restricted execution module (\code{rexec}).  New module 
-\code{Bastion}.  Both are now documented in a new chapter on
-restricted execution in the Library Reference Manual.
-
-\item
-New string operations (all described in the Library Reference Manual):
-\code{lstrip()}, \code{rstrip()} (strip only the left/right
-whitespace), \code{capitalize()} (uppercase the first character,
-lowercase the rest), \code{capwords()} (capitalize each word,
-delimited a la \code{string.split()}), \code{translate()} (string
-transliteration -- this existed before but can now also delete
-characters by specifying a third argument), \code{maketrans()} (a
-convenience function for creating translation tables for
-\code{translate()} and \code{regex.compile()}).  The string function
-\code{split()} has an optional third argument which specifies the
-maximum number of separators to split;
-e.g. \code{string.split('a=b=c', '=', 1)} yields \code{['a', 'b=c']}.
-(Note that for a long time, \code{split()} and \code{splitfields()}
-are synonyms.
-
-\item
-New regsub operations (see the Library Reference Manual):
-\code{regsub.capwords()} (like \code{string.capwords()} but allows you to
-specify the word delimiter as a regular expression),
-\code{regsub.splitx()} (like \code{regsub.split()} but returns the
-delimiters as well as the words in the resulting list).  The optional
-\code{maxsep} argument is also supported by \code{regsub.split()}.
-
-\item
-Module files \code{pdb.py} and \code{profile.py} can now be invoked as
-scripts to debug c.q. profile other scripts easily.  For example:
-\code{python /usr/local/lib/python1.4/profile.py myscript.py}
-
-\item
-The \code{os} module now supports the \code{putenv()} function on
-systems where it is provided in the C library (Windows NT and most
-Unix versions).  For example, \code{os.putenv('PATH',
-'/bin:/usr/bin')} sets the environment variable \code{PATH} to the
-string \code{'/bin:/usr/bin'}.  Such changes to the environment affect
-subprocesses started with \code{os.system()}, \code{os.popen()} or
-\code{os.fork()} and \code{os.execv()}.  When \code{putenv()} is
-supported, assignments to items in \code{os.environ} are automatically
-translated into corresponding calls to \code{os.putenv()}; however,
-calls to \code{os.putenv()} don't update \code{os.environ}, so it is
-actually preferable to assign to items of \code{os.environ}.  For this
-purpose, the type of \code{os.environ} is changed to a subclass of
-\code{UserDict.UserDict} when \code{os.putenv()} is supported.
-(Buglet: \code{os.execve()} still requires a real dictionary, so it
-won't accept \code{os.environ} as its third argument.  However, you
-can now use \code{os.execv()} and it will use your changes to
-\code{os.environ}!.)
-
-\item
-More new functions in the \code{os} module: \code{mkfifo},
-\code{plock}, \code{remove} (== \code{unlink}), and \code{ftruncate}.
-See the Unix manual (section 2, system calls) for these function.
-More functions are also available under NT.
-
-\item
-New functions in the fcntl module: \code{lockf()} and \code{flock()}
-(don't ask \code{:-)}).  See the Library Reference Manual.
-
-\item
-The first item of the module search path, \code{sys.path[0]}, is the 
-directory containing the script that was used to invoke the Python 
-interpreter.  If the script directory is not available (e.g.  if the 
-interpreter is invoked interactively or if the script is read from 
-standard input), \code{sys.path[0]} is the empty string, which directs 
-Python to search modules in the current directory first.  Notice that 
-the script directory is inserted {\em before} the entries inserted as 
-a result of \code{\$PYTHONPATH}.  There is no longer an entry for the 
-current directory later in the path (unless explicitly set in 
-\code{\$PYTHONPATH} or overridden at build time).
-
-\end{itemize}
-
-\section{Configuration and Installation}
-
-\begin{itemize}
-
-\item
-More configuration information is now available to Python programs.
-The variable \code{sys.prefix} gives the site-specific directory
-prefix where the platform independent Python files are installed; by
-default, this is the string \code{"/usr/local"}.  This can be set at
-build time with the \code{--prefix} argument to the \code{configure}
-script.  The main collection of Python library modules is installed in
-the directory \code{sys.prefix+"/lib/python1.4"} while the platform
-independent header files (all except \code{config.h}) are stored in
-\code{sys.prefix+"/include/python1.4"}.
-
-Similarly, the variable \code{sys.exec_prefix} gives the site-specific
-directory prefix where the platform {\em de}pendent Python files are
-installed; by default, this is also \code{"/usr/local"}.  This can be
-set at build time with the \code{--exec-prefix} argument to the
-\code{configure} script.  Specifically, all configuration files
-(e.g. the \code{config.h} header file) are installed in the directory
-\code{sys.exec_prefix+"/lib/python1.4/config"}, and shared library
-modules are installed in
-\code{sys.exec_prefix+"/lib/python1.4/sharedmodules"}.
-
-Include files are at \code{sys.prefix+"/include/python1.4"}.
-
-It is not yet decided what the most portable way is to come up with
-the version number used in these pathnames.  For compatibility with
-the 1.4beta releases, sys.version[:3] can be used.
-
-On non-Unix systems, these variables are meaningless.
-
-\item
-While sites are strongly discouraged from modifying the standard
-Python library (like adding site-specific modules or functions), there
-is now a standard way to invoke site-specific features.  The standard
-module \code{site}, when imported, appends two site-specific
-directories to the end of \code{sys.path}:
-\code{\$prefix/lib/site-python} and
-\code{\$exec_prefix/lib/site-python}, where \code{\$prefix} and
-\code{\$exec_prefix} are the directories \code{sys.prefix} and
-\code{sys.exec_prefix} mentioned above.
-
-After this path manipulation has been performed, an attempt is made to
-import the module \code{sitecustomize}.  Any \code{ImportError}
-exception raised by this attempt is silently ignored.
-
-\end{itemize}
+XXX Lele Gaifax's readline module, which adds name completion...
 
 \end{document}
+
diff --git a/Doc/tut/tut.tex b/Doc/tut/tut.tex
index 3406ac4..4291595 100644
--- a/Doc/tut/tut.tex
+++ b/Doc/tut/tut.tex
@@ -1,6 +1,13 @@
 \documentstyle[twoside,11pt,myformat]{report}
 
-\title{Python Tutorial}
+% Things to do:
+% Add a section on file I/O
+% Write a chapter entitled ``Some Useful Modules''
+%  --regex, math+cmath
+% Should really move the Python startup file info to an appendix
+%
+
+\title{Python Tutorial -- DRAFT of \today}
 
 \input{boilerplate}
 
@@ -17,8 +24,7 @@
 \noindent
 Python is a simple, yet powerful programming language that bridges the
 gap between C and shell programming, and is thus ideally suited for
-``throw-away programming''
-and rapid prototyping.  Its syntax is put
+``throw-away programming'' and rapid prototyping.  Its syntax is put
 together from constructs borrowed from a variety of other languages;
 most prominent are influences from ABC, C, Modula-3 and Icon.
 
@@ -27,7 +33,7 @@
 language for highly customizable C applications such as editors or
 window managers.
 
-Python is available for various operating systems, amongst which
+Python is available for many operating systems:
 several flavors of \UNIX{}, the Apple Macintosh, MS-DOS, Windows
 (3.1(1), '95 and NT flavors), OS/2, and others.
 
@@ -58,29 +64,41 @@
 \section{Disclaimer}
 
 Now that there are several books out on Python, this tutorial has lost
-its role as the only introduction to Python for most new users.  It
-takes time to keep a document like this up to date in the face of
-additions to the language, and I simply don't have enough time to do a
-good job.  Therefore, this version of the tutorial is almost unchanged
-since the previous release.  This doesn't mean that the tutorial is
-out of date --- all the examples still work exactly as before.  There
-are simply some new areas of the language that aren't covered.
+its role as the only introduction to Python for most new users.  This
+tutorial does not attempt to be comprehensive and cover every single
+feature, or even every commonly used feature.  Instead, it introduces
+many of Python's most noteworthy features, and will give you a good
+idea of the language's flavor and style.
 
-To make up for this, there are some chapters at the end cover
-important changes in recent Python releases, and these are up to date
-with the current release.
+%It takes time to keep a document like this up to date in the face of
+%additions to the language, and I simply don't have enough time to do a
+%good job.  Therefore, this version of the tutorial is almost unchanged
+%since the previous release.  This doesn't mean that the tutorial is
+%out of date --- all the examples still work exactly as before.  There
+%are simply some new areas of the language that aren't covered.
+
+%To make up for this, there are some chapters at the end that cover
+%important changes in recent Python releases, and these are up to date
+%with the current release.
 
 \section{Introduction}
 
 If you ever wrote a large shell script, you probably know this
 feeling: you'd love to add yet another feature, but it's already so
 slow, and so big, and so complicated; or the feature involves a system
-call or other function that is only accessible from C \ldots  Usually
+call or other function that is only accessible from C \ldots Usually
 the problem at hand isn't serious enough to warrant rewriting the
-script in C; perhaps because the problem requires variable-length
-strings or other data types (like sorted lists of file names) that are
-easy in the shell but lots of work to implement in C; or perhaps just
-because you're not sufficiently familiar with C.
+script in C; perhaps the problem requires variable-length strings or
+other data types (like sorted lists of file names) that are easy in
+the shell but lots of work to implement in C, or perhaps you're not
+sufficiently familiar with C.
+
+Another situation: perhaps you have to work with several C libraries,
+and the usual C write/compile/test/re-compile cycle is too slow.  You
+need to develop software more quickly.  Possibly perhaps you've
+written a program that could use an extension language, and you don't
+want to design a language, write and debug an interpreter for it, then
+tie it into your application.
 
 In such cases, Python may be just the language for you.  Python is
 simple to use, but it is a real programming language, offering much
@@ -98,7 +116,7 @@
 standard modules that you can use as the basis of your programs --- or
 as examples to start learning to program in Python.  There are also
 built-in modules that provide things like file I/O, system calls,
-sockets, and even a generic interface to window systems (STDWIN).
+sockets, and even interfaces to GUI toolkits like Tk.  
 
 Python is an interpreted language, which can save you considerable time
 during program development because no compilation and linking is
@@ -122,17 +140,17 @@
 \end{itemize}
 
 Python is {\em extensible}: if you know how to program in C it is easy
-to add a new built-in
-function or
-module to the interpreter, either to
+to add a new built-in function or module to the interpreter, either to
 perform critical operations at maximum speed, or to link Python
 programs to libraries that may only be available in binary form (such
 as a vendor-specific graphics library).  Once you are really hooked,
 you can link the Python interpreter into an application written in C
 and use it as an extension or command language for that application.
 
-By the way, the language is named after the BBC show ``Monty
-Python's Flying Circus'' and has nothing to do with nasty reptiles...
+By the way, the language is named after the BBC show ``Monty Python's
+Flying Circus'' and has nothing to do with nasty reptiles.  Making
+references to Monty Python skits in documentation is not only allowed,
+it is encouraged.  
 
 \section{Where From Here}
 
@@ -150,12 +168,6 @@
 and finally touching upon advanced concepts like exceptions
 and user-defined classes.
 
-When you're through with the tutorial (or just getting bored), you
-should read the Library Reference, which gives complete (though terse)
-reference material about built-in and standard types, functions and
-modules that can save you a lot of time when writing Python programs.
-
-
 \chapter{Using the Python Interpreter}
 
 \section{Invoking the Interpreter}
@@ -174,11 +186,28 @@
 your local Python guru or system administrator.  (E.g., {\tt
 /usr/local/python} is a popular alternative location.)
 
+Typing an EOF character (Control-D on \UNIX{}, Control-Z or F6 on DOS
+or Windows) at the primary prompt causes the interpreter to exit with
+a zero exit status.  If that doesn't work, you can exit the
+interpreter by typing the following commands: \code{import sys ;
+sys.exit()}.
+
+The interpreter's line-editing features usually aren't very
+sophisticated.  On Unix, whoever installed the interpreter may have
+enabled support for the GNU readline library, which adds more
+elaborate interactive editing and history features. Perhaps the
+quickest check to see whether command line editing is supported is
+typing Control-P to the first Python prompt you get.  If it beeps, you
+have command line editing; see Appendix A for an introduction to the
+keys.  If nothing appears to happen, or if \verb/^P/ is echoed,
+command line editing isn't available; you'll only be able to use
+backspace to remove characters from the current line.
+
 The interpreter operates somewhat like the \UNIX{} shell: when called
 with standard input connected to a tty device, it reads and executes
 commands interactively; when called with a file name argument or with
 a file as standard input, it reads and executes a {\em script} from
-that file.
+that file. 
 
 A third way of starting the interpreter is
 ``{\tt python -c command [arg] ...}'', which
@@ -188,7 +217,7 @@
 command} in its entirety with double quotes.
 
 Note that there is a difference between ``{\tt python file}'' and
-``{\tt python $<$file}''.  In the latter case, input requests from the
+``{\tt python <file}''.  In the latter case, input requests from the
 program, such as calls to {\tt input()} and {\tt raw_input()}, are
 satisfied from {\em file}.  Since this file has already been read
 until the end by the parser before the program starts executing, the
@@ -222,10 +251,7 @@
 with the {\em primary\ prompt}, usually three greater-than signs ({\tt
 >>>}); for continuation lines it prompts with the
 {\em secondary\ prompt},
-by default three dots ({\tt ...}).  Typing an EOF character
-(Control-D on \UNIX{}, Control-Z on DOS or Windows)
-at the primary prompt causes the interpreter to exit with a zero exit
-status.
+by default three dots ({\tt ...}).  
 
 The interpreter prints a welcome message stating its version number
 and a copyright notice before printing the first prompt, e.g.:
@@ -263,44 +289,6 @@
 KeyboardInterrupt} exception, which may be handled by a {\tt try}
 statement.
 
-\subsection{The Module Search Path}
-
-When a module named {\tt spam} is imported, the interpreter searches
-for a file named {\tt spam.py} in the current directory,
-and then in the list of directories specified by
-the environment variable {\tt PYTHONPATH}.  This has the same syntax as
-the \UNIX{} shell variable {\tt PATH}, i.e., a list of colon-separated
-directory names.  When {\tt PYTHONPATH} is not set, or when the file
-is not found there, the search continues in an installation-dependent
-default path, usually {\tt .:/usr/local/lib/python}.
-
-Actually, modules are searched in the list of directories given by the 
-variable {\tt sys.path} which is initialized from the directory 
-containing the input script (or the current directory), {\tt 
-PYTHONPATH} and the installation-dependent default.  This allows 
-Python programs that know what they're doing to modify or replace the 
-module search path.  See the section on Standard Modules later.
-
-\subsection{``Compiled'' Python files}
-
-As an important speed-up of the start-up time for short programs that
-use a lot of standard modules, if a file called {\tt spam.pyc} exists
-in the directory where {\tt spam.py} is found, this is assumed to
-contain an already-``compiled'' version of the module {\tt spam}.  The
-modification time of the version of {\tt spam.py} used to create {\tt
-spam.pyc} is recorded in {\tt spam.pyc}, and the file is ignored if
-these don't match.
-
-Normally, you don't need to do anything to create the {\tt spam.pyc} file.
-Whenever {\tt spam.py} is successfully compiled, an attempt is made to
-write the compiled version to {\tt spam.pyc}.  It is not an error if
-this attempt fails; if for any reason the file is not written
-completely, the resulting {\tt spam.pyc} file will be recognized as
-invalid and thus ignored later.  The contents of the {\tt spam.pyc}
-file is platform independent, so a Python module directory can be
-shared by machines of different architectures.  (Tip for experts:
-the module {\tt compileall} creates {\tt .pyc} files for all modules.)
-
 \subsection{Executable Python scripts}
 
 On BSD'ish \UNIX{} systems, Python scripts can be made directly
@@ -316,6 +304,9 @@
 
 \subsection{The Interactive Startup File}
 
+XXX This should probably be dumped in an appendix, since most people
+don't use Python interactively in non-trivial ways.
+
 When you use Python interactively, it is frequently handy to have some
 standard commands executed every time the interpreter is started.  You
 can do this by setting an environment variable named {\tt
@@ -338,102 +329,6 @@
 in a script, you must write this explicitly in the script, e.g.
 \verb\import os;\ \verb\execfile(os.environ['PYTHONSTARTUP'])\.
 
-\section{Interactive Input Editing and History Substitution}
-
-Some versions of the Python interpreter support editing of the current
-input line and history substitution, similar to facilities found in
-the Korn shell and the GNU Bash shell.  This is implemented using the
-{\em GNU\ Readline} library, which supports Emacs-style and vi-style
-editing.  This library has its own documentation which I won't
-duplicate here; however, the basics are easily explained.
-
-Perhaps the quickest check to see whether command line editing is
-supported is typing Control-P to the first Python prompt you get.  If
-it beeps, you have command line editing.  If nothing appears to
-happen, or if \verb/^P/ is echoed, you can skip the rest of this
-section.
-
-\subsection{Line Editing}
-
-If supported, input line editing is active whenever the interpreter
-prints a primary or secondary prompt.  The current line can be edited
-using the conventional Emacs control characters.  The most important
-of these are: C-A (Control-A) moves the cursor to the beginning of the
-line, C-E to the end, C-B moves it one position to the left, C-F to
-the right.  Backspace erases the character to the left of the cursor,
-C-D the character to its right.  C-K kills (erases) the rest of the
-line to the right of the cursor, C-Y yanks back the last killed
-string.  C-underscore undoes the last change you made; it can be
-repeated for cumulative effect.
-
-\subsection{History Substitution}
-
-History substitution works as follows.  All non-empty input lines
-issued are saved in a history buffer, and when a new prompt is given
-you are positioned on a new line at the bottom of this buffer.  C-P
-moves one line up (back) in the history buffer, C-N moves one down.
-Any line in the history buffer can be edited; an asterisk appears in
-front of the prompt to mark a line as modified.  Pressing the Return
-key passes the current line to the interpreter.  C-R starts an
-incremental reverse search; C-S starts a forward search.
-
-\subsection{Key Bindings}
-
-The key bindings and some other parameters of the Readline library can
-be customized by placing commands in an initialization file called
-{\tt \$HOME/.inputrc}.  Key bindings have the form
-
-\bcode\begin{verbatim}
-key-name: function-name
-\end{verbatim}\ecode
-%
-or
-
-\bcode\begin{verbatim}
-"string": function-name
-\end{verbatim}\ecode
-%
-and options can be set with
-
-\bcode\begin{verbatim}
-set option-name value
-\end{verbatim}\ecode
-%
-For example:
-
-\bcode\begin{verbatim}
-# I prefer vi-style editing:
-set editing-mode vi
-# Edit using a single line:
-set horizontal-scroll-mode On
-# Rebind some keys:
-Meta-h: backward-kill-word
-"\C-u": universal-argument
-"\C-x\C-r": re-read-init-file
-\end{verbatim}\ecode
-%
-Note that the default binding for TAB in Python is to insert a TAB
-instead of Readline's default filename completion function.  If you
-insist, you can override this by putting
-
-\bcode\begin{verbatim}
-TAB: complete
-\end{verbatim}\ecode
-%
-in your {\tt \$HOME/.inputrc}.  (Of course, this makes it hard to type
-indented continuation lines...)
-
-\subsection{Commentary}
-
-This facility is an enormous step forward compared to previous
-versions of the interpreter; however, some wishes are left: It would
-be nice if the proper indentation were suggested on continuation lines
-(the parser knows if an indent token is required next).  The
-completion mechanism might use the interpreter's symbol table.  A
-command to check (or even suggest) matching parentheses, quotes etc.
-would also be useful.
-
-
 \chapter{An Informal Introduction to Python}
 
 In the following examples, input and output are distinguished by the
@@ -441,11 +336,11 @@
 the example, you must type everything after the prompt, when the
 prompt appears; lines that do not begin with a prompt are output from
 the interpreter.%
-\footnote{
-        I'd prefer to use different fonts to distinguish input
-        from output, but the amount of LaTeX hacking that would require
-        is currently beyond my ability.
-}
+%\footnote{
+%        I'd prefer to use different fonts to distinguish input
+%        from output, but the amount of LaTeX hacking that would require
+%        is currently beyond my ability.
+%}
 Note that a secondary prompt on a line by itself in an example means
 you must type a blank line; this is used to end a multi-line command.
 
@@ -512,13 +407,82 @@
 3.0303030303
 >>> 7.0 / 2
 3.5
->>> 
 \end{verbatim}\ecode
+%
+Complex numbers are also supported; imaginary numbers are written with
+a suffix of \code{'j'} or \code{'J'}.  Complex numbers with a nonzero
+real component are written as \code{(\var{real}+\var{imag}j)}, or can
+be created with the \code{complex(\var{real}, \var{imag})} function.
+
+\bcode\begin{verbatim}
+>>> 1j * 1J
+(-1+0j)
+>>> 1j * complex(0,1)
+(-1+0j)
+>>> 3+1j*3
+(3+3j)
+>>> (3+1j)*3
+(9+3j)
+>>> (1+2j)/(1+1j)
+(1.5+0.5j)
+\end{verbatim}\ecode
+%
+Complex numbers are always represented as two floating point numbers,
+the real and imaginary part.  To extract these parts from a complex
+number \code{z}, use \code{z.real} and \code{z.imag}.  
+
+\bcode\begin{verbatim}
+>>> a=1.5+0.5j
+>>> a.real
+1.5
+>>> a.imag
+0.5
+\end{verbatim}\ecode
+%
+The conversion functions to floating point and integer
+(\code{float()}, \code{int()} and \code{long()}) don't work for
+complex numbers --- there is no one correct way to convert a complex
+number to a real number.  Use \code{abs(z)} to get its magnitude (as a
+float) or \code{z.real} to get its real part.
+
+\bcode\begin{verbatim}
+>>> a=1.5+0.5j
+>>> float(a)
+Traceback (innermost last):
+  File "<stdin>", line 1, in ?
+TypeError: can't convert complex to float; use e.g. abs(z)
+>>> a.real
+1.5
+>>> abs(a)
+1.58113883008
+\end{verbatim}\ecode
+%
+In interactive mode, the last printed expression is assigned to the
+variable \code{_}.  This means that when you are using Python as a
+desk calculator, it is somewhat easier to continue calculations, for
+example:
+
+\begin{verbatim}
+>>> tax = 17.5 / 100
+>>> price = 3.50
+>>> price * tax
+0.6125
+>>> price + _
+4.1125
+>>> round(_, 2)
+4.11
+\end{verbatim}
+
+This variable should be treated as read-only by the user.  Don't
+explicitly assign a value to it --- you would create an independent
+local variable with the same name masking the built-in variable with
+its magic behavior.
 
 \subsection{Strings}
 
-Besides numbers, Python can also manipulate strings, enclosed in
-single quotes or double quotes:
+Besides numbers, Python can also manipulate strings, which can be
+expressed in several ways.  They can be enclosed in single quotes or
+double quotes:
 
 \bcode\begin{verbatim}
 >>> 'spam eggs'
@@ -536,12 +500,50 @@
 >>> 
 \end{verbatim}\ecode
 %
-Strings are written the same way as they are typed for input: inside
-quotes and with quotes and other funny characters escaped by backslashes,
-to show the precise value.  The string is enclosed in double quotes if
-the string contains a single quote and no double quotes, else it's
-enclosed in single quotes.  (The {\tt print} statement, described later,
-can be used to write strings without quotes or escapes.)
+String literals can span multiple lines in several ways.  Newlines can be escaped with backslashes, e.g.
+
+\begin{verbatim}
+hello = "This is a rather long string containing\n\
+several lines of text just as you would do in C.\n\
+    Note that whitespace at the beginning of the line is\
+ significant.\n"
+print hello
+\end{verbatim}
+
+which would print the following:
+\begin{verbatim}
+This is a rather long string containing
+several lines of text just as you would do in C.
+    Note that whitespace at the beginning of the line is significant.
+\end{verbatim}
+
+Or, strings can be surrounded in a pair of matching triple-quotes:
+\code{"""} or \code {'''}.  End of lines do not need to be escaped
+when using triple-quotes, but they will be included in the string.
+
+\begin{verbatim}
+print """
+Usage: thingy [OPTIONS] 
+     -h                        Display this usage message
+     -H hostname               Hostname to connect to
+"""
+\end{verbatim}
+
+produces the following output:
+
+\bcode\begin{verbatim}
+Usage: thingy [OPTIONS] 
+     -h                        Display this usage message
+     -H hostname               Hostname to connect to
+\end{verbatim}\ecode
+%
+The interpreter prints the result of string operations in the same way
+as they are typed for input: inside quotes, and with quotes and other
+funny characters escaped by backslashes, to show the precise
+value.  The string is enclosed in double quotes if the string contains
+a single quote and no double quotes, else it's enclosed in single
+quotes.  (The {\tt print} statement, described later, can be used to
+write strings without quotes or escapes.)
 
 Strings can be concatenated (glued together) with the {\tt +}
 operator, and repeated with {\tt *}:
@@ -555,12 +557,15 @@
 >>> 
 \end{verbatim}\ecode
 %
-Strings can be subscripted (indexed); like in C, the first character of
-a string has subscript (index) 0.
+Two string literals next to each other are automatically concatenated;
+the first line above could also have been written \code{word = 'Help'
+'A'}; this only works with two literals, not with arbitrary string expressions.
 
-There is no separate character type; a character is simply a string of
-size one.  Like in Icon, substrings can be specified with the {\em
-slice} notation: two indices separated by a colon.
+Strings can be subscripted (indexed); like in C, the first character
+of a string has subscript (index) 0.  There is no separate character
+type; a character is simply a string of size one.  Like in Icon,
+substrings can be specified with the {\em slice} notation: two indices
+separated by a colon.
 
 \bcode\begin{verbatim}
 >>> word[4]
@@ -1026,6 +1031,7 @@
 
 \bcode\begin{verbatim}
 >>> def fib(n):    # write Fibonacci series up to n
+...     "Print a Fibonacci series up to n"
 ...     a, b = 0, 1
 ...     while b < n:
 ...           print b,
@@ -1039,16 +1045,21 @@
 %
 The keyword {\tt def} introduces a function {\em definition}.  It must
 be followed by the function name and the parenthesized list of formal
-parameters.  The statements that form the body of the function starts at
-the next line, indented by a tab stop.
+parameters.  The statements that form the body of the function start
+at the next line, indented by a tab stop.  The first statement of the
+function body can optionally be a string literal; this string literal
+is the function's documentation string, or \dfn{docstring}.  There are
+tools which use docstrings to automatically produce printed
+documentation, or to let the user interactively browse through code;
+it's good practice to include docstrings in code that you write, so
+try to make a habit of it.
 
 The {\em execution} of a function introduces a new symbol table used
 for the local variables of the function.  More precisely, all variable
 assignments in a function store the value in the local symbol table;
-whereas
-variable references first look in the local symbol table, then
+whereas variable references first look in the local symbol table, then
 in the global symbol table, and then in the table of built-in names.
-Thus,
+Thus, 
 global variables cannot be directly assigned a value within a
 function (unless named in a {\tt global} statement), although
 they may be referenced.
@@ -1102,6 +1113,7 @@
 
 \bcode\begin{verbatim}
 >>> def fib2(n): # return Fibonacci series up to n
+...     "Return a list containing the Fibonacci series up to n"
 ...     result = []
 ...     a, b = 0, 1
 ...     while b < n:
@@ -1142,8 +1154,137 @@
 
 \end{itemize}
 
+\section{More on Defining Functions}
 
-\chapter{Odds and Ends}
+It is also possible to define functions with a variable number of
+arguments.  There are three forms, which can be combined.
+
+\subsection{Default Argument Values}
+
+The most useful form is to specify a default value for one or more
+arguments.  This creates a function that can be called with fewer
+arguments than it is defined, e.g.
+
+\begin{verbatim}
+        def ask_ok(prompt, retries = 4, complaint = 'Yes or no, please!'):
+                while 1:
+                        ok = raw_input(prompt)
+                        if ok in ('y', 'ye', 'yes'): return 1
+                        if ok in ('n', 'no', 'nop', 'nope'): return 0
+                        retries = retries - 1
+                        if retries < 0: raise IOError, 'refusenik user'
+                        print complaint
+\end{verbatim}
+
+This function can be called either like this:
+\verb\ask_ok('Do you really want to quit?')\ or like this:
+\verb\ask_ok('OK to overwrite the file?', 2)\.
+
+The default values are evaluated at the point of function definition
+in the {\em defining} scope, so that e.g.
+
+\begin{verbatim}
+        i = 5
+        def f(arg = i): print arg
+        i = 6
+        f()
+\end{verbatim}
+
+will print \verb\5\.
+
+\subsection{Keyword Arguments}
+
+Functions can also be called using
+keyword arguments of the form \code{\var{keyword} = \var{value}}.  For
+instance, the following function:
+
+\begin{verbatim}
+def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
+    print "-- This parrot wouldn't", action,
+    print "if you put", voltage, "Volts through it."
+    print "-- Lovely plumage, the", type
+    print "-- It's", state, "!"
+\end{verbatim}
+
+could be called in any of the following ways:
+
+\begin{verbatim}
+parrot(1000)
+parrot(action = 'VOOOOOM', voltage = 1000000)
+parrot('a thousand', state = 'pushing up the daisies')
+parrot('a million', 'bereft of life', 'jump')
+\end{verbatim}
+
+but the following calls would all be invalid:
+
+\begin{verbatim}
+parrot()                     # required argument missing
+parrot(voltage=5.0, 'dead')  # non-keyword argument following keyword
+parrot(110, voltage=220)     # duplicate value for argument
+parrot(actor='John Cleese')  # unknown keyword
+\end{verbatim}
+
+In general, an argument list must have any positional arguments
+followed by any keyword arguments, where the keywords must be chosen
+from the formal parameter names.  It's not important whether a formal
+parameter has a default value or not.  No argument must receive a
+value more than once --- formal parameter names corresponding to
+positional arguments cannot be used as keywords in the same calls.
+
+When a final formal parameter of the form \code{**\var{name}} is
+present, it receives a dictionary containing all keyword arguments
+whose keyword doesn't correspond to a formal parameter.  This may be
+combined with a formal parameter of the form \code{*\var{name}}
+(described in the next subsection) which receives a tuple containing
+the positional arguments beyond the formal parameter list.
+(\code{*\var{name}} must occur before \code{**\var{name}}.)  For
+example, if we define a function like this:
+
+\begin{verbatim}
+def cheeseshop(kind, *arguments, **keywords):
+    print "-- Do you have any", kind, '?'
+    print "-- I'm sorry, we're all out of", kind
+    for arg in arguments: print arg
+    print '-'*40
+    for kw in keywords.keys(): print kw, ':', keywords[kw]
+\end{verbatim}
+
+It could be called like this:
+
+\begin{verbatim}
+cheeseshop('Limburger', "It's very runny, sir.",
+           "It's really very, VERY runny, sir.",
+           client='John Cleese',
+           shopkeeper='Michael Palin',
+           sketch='Cheese Shop Sketch')
+\end{verbatim}
+
+and of course it would print:
+
+\begin{verbatim}
+-- Do you have any Limburger ?
+-- I'm sorry, we're all out of Limburger
+It's very runny, sir.
+It's really very, VERY runny, sir.
+----------------------------------------
+client : John Cleese
+shopkeeper : Michael Palin
+sketch : Cheese Shop Sketch
+\end{verbatim}
+
+\subsection{Arbitrary Argument Lists}
+
+Finally, the least frequently used option is to specify that a
+function can be called with an arbitrary number of arguments.  These
+arguments will be wrapped up in a tuple.  Before the variable number
+of arguments, zero or more normal arguments may occur.
+
+\begin{verbatim}
+        def fprintf(file, format, *args):
+                file.write(format % args)
+\end{verbatim}
+
+\chapter{Data Structures}
 
 This chapter describes some things you've learned about already in
 more detail, and adds some new things as well.
@@ -1207,6 +1348,88 @@
 >>>
 \end{verbatim}\ecode
 
+\subsection{Functional Programming Tools}
+
+There are three built-in functions that are very useful when used with
+lists: \verb\filter\, \verb\map\, and \verb\reduce\.
+
+\verb\filter(function, sequence)\ returns a sequence (of the same
+type, if possible) consisting of those items from the sequence for
+which \verb\function(item)\ is true.  For example, to compute some
+primes:
+
+\begin{verbatim}
+        >>> def f(x): return x%2 != 0 and x%3 != 0
+        ...
+        >>> filter(f, range(2, 25))
+        [5, 7, 11, 13, 17, 19, 23]
+        >>>
+\end{verbatim}
+
+\verb\map(function, sequence)\ calls \verb\function(item)\ for each of
+the sequence's items and returns a list of the return values.  For
+example, to compute some cubes:
+
+\begin{verbatim}
+	>>> def cube(x): return x*x*x
+        ...
+        >>> map(cube, range(1, 11))
+        [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
+        >>>
+\end{verbatim}
+
+More than one sequence may be passed; the function must then have as
+many arguments as there are sequences and is called with the
+corresponding item from each sequence (or \verb\None\ if some sequence
+is shorter than another).  If \verb\None\ is passed for the function,
+a function returning its argument(s) is substituted.
+
+Combining these two special cases, we see that
+\verb\map(None, list1, list2)\  is a convenient way of turning a pair
+of lists into a list of pairs.  For example:
+
+\begin{verbatim}
+        >>> seq = range(8)
+	>>> def square(x): return x*x
+        ...
+        >>> map(None, seq, map(square, seq))
+        [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]
+        >>> 
+\end{verbatim}
+
+\verb\reduce(func, sequence)\ returns a single value constructed
+by calling the binary function \verb\func\ on the first two items of the
+sequence, then on the result and the next item, and so on.  For
+example, to compute the sum of the numbers 1 through 10:
+
+\begin{verbatim}
+	>>> def add(x,y): return x+y
+        ...
+        >>> reduce(add, range(1, 11))
+        55
+        >>> 
+\end{verbatim}
+
+If there's only one item in the sequence, its value is returned; if
+the sequence is empty, an exception is raised.
+
+A third argument can be passed to indicate the starting value.  In this
+case the starting value is returned for an empty sequence, and the
+function is first applied to the starting value and the first sequence
+item, then to the result and the next item, and so on.  For example,
+
+\begin{verbatim}
+        >>> def sum(seq):
+        ...     def add(x,y): return x+y
+        ...     return reduce(add, seq, 0)
+        ... 
+        >>> sum(range(1, 11))
+        55
+        >>> sum([])
+        0
+        >>> 
+\end{verbatim}
+
 \section{The {\tt del} statement}
 
 There is a way to remove an item from a list given its index instead
@@ -1323,8 +1546,11 @@
 Dictionaries are sometimes found in other languages as ``associative
 memories'' or ``associative arrays''.  Unlike sequences, which are
 indexed by a range of numbers, dictionaries are indexed by {\em keys},
-which are strings (the use of non-string values as keys
-is supported, but beyond the scope of this tutorial).
+which can be any non-mutable type; strings and numbers can always be
+keys.  Tuples can be used as keys if they contain only strings,
+numbers, or tuples.  You can't use lists as keys, since lists can be
+modified in place using their \code{append()} method.
+
 It is best to think of a dictionary as an unordered set of
 {\em key:value} pairs, with the requirement that the keys are unique
 (within one dictionary).
@@ -1527,6 +1753,7 @@
 >>> 
 \end{verbatim}\ecode
 
+
 \section{More on Modules}
 
 A module can contain executable statements as well as function
@@ -1587,6 +1814,46 @@
 This imports all names except those beginning with an underscore
 ({\tt _}).
 
+\subsection{The Module Search Path}
+
+When a module named {\tt spam} is imported, the interpreter searches
+for a file named {\tt spam.py} in the current directory,
+and then in the list of directories specified by
+the environment variable {\tt PYTHONPATH}.  This has the same syntax as
+the \UNIX{} shell variable {\tt PATH}, i.e., a list of colon-separated
+directory names.  When {\tt PYTHONPATH} is not set, or when the file
+is not found there, the search continues in an installation-dependent
+default path, usually {\tt .:/usr/local/lib/python}.
+
+Actually, modules are searched in the list of directories given by the 
+variable {\tt sys.path} which is initialized from the directory 
+containing the input script (or the current directory), {\tt 
+PYTHONPATH} and the installation-dependent default.  This allows 
+Python programs that know what they're doing to modify or replace the 
+module search path.  See the section on Standard Modules later.
+
+\subsection{``Compiled'' Python files}
+
+As an important speed-up of the start-up time for short programs that
+use a lot of standard modules, if a file called {\tt spam.pyc} exists
+in the directory where {\tt spam.py} is found, this is assumed to
+contain an already-``compiled'' version of the module {\tt spam}.  The
+modification time of the version of {\tt spam.py} used to create {\tt
+spam.pyc} is recorded in {\tt spam.pyc}, and the file is ignored if
+these don't match.
+
+Normally, you don't need to do anything to create the {\tt spam.pyc} file.
+Whenever {\tt spam.py} is successfully compiled, an attempt is made to
+write the compiled version to {\tt spam.pyc}.  It is not an error if
+this attempt fails; if for any reason the file is not written
+completely, the resulting {\tt spam.pyc} file will be recognized as
+invalid and thus ignored later.  The contents of the {\tt spam.pyc}
+file is platform independent, so a Python module directory can be
+shared by machines of different architectures.  (Tip for experts:
+the module {\tt compileall} creates {\tt .pyc} files for all modules.)
+
+XXX Should optimization with -O be covered here?
+
 \section{Standard Modules}
 
 Python comes with a library of standard modules, described in a separate
@@ -1682,8 +1949,13 @@
 \end{verbatim}\ecode
 
 
-\chapter{Output Formatting}
+\chapter{Input and Output}
 
+There are several ways to present the output of a program; data can be
+printed in a human-readable form, or written to a file for future use.
+This chapter will discuss some of the possibilities.
+
+\section{Fancier Output Formatting}
 So far we've encountered two ways of writing values: {\em expression
 statements} and the {\tt print} statement.  (A third way is using the
 {\tt write} method of file objects; the standard output file can be
@@ -1691,19 +1963,21 @@
 information on this.)
 
 Often you'll want more control over the formatting of your output than
-simply printing space-separated values.  The key to nice formatting in
-Python is to do all the string handling yourself; using string slicing
-and concatenation operations you can create any lay-out you can imagine.
-The standard module {\tt string} contains some useful operations for
-padding strings to a given column width; these will be discussed shortly.
-Finally, the \code{\%} operator (modulo) with a string left argument
-interprets this string as a C sprintf format string to be applied to the
-right argument, and returns the string resulting from this formatting
-operation.
+simply printing space-separated values.  There are two ways to format
+your output; the first way is to do all the string handling yourself;
+using string slicing and concatenation operations you can create any
+lay-out you can imagine.  The standard module {\tt string} contains
+some useful operations for padding strings to a given column width;
+these will be discussed shortly.  The second way is to use the
+\code{\%} operator with a string as the left argument.  \code{\%}
+interprets the left argument as a \C\ \code{sprintf()}-style format
+string to be applied to the right argument, and returns the string
+resulting from this formatting operation.
 
 One question remains, of course: how do you convert values to strings?
-Luckily, Python has a way to convert any value to a string: just write
-the value between reverse quotes (\verb/``/).  Some examples:
+Luckily, Python has a way to convert any value to a string: pass it to
+the \verb/repr()/ function, or just write the value between reverse
+quotes (\verb/``/).  Some examples:
 
 \bcode\begin{verbatim}
 >>> x = 10 * 3.14
@@ -1713,7 +1987,7 @@
 The value of x is 31.4, and y is 40000...
 >>> # Reverse quotes work on other types besides numbers:
 ... p = [x, y]
->>> ps = `p`
+>>> ps = repr(p)
 >>> ps
 '[31.4, 40000]'
 >>> # Converting a string adds string quotes and backslashes:
@@ -1788,6 +2062,222 @@
 '3.14159265359'
 >>>
 \end{verbatim}\ecode
+%
+Using the \code{\%} operator looks like this:
+
+\begin{verbatim}
+        >>> import math
+        >>> print 'The value of PI is approximately %5.3f.' % math.pi
+        The value of PI is approximately 3.142.
+        >>> 
+\end{verbatim}
+
+If there is more than one format in the string you pass a tuple as
+right operand, e.g.
+
+\begin{verbatim}
+        >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
+        >>> for name, phone in table.items():
+        ...     print '%-10s ==> %10d' % (name, phone)
+        ... 
+        Jack       ==>       4098
+        Dcab       ==>    8637678
+        Sjoerd     ==>       4127
+        >>> 
+\end{verbatim}
+
+Most formats work exactly as in C and require that you pass the proper
+type; however, if you don't you get an exception, not a core dump.
+The \verb\%s\ format is more relaxed: if the corresponding argument is
+not a string object, it is converted to string using the \verb\str()\
+built-in function.  Using \verb\*\ to pass the width or precision in
+as a separate (integer) argument is supported.  The C formats
+\verb\%n\ and \verb\%p\ are not supported.
+
+If you have a really long format string that you don't want to split
+up, it would be nice if you could reference the variables to be
+formatted by name instead of by position.  This can be done by using
+an extension of C formats using the form \verb\%(name)format\, e.g.
+
+\begin{verbatim}
+        >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
+        >>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table
+        Jack: 4098; Sjoerd: 4127; Dcab: 8637678
+        >>> 
+\end{verbatim}
+
+This is particularly useful in combination with the new built-in
+\verb\vars()\ function, which returns a dictionary containing all
+local variables.
+
+\section{Reading and Writing Files}
+% Opening files 
+\code{open()} returns a file object, and is most commonly used with
+two arguments: \code{open(\var{filename},\var{mode})}.  
+
+\bcode\begin{verbatim}
+>>> f=open('/tmp/workfile', 'w')
+>>> print f
+<open file '/tmp/workfile', mode 'w' at 80a0960>
+\end{verbatim}\ecode
+%
+The first argument is a string containing the filename.  The second
+argument is another string containing a few characters describing the
+way in which the file will be used.  \var{mode} can be \code{'r'} when
+the file will only be read, \code{'w'} for only writing (an existing
+file with the same name will be erased), and \code{'a'} opens the file
+for appending; any data written to the file is automatically added to
+the end.  \code{'r+'} opens the file for both reading and writing.
+The \var{mode} argument is optional; \code{'r'} will be assumed if
+it's omitted.
+
+On Windows, (XXX does the Mac need this too?) \code{'b'} appended to the
+mode opens the file in binary mode, so there are also modes like
+\code{'rb'}, \code{'wb'}, and \code{'r+b'}.  Windows makes a
+distinction between text and binary files; the end-of-line characters
+in text files are automatically altered slightly when data is read or
+written.  This behind-the-scenes modification to file data is fine for
+ASCII text files, but it'll corrupt binary data like that in JPEGs or
+.EXE files.  Be very careful to use binary mode when reading and
+writing such files.
+
+\subsection{Methods of file objects}
+
+The rest of the examples in this section will assume that a file
+object called \code{f} has already been created.
+
+To read a file's contents, call \code{f.read(\var{size})}, which reads
+some quantity of data and returns it as a string.  \var{size} is an
+optional numeric argument.  When \var{size} is omitted or negative,
+the entire contents of the file will be read and returned; it's your
+problem if the file is twice as large as your machine's memory.
+Otherwise, at most \var{size} bytes are read and returned.  If the end
+of the file has been reached, \code{f.read()} will return an empty
+string (\code {""}).
+\bcode\begin{verbatim}
+>>> f.read()
+'This is the entire file.\012'
+>>> f.read()
+''
+\end{verbatim}\ecode
+%
+\code{f.readline()} reads a single line from the file; a newline
+character (\verb/\n/) is left at the end of the string, and is only
+omitted on the last line of the file if the file doesn't end in a
+newline.  This makes the return value unambiguous; if
+\code{f.readline()} returns an empty string, the end of the file has
+been reached, while a blank line is represented by \verb/'\n'/, a
+string containing only a single newline.  
+
+\bcode\begin{verbatim}
+>>> f.readline()
+'This is the first line of the file.\012'
+>>> f.readline()
+'Second line of the file\012'
+>>> f.readline()
+''
+\end{verbatim}\ecode
+%
+\code{f.readlines()} uses {\code{f.readline()} repeatedly, and returns
+a list containing all the lines of data in the file.
+
+\bcode\begin{verbatim}
+>>> f.readlines()
+['This is the first line of the file.\012', 'Second line of the file\012']
+\end{verbatim}\ecode
+%
+\code{f.write(\var{string})} writes the contents of \var{string} to
+the file, returning \code{None}.  
+
+\bcode\begin{verbatim}
+>>> f.write('This is a test\n')
+\end{verbatim}\ecode
+%
+\code{f.tell()} returns an integer giving the file object's current
+position in the file, measured in bytes from the beginning of the
+file.  To change the file object's position, use
+\code{f.seek(\var{offset}, \var{from_what})}.  The position is
+computed from adding \var{offset} to a reference point; the reference
+point is selected by the \var{from_what} argument.  A \var{from_what}
+value of 0 measures from the beginning of the file, 1 uses the current
+file position, and 2 uses the end of the file as the reference point.
+\var{from_what}
+can be omitted and defaults to 0, using the beginning of the file as the reference point.
+
+\bcode\begin{verbatim}
+>>> f=open('/tmp/workfile', 'r+')
+>>> f.write('0123456789abcdef')
+>>> f.seek(5)     # Go to the 5th byte in the file
+>>> f.read(1)        
+'5'
+>>> f.seek(-3, 2) # Go to the 3rd byte before the end
+>>> f.read(1)
+'d'
+\end{verbatim}\ecode
+%
+When you're done with a file, call \code{f.close()} to close it and
+free up any system resources taken up by the open file.  After calling
+\code{f.close()}, attempts to use the file object will automatically fail.
+
+\bcode\begin{verbatim}
+>>> f.close()
+>>> f.read()
+Traceback (innermost last):
+  File "<stdin>", line 1, in ?
+ValueError: I/O operation on closed file
+\end{verbatim}\ecode
+%
+File objects have some additional methods, such as \code{isatty()} and
+\code{truncate()} which are less frequently used; consult the Library
+Reference for a complete guide to file objects.
+
+\subsection{The pickle module}
+
+Strings can easily be written to and read from a file. Numbers take a
+bit more effort, since the \code{read()} method only returns strings,
+which will have to be passed to a function like \code{string.atoi()},
+which takes a string like \code{'123'} and returns its numeric value
+123.  However, when you want to save more complex data types like
+lists, dictionaries, or class instances, things get a lot more
+complicated.  
+
+Rather than have users be constantly writing and debugging code to
+save complicated data types, Python provides a standard module called
+\code{pickle}.  code{pickle} is an amazing module that can take almost
+any Python object (even some forms of Python code!), and convert it to
+a string representation; this process is called \dfn{pickling}.  
+Reconstructing the object from the string representation is called
+\dfn{unpickling}.  Between pickling and unpickling, the string
+representing the object may have been stored in a file or data, or
+sent over a network connection to some distant machine.
+
+If you have an object \code{x}, and a file object \code{f} that's been
+opened for writing, the simplest way to pickle the object takes only
+one line of code:
+
+\bcode\begin{verbatim}
+pickle.dump(x, f)
+\end{verbatim}\ecode
+%
+To unpickle the object again, if \code{f} is a file object which has been
+opened for reading:
+
+\bcode\begin{verbatim}
+x = pickle.load(f)
+\end{verbatim}\ecode
+%
+(There are other variants of this, used when pickling many objects or
+when you don't want to write the pickled data to a file; consult the
+complete documentation for \code{pickle} in the Library Reference.)
+
+\code{pickle} is the standard way to make Python objects which can be
+stored and reused by other programs or by a future invocation of the
+same program; the technical term for this is a \dfn{persistent}
+object.  Because \code{pickle} is so widely used, many authors who
+write Python extensions take care to ensure that new data types such
+as matrices, XXX more examples needed XXX, can be properly pickled and
+unpickled.
+
 
 
 \chapter{Errors and Exceptions}
@@ -1884,7 +2374,7 @@
 ...         print 1.0 / x
 ...     except ZeroDivisionError:
 ...         print '*** has no inverse ***'
-... 
+...     
 0.3333 3.00030003
 2.5 0.4
 0 *** has no inverse ***
@@ -1934,6 +2424,23 @@
 Use this with extreme caution, since it is easy to mask a real
 programming error in this way!
 
+The \verb\try...except\ statement has an optional \verb\else\ clause,
+which must follow all \verb\except\ clauses.  It is useful to place
+code that must be executed if the \verb\try\ clause does not raise an
+exception.  For example:
+
+\begin{verbatim}
+        for arg in sys.argv:
+                try:
+                        f = open(arg, 'r')
+                except IOError:
+                        print 'cannot open', arg
+                else:
+                        print arg, 'has', len(f.readlines()), 'lines'
+                        f.close()
+\end{verbatim}
+
+
 When an exception occurs, it may have an associated value, also known as
 the exceptions's
 {\em argument}.
@@ -1970,8 +2477,9 @@
 ...     print 'Handling run-time error:', detail
 ... 
 Handling run-time error: integer division or modulo
->>> 
+>>>
 \end{verbatim}\ecode
+%
 
 \section{Raising Exceptions}
 
@@ -1990,6 +2498,8 @@
 The first argument to {\tt raise} names the exception to be raised.
 The optional second argument specifies the exception's argument.
 
+%
+
 \section{User-defined Exceptions}
 
 Programs may name their own exceptions by assigning a string to a
@@ -2014,6 +2524,8 @@
 Many standard modules use this to report errors that may occur in
 functions they define.
 
+%
+
 \section{Defining Clean-up Actions}
 
 The {\tt try} statement has another optional clause which is intended to
@@ -2043,7 +2555,6 @@
 A {\tt try} statement must either have one or more {\tt except}
 clauses or one {\tt finally} clause, but not both.
 
-
 \chapter{Classes}
 
 Python's class mechanism adds classes to the language with a minimum
@@ -2071,7 +2582,6 @@
 built-in operators with special syntax (arithmetic operators,
 subscripting etc.) can be redefined for class members.
 
-
 \section{A word about terminology}
 
 Lacking universally accepted terminology to talk about classes, I'll
@@ -2264,6 +2774,7 @@
 
 \begin{verbatim}
         class MyClass:
+                "A simple example class"
                 i = 12345
                 def f(x):
                         return 'hello world'
@@ -2271,8 +2782,10 @@
 
 then \verb\MyClass.i\ and \verb\MyClass.f\ are valid attribute
 references, returning an integer and a function object, respectively.
-Class attributes can also be assigned to, so you can change the
-value of \verb\MyClass.i\ by assignment.
+Class attributes can also be assigned to, so you can change the value
+of \verb\MyClass.i\ by assignment.  \verb\__doc__\ is also a valid
+attribute that's read-only, returning the docstring belonging to
+the class: \verb\"A simple example class"\).  
 
 Class {\em instantiation} uses function notation.  Just pretend that
 the class object is a parameterless function that returns a new
@@ -2600,6 +3113,75 @@
 not clear that these semantics are in any way useful.
 
 
+\section{Private variables through name mangling}
+
+There is now limited support for class-private
+identifiers.  Any identifier of the form \code{__spam} (at least two
+leading underscores, at most one trailing underscore) is now textually
+replaced with \code{_classname__spam}, where \code{classname} is the
+current class name with leading underscore(s) stripped.  This mangling
+is done without regard of the syntactic position of the identifier, so
+it can be used to define class-private instance and class variables,
+methods, as well as globals, and even to store instance variables
+private to this class on instances of {\em other} classes.  Truncation
+may occur when the mangled name would be longer than 255 characters.
+Outside classes, or when the class name consists of only underscores,
+no mangling occurs.
+
+Name mangling is intended to give classes an easy way to define
+``private'' instance variables and methods, without having to worry
+about instance variables defined by derived classes, or mucking with
+instance variables by code outside the class.  Note that the mangling
+rules are designed mostly to avoid accidents; it still is possible for
+a determined soul to access or modify a variable that is considered
+private.  This can even be useful, e.g. for the debugger, and that's
+one reason why this loophole is not closed.  (Buglet: derivation of a
+class with the same name as the base class makes use of private
+variables of the base class possible.)
+
+Notice that code passed to \code{exec}, \code{eval()} or
+\code{evalfile()} does not consider the classname of the invoking 
+class to be the current class; this is similar to the effect of the 
+\code{global} statement, the effect of which is likewise restricted to 
+code that is byte-compiled together.  The same restriction applies to
+\code{getattr()}, \code{setattr()} and \code{delattr()}, as well as
+when referencing \code{__dict__} directly.
+
+Here's an example of a class that implements its own
+\code{__getattr__} and \code{__setattr__} methods and stores all
+attributes in a private variable, in a way that works in Python 1.4 as
+well as in previous versions:
+
+\begin{verbatim}
+class VirtualAttributes:
+    __vdict = None
+    __vdict_name = locals().keys()[0]
+     
+    def __init__(self):
+        self.__dict__[self.__vdict_name] = {}
+    
+    def __getattr__(self, name):
+        return self.__vdict[name]
+    
+    def __setattr__(self, name, value):
+        self.__vdict[name] = value
+\end{verbatim}
+
+%{\em Warning: this is an experimental feature.}  To avoid all
+%potential problems, refrain from using identifiers starting with
+%double underscore except for predefined uses like \code{__init__}.  To
+%use private names while maintaining future compatibility: refrain from
+%using the same private name in classes related via subclassing; avoid
+%explicit (manual) mangling/unmangling; and assume that at some point
+%in the future, leading double underscore will revert to being just a
+%naming convention.  Discussion on extensive compile-time declarations
+%are currently underway, and it is impossible to predict what solution
+%will eventually be chosen for private names.  Double leading
+%underscore is still a candidate, of course --- just not the only one.
+%It is placed in the distribution in the belief that it is useful, and
+%so that widespread experience with its use can be gained.  It will not
+%be removed without providing a better solution and a migration path.
+
 \section{Odds and ends}
 
 Sometimes it is useful to have a data type similar to the Pascal
@@ -2636,608 +3218,7 @@
 object of which the method is an instance, and \verb\m.im_func\ is the
 function object corresponding to the method.
 
-
-\chapter{Recent Additions as of Release 1.1}
-
-Python is an evolving language.  Since this tutorial was last
-thoroughly revised, several new features have been added to the
-language.  While ideally I should revise the tutorial to incorporate
-them in the mainline of the text, lack of time currently requires me
-to take a more modest approach.  In this chapter I will briefly list the
-most important improvements to the language and how you can use them
-to your benefit.
-
-\section{The Last Printed Expression}
-
-In interactive mode, the last printed expression is assigned to the
-variable \code{_}.  This means that when you are using Python as a
-desk calculator, it is somewhat easier to continue calculations, for
-example:
-
-\begin{verbatim}
-        >>> tax = 17.5 / 100
-        >>> price = 3.50
-        >>> price * tax
-        0.6125
-        >>> price + _
-        4.1125
-        >>> round(_, 2)
-        4.11
-        >>> 
-\end{verbatim}
-
-For reasons too embarrassing to explain, this variable is implemented
-as a built-in (living in the module \code{__builtin__}), so it should
-be treated as read-only by the user.  I.e. don't explicitly assign a
-value to it --- you would create an independent local variable with
-the same name masking the built-in variable with its magic behavior.
-
-\section{String Literals}
-
-\subsection{Double Quotes}
-
-Python can now also use double quotes to surround string literals,
-e.g. \verb\"this doesn't hurt a bit"\.  There is no semantic
-difference between strings surrounded by single or double quotes.
-
-\subsection{Continuation Of String Literals}
-
-String literals can span multiple lines by escaping newlines with
-backslashes, e.g.
-
-\begin{verbatim}
-        hello = "This is a rather long string containing\n\
-        several lines of text just as you would do in C.\n\
-            Note that whitespace at the beginning of the line is\
-         significant.\n"
-        print hello
-\end{verbatim}
-
-which would print the following:
-\begin{verbatim}
-        This is a rather long string containing
-        several lines of text just as you would do in C.
-            Note that whitespace at the beginning of the line is significant.
-\end{verbatim}
-
-\subsection{Triple-quoted strings}
-
-In some cases, when you need to include really long strings (e.g.
-containing several paragraphs of informational text), it is annoying
-that you have to terminate each line with \verb@\n\@, especially if
-you would like to reformat the text occasionally with a powerful text
-editor like Emacs.  For such situations, ``triple-quoted'' strings can
-be used, e.g.
-
-\begin{verbatim}
-        hello = """
-
-            This string is bounded by triple double quotes (3 times ").
-        Unescaped newlines in the string are retained, though \
-        it is still possible\nto use all normal escape sequences.
-
-            Whitespace at the beginning of a line is
-        significant.  If you need to include three opening quotes
-        you have to escape at least one of them, e.g. \""".
-
-            This string ends in a newline.
-        """
-\end{verbatim}
-
-Triple-quoted strings can be surrounded by three single quotes as
-well, again without semantic difference.
-
-\subsection{String Literal Juxtaposition}
-
-One final twist: you can juxtapose multiple string literals.  Two or
-more adjacent string literals (but not arbitrary expressions!)
-separated only by whitespace will be concatenated (without intervening
-whitespace) into a single string object at compile time.  This makes
-it possible to continue a long string on the next line without
-sacrificing indentation or performance, unlike the use of the string
-concatenation operator \verb\+\ or the continuation of the literal
-itself on the next line (since leading whitespace is significant
-inside all types of string literals).  Note that this feature, like
-all string features except triple-quoted strings, is borrowed from
-Standard C.
-
-\section{The Formatting Operator}
-
-\subsection{Basic Usage}
-
-The chapter on output formatting is really out of date: there is now
-an almost complete interface to C-style printf formats.  This is done
-by overloading the modulo operator (\verb\%\) for a left operand
-which is a string, e.g.
-
-\begin{verbatim}
-        >>> import math
-        >>> print 'The value of PI is approximately %5.3f.' % math.pi
-        The value of PI is approximately 3.142.
-        >>> 
-\end{verbatim}
-
-If there is more than one format in the string you pass a tuple as
-right operand, e.g.
-
-\begin{verbatim}
-        >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
-        >>> for name, phone in table.items():
-        ...     print '%-10s ==> %10d' % (name, phone)
-        ... 
-        Jack       ==>       4098
-        Dcab       ==>    8637678
-        Sjoerd     ==>       4127
-        >>> 
-\end{verbatim}
-
-Most formats work exactly as in C and require that you pass the proper
-type (however, if you don't you get an exception, not a core dump).
-The \verb\%s\ format is more relaxed: if the corresponding argument is
-not a string object, it is converted to string using the \verb\str()\
-built-in function.  Using \verb\*\ to pass the width or precision in
-as a separate (integer) argument is supported.  The C formats
-\verb\%n\ and \verb\%p\ are not supported.
-
-\subsection{Referencing Variables By Name}
-
-If you have a really long format string that you don't want to split
-up, it would be nice if you could reference the variables to be
-formatted by name instead of by position.  This can be done by using
-an extension of C formats using the form \verb\%(name)format\, e.g.
-
-\begin{verbatim}
-        >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
-        >>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table
-        Jack: 4098; Sjoerd: 4127; Dcab: 8637678
-        >>> 
-\end{verbatim}
-
-This is particularly useful in combination with the new built-in
-\verb\vars()\ function, which returns a dictionary containing all
-local variables.
-
-\section{Optional Function Arguments}
-
-It is now possible to define functions with a variable number of
-arguments.  There are two forms, which can be combined.
-
-\subsection{Default Argument Values}
-
-The most useful form is to specify a default value for one or more
-arguments.  This creates a function that can be called with fewer
-arguments than it is defined, e.g.
-
-\begin{verbatim}
-        def ask_ok(prompt, retries = 4, complaint = 'Yes or no, please!'):
-                while 1:
-                        ok = raw_input(prompt)
-                        if ok in ('y', 'ye', 'yes'): return 1
-                        if ok in ('n', 'no', 'nop', 'nope'): return 0
-                        retries = retries - 1
-                        if retries < 0: raise IOError, 'refusenik user'
-                        print complaint
-\end{verbatim}
-
-This function can be called either like this:
-\verb\ask_ok('Do you really want to quit?')\ or like this:
-\verb\ask_ok('OK to overwrite the file?', 2)\.
-
-The default values are evaluated at the point of function definition
-in the {\em defining} scope, so that e.g.
-
-\begin{verbatim}
-        i = 5
-        def f(arg = i): print arg
-        i = 6
-        f()
-\end{verbatim}
-
-will print \verb\5\.
-
-\subsection{Arbitrary Argument Lists}
-
-It is also possible to specify that a function can be called with an
-arbitrary number of arguments.  These arguments will be wrapped up in
-a tuple.  Before the variable number of arguments, zero or more normal
-arguments may occur, e.g.
-
-\begin{verbatim}
-        def fprintf(file, format, *args):
-                file.write(format % args)
-\end{verbatim}
-
-This feature may be combined with the previous, e.g.
-
-\begin{verbatim}
-        def but_is_it_useful(required, optional = None, *remains):
-                print "I don't know"
-\end{verbatim}
-
-\section{Lambda And Functional Programming Tools}
-
-\subsection{Lambda Forms}
-
-By popular demand, a few features commonly found in functional
-programming languages and Lisp have been added to Python.  With the
-\verb\lambda\ keyword, small anonymous functions can be created.
-Here's a function that returns the sum of its two arguments:
-\verb\lambda a, b: a+b\.  Lambda forms can be used wherever function
-objects are required.  They are syntactically restricted to a single
-expression.  Semantically, they are just syntactic sugar for a normal
-function definition.  Like nested function definitions, lambda forms
-cannot reference variables from the containing scope, but this can be
-overcome through the judicious use of default argument values, e.g.
-
-\begin{verbatim}
-        def make_incrementor(n):
-                return lambda x, incr=n: x+incr
-\end{verbatim}
-
-\subsection{Map, Reduce and Filter}
-
-Three new built-in functions on sequences are good candidate to pass
-lambda forms.
-
-\subsubsection{Map.}
-
-\verb\map(function, sequence)\ calls \verb\function(item)\ for each of
-the sequence's items and returns a list of the return values.  For
-example, to compute some cubes:
-
-\begin{verbatim}
-        >>> map(lambda x: x*x*x, range(1, 11))
-        [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
-        >>>
-\end{verbatim}
-
-More than one sequence may be passed; the function must then have as
-many arguments as there are sequences and is called with the
-corresponding item from each sequence (or \verb\None\ if some sequence
-is shorter than another).  If \verb\None\ is passed for the function,
-a function returning its argument(s) is substituted.
-
-Combining these two special cases, we see that
-\verb\map(None, list1, list2)\  is a convenient way of turning a pair
-of lists into a list of pairs.  For example:
-
-\begin{verbatim}
-        >>> seq = range(8)
-        >>> map(None, seq, map(lambda x: x*x, seq))
-        [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]
-        >>> 
-\end{verbatim}
-
-\subsubsection{Filter.}
-
-\verb\filter(function, sequence)\ returns a sequence (of the same
-type, if possible) consisting of those items from the sequence for
-which \verb\function(item)\ is true.  For example, to compute some
-primes:
-
-\begin{verbatim}
-        >>> filter(lambda x: x%2 != 0 and x%3 != 0, range(2, 25))
-        [5, 7, 11, 13, 17, 19, 23]
-        >>>
-\end{verbatim}
-
-\subsubsection{Reduce.}
-
-\verb\reduce(function, sequence)\ returns a single value constructed
-by calling the (binary) function on the first two items of the
-sequence, then on the result and the next item, and so on.  For
-example, to compute the sum of the numbers 1 through 10:
-
-\begin{verbatim}
-        >>> reduce(lambda x, y: x+y, range(1, 11))
-        55
-        >>> 
-\end{verbatim}
-
-If there's only one item in the sequence, its value is returned; if
-the sequence is empty, an exception is raised.
-
-A third argument can be passed to indicate the starting value.  In this
-case the starting value is returned for an empty sequence, and the
-function is first applied to the starting value and the first sequence
-item, then to the result and the next item, and so on.  For example,
-
-\begin{verbatim}
-        >>> def sum(seq):
-        ...     return reduce(lambda x, y: x+y, seq, 0)
-        ... 
-        >>> sum(range(1, 11))
-        55
-        >>> sum([])
-        0
-        >>> 
-\end{verbatim}
-
-\section{Continuation Lines Without Backslashes}
-
-While the general mechanism for continuation of a source line on the
-next physical line remains to place a backslash on the end of the
-line, expressions inside matched parentheses (or square brackets, or
-curly braces) can now also be continued without using a backslash.
-This is particularly useful for calls to functions with many
-arguments, and for initializations of large tables.
-
-For example:
-
-\begin{verbatim}
-        month_names = ['Januari', 'Februari', 'Maart', 
-                       'April',   'Mei',      'Juni', 
-                       'Juli',    'Augustus', 'September',
-                       'Oktober', 'November', 'December']
-\end{verbatim}
-
-and
-
-\begin{verbatim}
-        CopyInternalHyperLinks(self.context.hyperlinks,
-                               copy.context.hyperlinks,
-                               uidremap)
-\end{verbatim}
-
-\section{Regular Expressions}
-
-While C's printf-style output formats, transformed into Python, are
-adequate for most output formatting jobs, C's scanf-style input
-formats are not very powerful.  Instead of scanf-style input, Python
-offers Emacs-style regular expressions as a powerful input and
-scanning mechanism.  Read the corresponding section in the Library
-Reference for a full description.
-
-\section{Generalized Dictionaries}
-
-The keys of dictionaries are no longer restricted to strings --- they
-can be any immutable basic type including strings, numbers, tuples, or
-(certain) class instances.  (Lists and dictionaries are not acceptable
-as dictionary keys, in order to avoid problems when the object used as
-a key is modified.)
-
-Dictionaries have two new methods: \verb\d.values()\ returns a list of
-the dictionary's values, and \verb\d.items()\ returns a list of the
-dictionary's (key, value) pairs.  Like \verb\d.keys()\, these
-operations are slow for large dictionaries.  Examples:
-
-\begin{verbatim}
-        >>> d = {100: 'honderd', 1000: 'duizend', 10: 'tien'}
-        >>> d.keys()
-        [100, 10, 1000]
-        >>> d.values()
-        ['honderd', 'tien', 'duizend']
-        >>> d.items()
-        [(100, 'honderd'), (10, 'tien'), (1000, 'duizend')]
-        >>> 
-\end{verbatim}
-
-\section{Miscellaneous New Built-in Functions}
-
-The function \verb\vars()\ returns a dictionary containing the current
-local variables.  With a module argument, it returns that module's
-global variables.  The old function \verb\dir(x)\ returns
-\verb\vars(x).keys()\.
-
-The function \verb\round(x)\ returns a floating point number rounded
-to the nearest integer (but still expressed as a floating point
-number).  E.g. \verb\round(3.4) == 3.0\ and \verb\round(3.5) == 4.0\.
-With a second argument it rounds to the specified number of digits,
-e.g. \verb\round(math.pi, 4) == 3.1416\ or even
-\verb\round(123.4, -2) == 100.0\. 
-
-The function \verb\hash(x)\ returns a hash value for an object.
-All object types acceptable as dictionary keys have a hash value (and
-it is this hash value that the dictionary implementation uses).
-
-The function \verb\id(x)\ return a unique identifier for an object.
-For two objects x and y, \verb\id(x) == id(y)\ if and only if
-\verb\x is y\.  (In fact the object's address is used.)
-
-The function \verb\hasattr(x, name)\ returns whether an object has an
-attribute with the given name (a string value).  The function
-\verb\getattr(x, name)\ returns the object's attribute with the given
-name.  The function \verb\setattr(x, name, value)\ assigns a value to
-an object's attribute with the given name.  These three functions are
-useful if the attribute names are not known beforehand.  Note that
-\verb\getattr(x, 'spam')\ is equivalent to \verb\x.spam\, and
-\verb\setattr(x, 'spam', y)\ is equivalent to \verb\x.spam = y\.  By
-definition, \verb\hasattr(x, name)\ returns true if and only if
-\verb\getattr(x, name)\ returns without raising an exception.
-
-\section{Else Clause For Try Statement}
-
-The \verb\try...except\ statement now has an optional \verb\else\
-clause, which must follow all \verb\except\ clauses.  It is useful to
-place code that must be executed if the \verb\try\ clause does not
-raise an exception.  For example:
-
-\begin{verbatim}
-        for arg in sys.argv:
-                try:
-                        f = open(arg, 'r')
-                except IOError:
-                        print 'cannot open', arg
-                else:
-                        print arg, 'has', len(f.readlines()), 'lines'
-                        f.close()
-\end{verbatim}
-
-
-\section{New Class Features in Release 1.1}
-
-Some changes have been made to classes: the operator overloading
-mechanism is more flexible, providing more support for non-numeric use
-of operators (including calling an object as if it were a function),
-and it is possible to trap attribute accesses.
-
-\subsection{New Operator Overloading}
-
-It is no longer necessary to coerce both sides of an operator to the
-same class or type.  A class may still provide a \code{__coerce__}
-method, but this method may return objects of different types or
-classes if it feels like it.  If no \code{__coerce__} is defined, any
-argument type or class is acceptable.
-
-In order to make it possible to implement binary operators where the
-right-hand side is a class instance but the left-hand side is not,
-without using coercions, right-hand versions of all binary operators
-may be defined.  These have an `r' prepended to their name,
-e.g. \code{__radd__}.
-
-For example, here's a very simple class for representing times.  Times
-are initialized from a number of seconds (like time.time()).  Times
-are printed like this: \code{Wed Mar 15 12:28:48 1995}.  Subtracting
-two Times gives their difference in seconds.  Adding or subtracting a
-Time and a number gives a new Time.  You can't add two times, nor can
-you subtract a Time from a number.
-
-\begin{verbatim}
-import time
-
-class Time:
-    def __init__(self, seconds):
-        self.seconds = seconds
-    def __repr__(self):
-        return time.ctime(self.seconds)
-    def __add__(self, x):
-        return Time(self.seconds + x)
-    __radd__ = __add__            # support for x+t
-    def __sub__(self, x):
-        if hasattr(x, 'seconds'): # test if x could be a Time
-            return self.seconds - x.seconds
-        else:
-            return self.seconds - x
-
-now = Time(time.time())
-tomorrow = 24*3600 + now
-yesterday = now - today
-print tomorrow - yesterday        # prints 172800
-\end{verbatim}
-
-\subsection{Trapping Attribute Access}
-
-You can define three new ``magic'' methods in a class now:
-\code{__getattr__(self, name)}, \code{__setattr__(self, name, value)}
-and \code{__delattr__(self, name)}.
-
-The \code{__getattr__} method is called when an attribute access fails,
-i.e. when an attribute access would otherwise raise AttributeError ---
-this is {\em after} the instance's dictionary and its class hierarchy
-have been searched for the named attribute.  Note that if this method
-attempts to access any undefined instance attribute it will be called
-recursively!
-
-The \code{__setattr__} and \code{__delattr__} methods are called when
-assignment to, respectively deletion of an attribute are attempted.
-They are called {\em instead} of the normal action (which is to insert
-or delete the attribute in the instance dictionary).  If either of
-these methods most set or delete any attribute, they can only do so by
-using the instance dictionary directly --- \code{self.__dict__} --- else
-they would be called recursively.
-
-For example, here's a near-universal ``Wrapper'' class that passes all
-its attribute accesses to another object.  Note how the
-\code{__init__} method inserts the wrapped object in
-\code{self.__dict__} in order to avoid endless recursion
-(\code{__setattr__} would call \code{__getattr__} which would call
-itself recursively).
-
-\begin{verbatim}
-class Wrapper:
-    def __init__(self, wrapped):
-        self.__dict__['wrapped'] = wrapped
-    def __getattr__(self, name):
-        return getattr(self.wrapped, name)
-    def __setattr__(self, name, value):
-        setattr(self.wrapped, name, value)
-    def __delattr__(self, name):
-        delattr(self.wrapped, name)
-
-import sys
-f = Wrapper(sys.stdout)
-f.write('hello world\n')          # prints 'hello world'
-\end{verbatim}
-
-A simpler example of \code{__getattr__} is an attribute that is
-computed each time (or the first time) it it accessed.  For instance:
-
-\begin{verbatim}
-from math import pi
-
-class Circle:
-    def __init__(self, radius):
-        self.radius = radius
-    def __getattr__(self, name):
-        if name == 'circumference':
-            return 2 * pi * self.radius
-        if name == 'diameter':
-            return 2 * self.radius
-        if name == 'area':
-           return pi * pow(self.radius, 2)
-        raise AttributeError, name
-\end{verbatim}
-
-\subsection{Calling a Class Instance}
-
-If a class defines a method \code{__call__} it is possible to call its
-instances as if they were functions.  For example:
-
-\begin{verbatim}
-class PresetSomeArguments:
-    def __init__(self, func, *args):
-        self.func, self.args = func, args
-    def __call__(self, *args):
-        return apply(self.func, self.args + args)
-
-f = PresetSomeArguments(pow, 2)    # f(i) computes powers of 2
-for i in range(10): print f(i),    # prints 1 2 4 8 16 32 64 128 256 512
-print                              # append newline
-\end{verbatim}
-
-
-\chapter{New in Release 1.2}
-
-
-This chapter describes even more recent additions to the Python
-language and library.
-
-
-\section{New Class Features}
-
-The semantics of \code{__coerce__} have been changed to be more
-reasonable.  As an example, the new standard module \code{Complex}
-implements fairly complete complex numbers using this.  Additional
-examples of classes with and without \code{__coerce__} methods can be
-found in the \code{Demo/classes} subdirectory, modules \code{Rat} and
-\code{Dates}.
-
-If a class defines no \code{__coerce__} method, this is equivalent to
-the following definition:
-
-\begin{verbatim}
-def __coerce__(self, other): return self, other
-\end{verbatim}
-
-If \code{__coerce__} coerces itself to an object of a different type,
-the operation is carried out using that type --- in release 1.1, this
-would cause an error.
-
-Comparisons involving class instances now invoke \code{__coerce__}
-exactly as if \code{cmp(x, y)} were a binary operator like \code{+}
-(except if \code{x} and \code{y} are the same object).
-
-\section{Unix Signal Handling}
-
-On \UNIX{}, Python now supports signal handling.  The module
-\code{signal} exports functions \code{signal}, \code{pause} and
-\code{alarm}, which act similar to their \UNIX{} counterparts.  The
-module also exports the conventional names for the various signal
-classes (also usable with \code{os.kill()}) and \code{SIG_IGN} and
-\code{SIG_DFL}.  See the section on \code{signal} in the Library
-Reference Manual for more information.
-
-\section{Exceptions Can Be Classes}
+\subsection{Exceptions Can Be Classes}
 
 User-defined exceptions are no longer limited to being string objects
 --- they can be identified by classes as well.  Using this mechanism it
@@ -3295,163 +3276,76 @@
 
 In this release, the built-in exceptions are still strings.
 
+\chapter{What Now?}
 
-\section{Object Persistency and Object Copying}
+Hopefully reading this tutorial has reinforced your interest in using
+Python.  Now what should you do?
 
-Two new modules, \code{pickle} and \code{shelve}, support storage and
-retrieval of (almost) arbitrary Python objects on disk, using the
-\code{dbm} package.  A third module, \code{copy}, provides flexible
-object copying operations.  More information on these modules is
-provided in the Library Reference Manual.
+You should read, or at least page through, the Library Reference,
+which gives complete (though terse) reference material about types,
+functions, and modules that can save you a lot of time when writing
+Python programs.  The standard Python distribution includes a
+\emph{lot} of code in both C and Python; there are modules to read
+Unix mailboxes, retrieve documents via HTTP, generate random numbers,
+parse command-line options, write CGI programs, compress data, and a
+lot more; skimming through the Library Reference will give you an idea
+of what's available.
 
-\subsection{Persistent Objects}
+The major Python Web site is \code{http://www.python.org}; it contains
+code, documentation, and pointers to Python-related pages around the
+Web.  \code{www.python.org} is mirrored in various places around the
+world, such as Europe, Japan, and Australia; a mirror may be faster
+than the main site, depending on your geographical location.  A more
+informal site is \code{http://starship.skyport.net}, which contains a
+bunch of Python-related personal home pages; many people have
+downloadable software here.
 
-The module \code{pickle} provides a general framework for objects to
-disassemble themselves into a stream of bytes and to reassemble such a
-stream back into an object.  It copes with reference sharing,
-recursive objects and instances of user-defined classes, but not
-(directly) with objects that have ``magical'' links into the operating
-system such as open files, sockets or windows.
+For Python-related questions and problem reports, you can post to the
+newsgroup \code{comp.lang.python}, or send them to the mailing list at
+\code{python-list@cwi.nl}.  The newsgroup and mailing list are
+gatewayed, so messages posted to one will automatically be forwarded
+to the other.  There are around 20--30 postings a day, asking (and
+answering) questions, suggesting new features, and announcing new
+modules.  But before posting, be sure to check the list of Frequently
+Asked Questions (also called the FAQ), at
+\code{http://www.python.org/doc/FAQ.html}, or look for it in the
+\code{Misc/} directory of the Python source distribution.  The FAQ
+answers many of the questions that come up again and again, and may
+already contain the solution for your problem.
 
-The \code{pickle} module defines a simple protocol whereby
-user-defined classes can control how they are disassembled and
-assembled.  The method \code{__getinitargs__()}, if defined, returns
-the argument list for the constructor to be used at assembly time (by
-default the constructor is called without arguments).  The methods
-\code{__getstate__()} and \code{__setstate__()} are used to pass
-additional state from disassembly to assembly; by default the
-instance's \code{__dict__} is passed and restored.
+You can support the Python community by joining the Python Software
+Activity, which runs the python.org web, ftp and email servers, and
+organizes Python workshops.  See \code{http://www.python.org/psa/} for
+information on how to join.
 
-Note that \code{pickle} does not open or close any files --- it can be
-used equally well for moving objects around on a network or store them
-in a database.  For ease of debugging, and the inevitable occasional
-manual patch-up, the constructed byte streams consist of printable
-\ASCII{} characters only (though it's not designed to be pretty).
 
-The module \code{shelve} provides a simple model for storing objects
-on files.  The operation \code{shelve.open(filename)} returns a
-``shelf'', which is a simple persistent database with a
-dictionary-like interface.  Database keys are strings, objects stored
-in the database can be anything that \code{pickle} will handle.
+\chapter{Recent Additions as of Release 1.1}
 
-\subsection{Copying Objects}
+XXX Should the stuff in this chapter be deleted, or can a home be found or it elsewhere in the Tutorial?
 
-The module \code{copy} exports two functions: \code{copy()} and
-\code{deepcopy()}.  The \code{copy()} function returns a ``shallow''
-copy of an object; \code{deepcopy()} returns a ``deep'' copy.  The
-difference between shallow and deep copying is only relevant for
-compound objects (objects that contain other objects, like lists or
-class instances):
+\section{Lambda Forms}
 
-\begin{itemize}
+XXX Where to put this?  Or just leave it out?
 
-\item
-A shallow copy constructs a new compound object and then (to the
-extent possible) inserts {\em the same objects} into in that the
-original contains.
+By popular demand, a few features commonly found in functional
+programming languages and Lisp have been added to Python.  With the
+\verb\lambda\ keyword, small anonymous functions can be created.
+Here's a function that returns the sum of its two arguments:
+\verb\lambda a, b: a+b\.  Lambda forms can be used wherever function
+objects are required.  They are syntactically restricted to a single
+expression.  Semantically, they are just syntactic sugar for a normal
+function definition.  Like nested function definitions, lambda forms
+cannot reference variables from the containing scope, but this can be
+overcome through the judicious use of default argument values, e.g.
 
-\item
-A deep copy constructs a new compound object and then, recursively,
-inserts {\em copies} into it of the objects found in the original.
-
-\end{itemize}
-
-Both functions have the same restrictions and use the same protocols
-as \code{pickle} --- user-defined classes can control how they are
-copied by providing methods named \code{__getinitargs__()},
-\code{__getstate__()} and \code{__setstate__()}.
-
+\begin{verbatim}
+        def make_incrementor(n):
+                return lambda x, incr=n: x+incr
+\end{verbatim}
 
 \section{Documentation Strings}
 
-A variety of objects now have a new attribute, \code{__doc__}, which
-is supposed to contain a documentation string (if no documentation is
-present, the attribute is \code{None}).  New syntax, compatible with
-the old interpreter, allows for convenient initialization of the
-\code{__doc__} attribute of modules, classes and functions by placing
-a string literal by itself as the first statement in the suite.  It
-must be a literal --- an expression yielding a string object is not
-accepted as a documentation string, since future tools may need to
-derive documentation from source by parsing.
-
-Here is a hypothetical, amply documented module called \code{Spam}:
-
-\begin{verbatim}
-"""Spam operations.
-
-This module exports two classes, a function and an exception:
-
-class Spam: full Spam functionality --- three can sizes
-class SpamLight: limited Spam functionality --- only one can size
-
-def open(filename): open a file and return a corresponding Spam or
-SpamLight object
-
-GoneOff: exception raised for errors; should never happen
-
-Note that it is always possible to convert a SpamLight object to a
-Spam object by a simple method call, but that the reverse operation is
-generally costly and may fail for a number of reasons.
-"""
-
-class SpamLight:
-    """Limited spam functionality.
-
-    Supports a single can size, no flavor, and only hard disks.
-    """
-
-    def __init__(self, size=12):
-        """Construct a new SpamLight instance.
-
-        Argument is the can size.
-        """
-        # etc.
-
-    # etc.
-
-class Spam(SpamLight):
-    """Full spam functionality.
-
-    Supports three can sizes, two flavor varieties, and all floppy
-    disk formats still supported by current hardware.
-    """
-
-    def __init__(self, size1=8, size2=12, size3=20):
-        """Construct a new Spam instance.
-
-        Arguments are up to three can sizes.
-        """
-        # etc.
-
-    # etc.
-
-def open(filename = "/dev/null"):
-    """Open a can of Spam.
-
-    Argument must be an existing file.
-    """
-    # etc.
-
-class GoneOff:
-    """Class used for Spam exceptions.
-
-    There shouldn't be any.
-    """
-    pass
-\end{verbatim}
-
-After executing ``\code{import Spam}'', the following expressions
-return the various documentation strings from the module:
-
-\begin{verbatim}
-Spam.__doc__
-Spam.SpamLight.__doc__
-Spam.SpamLight.__init__.__doc__
-Spam.Spam.__doc__
-Spam.Spam.__init__.__doc__
-Spam.open.__doc__
-Spam.GoneOff.__doc__
-\end{verbatim}
+XXX Where to put this?  Or just leave it out?
 
 There are emerging conventions about the content and formatting of
 documentation strings.
@@ -3484,755 +3378,97 @@
 whitespace should be stripped.  Equivalence of whitespace should be
 tested after expansion of tabs (to 8 spaces, normally).
 
-In this release, few of the built-in or standard functions and modules
-have documentation strings.
 
+\appendix\chapter{Interactive Input Editing and History Substitution}
 
-\section{Customizing Import and Built-Ins}
+Some versions of the Python interpreter support editing of the current
+input line and history substitution, similar to facilities found in
+the Korn shell and the GNU Bash shell.  This is implemented using the
+{\em GNU\ Readline} library, which supports Emacs-style and vi-style
+editing.  This library has its own documentation which I won't
+duplicate here; however, the basics are easily explained.
 
-In preparation for a ``restricted execution mode'' which will be
-usable to run code received from an untrusted source (such as a WWW
-server or client), the mechanism by which modules are imported has
-been redesigned.  It is now possible to provide your own function
-\code{__import__} which is called whenever an \code{import} statement
-is executed.  There's a built-in function \code{__import__} which
-provides the default implementation, but more interesting, the various
-steps it takes are available separately from the new built-in module
-\code{imp}.  (See the section on \code{imp} in the Library Reference
-Manual for more information on this module --- it also contains a
-complete example of how to write your own \code{__import__} function.)
+\subsection{Line Editing}
 
-When you do \code{dir()} in a fresh interactive interpreter you will
-see another ``secret'' object that's present in every module:
-\code{__builtins__}.  This is either a dictionary or a module
-containing the set of built-in objects used by functions defined in
-current module.  Although normally all modules are initialized with a
-reference to the same dictionary, it is now possible to use a
-different set of built-ins on a per-module basis.  Together with the
-fact that the \code{import} statement uses the \code{__import__}
-function it finds in the importing modules' dictionary of built-ins,
-this forms the basis for a future restricted execution mode.
+If supported, input line editing is active whenever the interpreter
+prints a primary or secondary prompt.  The current line can be edited
+using the conventional Emacs control characters.  The most important
+of these are: C-A (Control-A) moves the cursor to the beginning of the
+line, C-E to the end, C-B moves it one position to the left, C-F to
+the right.  Backspace erases the character to the left of the cursor,
+C-D the character to its right.  C-K kills (erases) the rest of the
+line to the right of the cursor, C-Y yanks back the last killed
+string.  C-underscore undoes the last change you made; it can be
+repeated for cumulative effect.
 
+\subsection{History Substitution}
 
-\section{Python and the World-Wide Web}
+History substitution works as follows.  All non-empty input lines
+issued are saved in a history buffer, and when a new prompt is given
+you are positioned on a new line at the bottom of this buffer.  C-P
+moves one line up (back) in the history buffer, C-N moves one down.
+Any line in the history buffer can be edited; an asterisk appears in
+front of the prompt to mark a line as modified.  Pressing the Return
+key passes the current line to the interpreter.  C-R starts an
+incremental reverse search; C-S starts a forward search.
 
-There is a growing number of modules available for writing WWW tools.
-The previous release already sported modules \code{gopherlib},
-\code{ftplib}, \code{httplib} and \code{urllib} (which unifies the
-other three) for accessing data through the commonest WWW protocols.
-This release also provides \code{cgi}, to ease the writing of
-server-side scripts that use the Common Gateway Interface protocol,
-supported by most WWW servers.  The module \code{urlparse} provides
-precise parsing of a URL string into its components (address scheme,
-network location, path, parameters, query, and fragment identifier).
+\subsection{Key Bindings}
 
-A rudimentary, parser for HTML files is available in the module
-\code{htmllib}.  It currently supports a subset of HTML 1.0 (if you
-bring it up to date, I'd love to receive your fixes!).  Unfortunately
-Python seems to be too slow for real-time parsing and formatting of
-HTML such as required by interactive WWW browsers --- but it's good
-enough to write a ``robot'' (an automated WWW browser that searches
-the web for information).
+The key bindings and some other parameters of the Readline library can
+be customized by placing commands in an initialization file called
+{\tt \$HOME/.inputrc}.  Key bindings have the form
 
+\bcode\begin{verbatim}
+key-name: function-name
+\end{verbatim}\ecode
+%
+or
 
-\section{Miscellaneous}
+\bcode\begin{verbatim}
+"string": function-name
+\end{verbatim}\ecode
+%
+and options can be set with
 
-\begin{itemize}
+\bcode\begin{verbatim}
+set option-name value
+\end{verbatim}\ecode
+%
+For example:
 
-\item
-The \code{socket} module now exports all the needed constants used for
-socket operations, such as \code{SO_BROADCAST}.
+\bcode\begin{verbatim}
+# I prefer vi-style editing:
+set editing-mode vi
+# Edit using a single line:
+set horizontal-scroll-mode On
+# Rebind some keys:
+Meta-h: backward-kill-word
+"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+\end{verbatim}\ecode
+%
+Note that the default binding for TAB in Python is to insert a TAB
+instead of Readline's default filename completion function.  If you
+insist, you can override this by putting
 
-\item
-The functions \code{popen()} and \code{fdopen()} in the \code{os}
-module now follow the pattern of the built-in function \code{open()}:
-the default mode argument is \code{'r'} and the optional third
-argument specifies the buffer size, where \code{0} means unbuffered,
-\code{1} means line-buffered, and any larger number means the size of
-the buffer in bytes.
+\bcode\begin{verbatim}
+TAB: complete
+\end{verbatim}\ecode
+%
+in your {\tt \$HOME/.inputrc}.  (Of course, this makes it hard to type
+indented continuation lines...)
 
-\end{itemize}
+\subsection{Commentary}
 
+This facility is an enormous step forward compared to previous
+versions of the interpreter; however, some wishes are left: It would
+be nice if the proper indentation were suggested on continuation lines
+(the parser knows if an indent token is required next).  The
+completion mechanism might use the interpreter's symbol table.  A
+command to check (or even suggest) matching parentheses, quotes etc.
+would also be useful.
 
-\chapter{New in Release 1.3}
-
-
-This chapter describes yet more recent additions to the Python
-language and library.
-
-
-\section{Keyword Arguments}
-
-Functions and methods written in Python can now be called using
-keyword arguments of the form \code{\var{keyword} = \var{value}}.  For
-instance, the following function:
-
-\begin{verbatim}
-def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
-    print "-- This parrot wouldn't", action,
-    print "if you put", voltage, "Volts through it."
-    print "-- Lovely plumage, the", type
-    print "-- It's", state, "!"
-\end{verbatim}
-
-could be called in any of the following ways:
-
-\begin{verbatim}
-parrot(1000)
-parrot(action = 'VOOOOOM', voltage = 1000000)
-parrot('a thousand', state = 'pushing up the daisies')
-parrot('a million', 'bereft of life', 'jump')
-\end{verbatim}
-
-but the following calls would all be invalid:
-
-\begin{verbatim}
-parrot()                     # required argument missing
-parrot(voltage=5.0, 'dead')  # non-keyword argument following keyword
-parrot(110, voltage=220)     # duplicate value for argument
-parrot(actor='John Cleese')  # unknown keyword
-\end{verbatim}
-
-In general, an argument list must have the form: zero or more
-positional arguments followed by zero or more keyword arguments, where
-the keywords must be chosen from the formal parameter names.  It's not
-important whether a formal parameter has a default value or not.  No
-argument must receive a value more than once --- formal parameter names
-corresponding to positional arguments cannot be used as keywords in
-the same calls.
-
-Note that no special syntax is required to allow a function to be
-called with keyword arguments.  The additional costs incurred by
-keyword arguments are only present when a call uses them.
-
-(As far as I know, these rules are exactly the same as used by
-Modula-3, even if they are enforced by totally different means.  This
-is intentional.)
-
-When a final formal parameter of the form \code{**\var{name}} is
-present, it receives a dictionary containing all keyword arguments
-whose keyword doesn't correspond to a formal parameter.  This may be
-combined with a formal parameter of the form \code{*\var{name}} which
-receives a tuple containing the positional arguments beyond the formal
-parameter list.  (\code{*\var{name}} must occur before
-\code{**\var{name}}.)  For example, if we define a function like this:
-
-\begin{verbatim}
-def cheeseshop(kind, *arguments, **keywords):
-    print "-- Do you have any", kind, '?'
-    print "-- I'm sorry, we're all out of", kind
-    for arg in arguments: print arg
-    print '-'*40
-    for kw in keywords.keys(): print kw, ':', keywords[kw]
-\end{verbatim}
-
-It could be called like this:
-
-\begin{verbatim}
-cheeseshop('Limburger', "It's very runny, sir.",
-           "It's really very, VERY runny, sir.",
-           client='John Cleese',
-           shopkeeper='Michael Palin',
-           sketch='Cheese Shop Sketch')
-\end{verbatim}
-
-and of course it would print:
-
-\begin{verbatim}
--- Do you have any Limburger ?
--- I'm sorry, we're all out of Limburger
-It's very runny, sir.
-It's really very, VERY runny, sir.
-----------------------------------------
-client : John Cleese
-shopkeeper : Michael Palin
-sketch : Cheese Shop Sketch
-\end{verbatim}
-
-Consequences of this change include:
-
-\begin{itemize}
-
-\item
-The built-in function \code{apply()} now has an optional third
-argument, which is a dictionary specifying any keyword arguments to be
-passed.  For example,
-\begin{verbatim}
-apply(parrot, (), {'voltage': 20, 'action': 'voomm'})
-\end{verbatim}
-is equivalent to
-\begin{verbatim}
-parrot(voltage=20, action='voomm')
-\end{verbatim}
-
-\item
-There is also a mechanism for functions and methods defined in an
-extension module (i.e., implemented in C or C++) to receive a
-dictionary of their keyword arguments.  By default, such functions do
-not accept keyword arguments, since the argument names are not
-available to the interpreter.
-
-\item
-In the effort of implementing keyword arguments, function and
-especially method calls have been sped up significantly --- for a
-method with ten formal parameters, the call overhead has been cut in
-half; for a function with one formal parameters, the overhead has been
-reduced by a third.
-
-\item
-The format of \code{.pyc} files has changed (again).
-
-\item
-The \code{access} statement has been disabled.  The syntax is still
-recognized but no code is generated for it.  (There were some
-unpleasant interactions with changes for keyword arguments, and my
-plan is to get rid of \code{access} altogether in favor of a different
-approach.)
-
-\end{itemize}
-
-\section{Changes to the WWW and Internet tools}
-
-\begin{itemize}
-
-\item
-The \code{htmllib} module has been rewritten in an incompatible
-fashion.  The new version is considerably more complete (HTML 2.0
-except forms, but including all ISO-8859-1 entity definitions), and
-easy to use.  Small changes to \code{sgmllib} have also been made, to
-better match the tokenization of HTML as recognized by other web
-tools.
-
-\item
-A new module \code{formatter} has been added, for use with the new
-\code{htmllib} module.
-
-\item
-The \code{urllib}and \code{httplib} modules have been changed somewhat
-to allow overriding unknown URL types and to support authentication.
-They now use \code{mimetools.Message} instead of \code{rfc822.Message}
-to parse headers.  The \code{endrequest()} method has been removed
-from the HTTP class since it breaks the interaction with some servers.
-
-\item
-The \code{rfc822.Message} class has been changed to allow a flag to be
-passed in that says that the file is unseekable.
-
-\item
-The \code{ftplib} module has been fixed to be (hopefully) more robust
-on Linux.
-
-\item
-Several new operations that are optionally supported by servers have
-been added to \code{nntplib}: \code{xover}, \code{xgtitle},
-\code{xpath} and \code{date}. % thanks to Kevan Heydon
-
-\end{itemize}
-
-\section{Other Language Changes}
-
-\begin{itemize}
-
-\item
-The \code{raise} statement now takes an optional argument which
-specifies the traceback to be used when printing the exception's stack
-trace.  This must be a traceback object, such as found in
-\code{sys.exc_traceback}.  When omitted or given as \code{None}, the
-old behavior (to generate a stack trace entry for the current stack
-frame) is used.
-
-\item
-The tokenizer is now more tolerant of alien whitespace.  Control-L in
-the leading whitespace of a line resets the column number to zero,
-while Control-R just before the end of the line is ignored.
-
-\end{itemize}
-
-\section{Changes to Built-in Operations}
-
-\begin{itemize}
-
-\item
-For file objects, \code{\var{f}.read(0)} and
-\code{\var{f}.readline(0)} now return an empty string rather than
-reading an unlimited number of bytes.  For the latter, omit the
-argument altogether or pass a negative value.
-
-\item
-A new system variable, \code{sys.platform}, has been added.  It
-specifies the current platform, e.g. \code{sunos5} or \code{linux1}.
-
-\item
-The built-in functions \code{input()} and \code{raw_input()} now use
-the GNU readline library when it has been configured (formerly, only
-interactive input to the interpreter itself was read using GNU
-readline).  The GNU readline library provides elaborate line editing
-and history.  The Python debugger (\code{pdb}) is the first
-beneficiary of this change.
-
-\item
-Two new built-in functions, \code{globals()} and \code{locals()},
-provide access to dictionaries containming current global and local
-variables, respectively.  (These augment rather than replace
-\code{vars()}, which returns the current local variables when called
-without an argument, and a module's global variables when called with
-an argument of type module.)
-
-\item
-The built-in function \code{compile()} now takes a third possible
-value for the kind of code to be compiled: specifying \code{'single'}
-generates code for a single interactive statement, which prints the
-output of expression statements that evaluate to something else than
-\code{None}.
-
-\end{itemize}
-
-\section{Library Changes}
-
-\begin{itemize}
-
-\item
-There are new module \code{ni} and \code{ihooks} that support
-importing modules with hierarchical names such as \code{A.B.C}.  This
-is enabled by writing \code{import ni; ni.ni()} at the very top of the
-main program.  These modules are amply documented in the Python
-source.
-
-\item
-The module \code{rexec} has been rewritten (incompatibly) to define a
-class and to use \code{ihooks}.
-
-\item
-The \code{string.split()} and \code{string.splitfields()} functions
-are now the same function (the presence or absence of the second
-argument determines which operation is invoked); similar for
-\code{string.join()} and \code{string.joinfields()}.
-
-\item
-The \code{Tkinter} module and its helper \code{Dialog} have been
-revamped to use keyword arguments.  Tk 4.0 is now the standard.  A new
-module \code{FileDialog} has been added which implements standard file
-selection dialogs.
-
-\item
-The optional built-in modules \code{dbm} and \code{gdbm} are more
-coordinated --- their \code{open()} functions now take the same values
-for their \var{flag} argument, and the \var{flag} and \var{mode}
-argument have default values (to open the database for reading only,
-and to create the database with mode \code{0666} minuse the umask,
-respectively).  The memory leaks have finally been fixed.
-
-\item
-A new dbm-like module, \code{bsddb}, has been added, which uses the
-BSD DB package's hash method. % thanks to David Ely
-
-\item
-A portable (though slow) dbm-clone, implemented in Python, has been
-added for systems where none of the above is provided.  It is aptly
-dubbed \code{dumbdbm}.
-
-\item
-The module \code{anydbm} provides a unified interface to \code{bsddb},
-\code{gdbm}, \code{dbm}, and \code{dumbdbm}, choosing the first one
-available.
-
-\item
-A new extension module, \code{binascii}, provides a variety of
-operations for conversion of text-encoded binary data.
-
-\item
-There are three new or rewritten companion modules implemented in
-Python that can encode and decode the most common such formats:
-\code{uu} (uuencode), \code{base64} and \code{binhex}.
-
-\item
-A module to handle the MIME encoding quoted-printable has also been
-added: \code{quopri}.
-
-\item
-The parser module (which provides an interface to the Python parser's
-abstract syntax trees) has been rewritten (incompatibly) by Fred
-Drake.  It now lets you change the parse tree and compile the result!
-
-\item
-The \code{syslog} module has been upgraded and documented.
-% thanks to Steve Clift
-
-\end{itemize}
-
-\section{Other Changes}
-
-\begin{itemize}
-
-\item
-The dynamic module loader recognizes the fact that different filenames
-point to the same shared library and loads the library only once, so
-you can have a single shared library that defines multiple modules.
-(SunOS / SVR4 style shared libraries only.)
-
-\item
-Jim Fulton's ``abstract object interface'' has been incorporated into
-the run-time API.  For more detailes, read the files
-\code{Include/abstract.h} and \code{Objects/abstract.c}.
-
-\item
-The Macintosh version is much more robust now.
-
-\item
-Numerous things I have forgotten or that are so obscure no-one will
-notice them anyway :-)
-
-\end{itemize}
-
-
-\chapter{New in Release 1.4}
-
-
-This chapter describes the major additions to the Python language and 
-library in version 1.4.  Many minor changes are not listed here;
-it is recommended to read the file \code{Misc/NEWS} in the Python 
-source distribution for a complete listing of changes.  In particular,
-changes that only affect C programmers or the build and installation
-process are not described in this chapter (the new installation
-lay-out is explained below under \code{sys.prefix} though).
-
-\section{Language Changes}
-
-\begin{itemize}
-
-\item
-Power operator.  \code{x**y} is equivalent to \code{pow(x, y)}.
-This operator binds more tightly than \code{*}, \code{/} or \code{\%},
-and binds from right to left when repeated or combined with unary 
-operators.  For example, \code{x**y**z} is equivalent to 
-\code{x**(y**z)}, and \code{-x**y} is \code{-(x**y)}.
-
-\item
-Complex numbers.  Imaginary literals are writen with a \code{'j'}
-suffix (\code{'J'} is allowed as well.) Complex numbers with a nonzero
-real component are written as \code{(\var{real}+\var{imag}j)}.  You
-can also use the new built-in function \code{complex()} which takes
-one or two arguments: \code{complex(x)} is equivalent to \code{x +
-0j}, and \code{complex(x, y)} is \code{x + y*0j}.  For example,
-\code{1j**2} yields \code{complex(-1.0)} (which is another way of
-saying ``the real value 1.0 represented as a complex number.''
-
-Complex numbers are always represented as two floating point numbers,
-the real and imaginary part.
-To extract these parts from a complex number \code{z}, 
-use \code{z.real} and \code{z.imag}.  The conversion functions to 
-floating point and integer (\code{float()}, \code{int()} and 
-\code{long()}) don't work for complex numbers --- there is no one 
-correct way to convert a complex number to a real number.  Use 
-\code{abs(z)} to get its magnitude (as a float) or \code{z.real} to 
-get its real part.
-
-Module \code{cmath} provides versions of all math functions that take 
-complex arguments and return complex results.  (Module \code{math} 
-only supports real numbers, so that \code{math.sqrt(-1)} still raises 
-a \code{ValueError} exception.  Numerical experts agree that this is 
-the way it should be.)
-
-\item
-New indexing syntax.  It is now possible to use a tuple as an indexing
-expression for a mapping object without parenthesizing it,
-e.g. \code{x[1, 2, 3]} is equivalent to \code{x[(1, 2, 3)]}.
-
-\item
-New slicing syntax.  In support of the Numerical Python extension
-(distributed independently), slice indices of the form
-\code{x[lo:hi:stride]} are possible, multiple slice indices separated by
-commas are allowed, and an index position may be replaced by an ellipsis,
-as follows: \code{x[a, ..., z]}.  There's also a new built-in function
-\code{slice(lo, hi, stride)} and a new built-in object
-\code{Ellipsis}, which yield the same effect without using special
-syntax.  None of the standard sequence types support indexing with
-slice objects or ellipses yet.
-
-Note that when this new slicing syntax is used, the mapping interface
-will be used, not the sequence interface.  In particular, when a
-user-defined class instance is sliced using this new slicing syntax,
-its \code{__getitem__} method is invoked --- the
-\code{__getslice__} method is only invoked when a single old-style
-slice is used, i.e. \code{x[lo:hi]}, with possible omission of
-\code{lo} and/or \code{hi}.  Some examples:
-
-\begin{verbatim}
-x[0:10:2]        -> slice(0, 10, 2)
-x[:2:]           -> slice(None, 2, None)
-x[::-1]          -> slice(None, None, -1)
-x[::]            -> slice(None, None, None)
-x[1, 2:3]        -> (1, slice(2, 3, None))
-x[1:2, 3:4]      -> (slice(1, 2, None), slice(3, 4, None))
-x[1:2, ..., 3:4] -> (slice(1, 2, None), Ellipsis,
-                     slice(3, 4, None))
-\end{verbatim}
-
-For more help with this you are referred to the matrix-sig.
-
-\item
-The \code{access} statement is now truly gone; \code{access} is no 
-longer a reserved word.  This saves a few cycles here and there.
-
-\item
-Private variables through name mangling.
-There is now limited support for class-private
-identifiers.  Any identifier of the form \code{__spam} (at least two
-leading underscores, at most one trailing underscore) is now textually
-replaced with \code{_classname__spam}, where \code{classname} is the
-current class name with leading underscore(s) stripped.  This mangling
-is done without regard of the syntactic position of the identifier, so
-it can be used to define class-private instance and class variables,
-methods, as well as globals, and even to store instance variables
-private to this class on instances of {\em other} classes.  Truncation
-may occur when the mangled name would be longer than 255 characters.
-Outside classes, or when the class name consists of only underscores,
-no mangling occurs.
-
-Name mangling is intended to give classes an easy way to define
-``private'' instance variables and methods, without having to worry
-about instance variables defined by derived classes, or mucking with
-instance variables by code outside the class.  Note that the mangling
-rules are designed mostly to avoid accidents; it still is possible for
-a determined soul to access or modify a variable that is considered
-private.  This can even be useful, e.g. for the debugger, and that's
-one reason why this loophole is not closed.  (Buglet: derivation of a
-class with the same name as the base class makes use of private
-variables of the base class possible.)
-
-Notice that code passed to \code{exec}, \code{eval()} or
-\code{evalfile()} does not consider the classname of the invoking 
-class to be the current class; this is similar to the effect of the 
-\code{global} statement, the effect of which is likewise restricted to 
-code that is byte-compiled together.  The same restriction applies to
-\code{getattr()}, \code{setattr()} and \code{delattr()}, as well as
-when referencing \code{__dict__} directly.
-
-Here's an example of a class that implements its own
-\code{__getattr__} and \code{__setattr__} methods and stores all
-attributes in a private variable, in a way that works in Python 1.4 as
-well as in previous versions:
-
-\begin{verbatim}
-class VirtualAttributes:
-    __vdict = None
-    __vdict_name = locals().keys()[0]
-     
-    def __init__(self):
-        self.__dict__[self.__vdict_name] = {}
-    
-    def __getattr__(self, name):
-        return self.__vdict[name]
-    
-    def __setattr__(self, name, value):
-        self.__vdict[name] = value
-\end{verbatim}
-
-{\em Warning: this is an experimental feature.}  To avoid all
-potential problems, refrain from using identifiers starting with
-double underscore except for predefined uses like \code{__init__}.  To
-use private names while maintaining future compatibility: refrain from
-using the same private name in classes related via subclassing; avoid
-explicit (manual) mangling/unmangling; and assume that at some point
-in the future, leading double underscore will revert to being just a
-naming convention.  Discussion on extensive compile-time declarations
-are currently underway, and it is impossible to predict what solution
-will eventually be chosen for private names.  Double leading
-underscore is still a candidate, of course --- just not the only one.
-It is placed in the distribution in the belief that it is useful, and
-so that widespread experience with its use can be gained.  It will not
-be removed without providing a better solution and a migration path.
-
-\end{itemize}
-
-\section{Run-time Changes}
-
-\begin{itemize}
-
-\item
-New built-in function \code{list()} converts any sequence to a new list.
-Note that when the argument is a list, the return value is a fresh 
-copy, similar to what would be returned by \code{a[:]}.
-
-\item
-Improved syntax error message.  Syntax errors detected by the code
-generation phase of the Python bytecode compiler now include a line
-number.  The line number is appended in parentheses.  It is suppressed
-if the error occurs in line 1 (this usually happens in interactive
-use).
-
-\item
-Different exception raised.
-Unrecognized keyword arguments now raise a \code{TypeError} exception 
-rather than \code{KeyError}.
-
-\item
-Exceptions in \code{__del__} methods.  When a \code{__del__} method
-raises an exception, a warning is written to \code{sys.stderr} and the
-exception is ignored.  Formerly, such exceptions were ignored without
-warning.  (Propagating the exception is not an option since it it is
-invoked from an object finalizer, which cannot return any kind of
-status or error.)  (Buglet: The new behavior, while needed in order to
-debug failing \code{__del__} methods, is occasionally annoying,
-because if affects the program's standard error stream.  It honors
-assignments to \code{sys.stderr}, so it can be redirected from within
-a program if desired.)
-
-\item
-You can now discover from which file (if any) a module was loaded by 
-inspecting its \code{__file__} attribute.  This attribute is not 
-present for built-in or frozen modules.  It points to the shared 
-library file for dynamically loaded modules.  (Buglet: this may be a 
-relative path and is stored in the \code{.pyc} file on compilation.  
-If you manipulate the current directory with \code{os.chdir()} or move 
-\code{.pyc} files around, the value may be incorrect.)
-
-\end{itemize}
-
-\section{New or Updated Modules}
-
-\begin{itemize}
-
-\item
-New built-in module \code{operator}.  While undocumented, the concept
-is real simply: \code{operator.__add__(x, y)} does exactly the same
-thing as \code{x+y} (for all types --- built-in, user-defined,
-extension-defined).  As a convenience, \code{operator.add} does the
-same thing, but beware --- you can't use \code{operator.and} and a few
-others where the ``natural'' name for an operator is a reserved
-keyword.  You can add a single trailing underscore in such cases.
-
-\item
-New built-in module \code{errno}.  See the Library Reference Manual.
-
-\item
-Rewritten \code{cgi} module.  See the Library Reference Manual.
-
-\item
-Improved restricted execution module (\code{rexec}).  New module 
-\code{Bastion}.  Both are now documented in a new chapter on
-restricted execution in the Library Reference Manual.
-
-\item
-New string operations (all described in the Library Reference Manual):
-\code{lstrip()}, \code{rstrip()} (strip only the left/right
-whitespace), \code{capitalize()} (uppercase the first character,
-lowercase the rest), \code{capwords()} (capitalize each word,
-delimited a la \code{string.split()}), \code{translate()} (string
-transliteration -- this existed before but can now also delete
-characters by specifying a third argument), \code{maketrans()} (a
-convenience function for creating translation tables for
-\code{translate()} and \code{regex.compile()}).  The string function
-\code{split()} has an optional third argument which specifies the
-maximum number of separators to split;
-e.g. \code{string.split('a=b=c', '=', 1)} yields \code{['a', 'b=c']}.
-(Note that for a long time, \code{split()} and \code{splitfields()}
-are synonyms.
-
-\item
-New regsub operations (see the Library Reference Manual):
-\code{regsub.capwords()} (like \code{string.capwords()} but allows you to
-specify the word delimiter as a regular expression),
-\code{regsub.splitx()} (like \code{regsub.split()} but returns the
-delimiters as well as the words in the resulting list).  The optional
-\code{maxsep} argument is also supported by \code{regsub.split()}.
-
-\item
-Module files \code{pdb.py} and \code{profile.py} can now be invoked as
-scripts to debug c.q. profile other scripts easily.  For example:
-\code{python /usr/local/lib/python1.4/profile.py myscript.py}
-
-\item
-The \code{os} module now supports the \code{putenv()} function on
-systems where it is provided in the C library (Windows NT and most
-Unix versions).  For example, \code{os.putenv('PATH',
-'/bin:/usr/bin')} sets the environment variable \code{PATH} to the
-string \code{'/bin:/usr/bin'}.  Such changes to the environment affect
-subprocesses started with \code{os.system()}, \code{os.popen()} or
-\code{os.fork()} and \code{os.execv()}.  When \code{putenv()} is
-supported, assignments to items in \code{os.environ} are automatically
-translated into corresponding calls to \code{os.putenv()}; however,
-calls to \code{os.putenv()} don't update \code{os.environ}, so it is
-actually preferable to assign to items of \code{os.environ}.  For this
-purpose, the type of \code{os.environ} is changed to a subclass of
-\code{UserDict.UserDict} when \code{os.putenv()} is supported.
-(Buglet: \code{os.execve()} still requires a real dictionary, so it
-won't accept \code{os.environ} as its third argument.  However, you
-can now use \code{os.execv()} and it will use your changes to
-\code{os.environ}!.)
-
-\item
-More new functions in the \code{os} module: \code{mkfifo},
-\code{plock}, \code{remove} (== \code{unlink}), and \code{ftruncate}.
-See the Unix manual (section 2, system calls) for these function.
-More functions are also available under NT.
-
-\item
-New functions in the fcntl module: \code{lockf()} and \code{flock()}
-(don't ask \code{:-)}).  See the Library Reference Manual.
-
-\item
-The first item of the module search path, \code{sys.path[0]}, is the 
-directory containing the script that was used to invoke the Python 
-interpreter.  If the script directory is not available (e.g.  if the 
-interpreter is invoked interactively or if the script is read from 
-standard input), \code{sys.path[0]} is the empty string, which directs 
-Python to search modules in the current directory first.  Notice that 
-the script directory is inserted {\em before} the entries inserted as 
-a result of \code{\$PYTHONPATH}.  There is no longer an entry for the 
-current directory later in the path (unless explicitly set in 
-\code{\$PYTHONPATH} or overridden at build time).
-
-\end{itemize}
-
-\section{Configuration and Installation}
-
-\begin{itemize}
-
-\item
-More configuration information is now available to Python programs.
-The variable \code{sys.prefix} gives the site-specific directory
-prefix where the platform independent Python files are installed; by
-default, this is the string \code{"/usr/local"}.  This can be set at
-build time with the \code{--prefix} argument to the \code{configure}
-script.  The main collection of Python library modules is installed in
-the directory \code{sys.prefix+"/lib/python1.4"} while the platform
-independent header files (all except \code{config.h}) are stored in
-\code{sys.prefix+"/include/python1.4"}.
-
-Similarly, the variable \code{sys.exec_prefix} gives the site-specific
-directory prefix where the platform {\em de}pendent Python files are
-installed; by default, this is also \code{"/usr/local"}.  This can be
-set at build time with the \code{--exec-prefix} argument to the
-\code{configure} script.  Specifically, all configuration files
-(e.g. the \code{config.h} header file) are installed in the directory
-\code{sys.exec_prefix+"/lib/python1.4/config"}, and shared library
-modules are installed in
-\code{sys.exec_prefix+"/lib/python1.4/sharedmodules"}.
-
-Include files are at \code{sys.prefix+"/include/python1.4"}.
-
-It is not yet decided what the most portable way is to come up with
-the version number used in these pathnames.  For compatibility with
-the 1.4beta releases, sys.version[:3] can be used.
-
-On non-Unix systems, these variables are meaningless.
-
-\item
-While sites are strongly discouraged from modifying the standard
-Python library (like adding site-specific modules or functions), there
-is now a standard way to invoke site-specific features.  The standard
-module \code{site}, when imported, appends two site-specific
-directories to the end of \code{sys.path}:
-\code{\$prefix/lib/site-python} and
-\code{\$exec_prefix/lib/site-python}, where \code{\$prefix} and
-\code{\$exec_prefix} are the directories \code{sys.prefix} and
-\code{sys.exec_prefix} mentioned above.
-
-After this path manipulation has been performed, an attempt is made to
-import the module \code{sitecustomize}.  Any \code{ImportError}
-exception raised by this attempt is silently ignored.
-
-\end{itemize}
+XXX Lele Gaifax's readline module, which adds name completion...
 
 \end{document}
+
