Move the 3k reST doc tree in place.
diff --git a/Doc/whatsnew/2.0.rst b/Doc/whatsnew/2.0.rst
new file mode 100644
index 0000000..302986c
--- /dev/null
+++ b/Doc/whatsnew/2.0.rst
@@ -0,0 +1,1207 @@
+****************************
+  What's New in Python 2.0  
+****************************
+
+:Author: A.M. Kuchling and Moshe Zadka
+
+.. |release| replace:: 1.02
+
+.. % $Id: whatsnew20.tex 51211 2006-08-11 14:57:12Z thomas.wouters $
+
+
+Introduction
+============
+
+A new release of Python, version 2.0, was released on October 16, 2000. This
+article covers the exciting new features in 2.0, highlights some other useful
+changes, and points out a few incompatible changes that may require rewriting
+code.
+
+Python's development never completely stops between releases, and a steady flow
+of bug fixes and improvements are always being submitted. A host of minor fixes,
+a few optimizations, additional docstrings, and better error messages went into
+2.0; to list them all would be impossible, but they're certainly significant.
+Consult the publicly-available CVS logs if you want to see the full list.  This
+progress is due to the five developers working for  PythonLabs are now getting
+paid to spend their days fixing bugs, and also due to the improved communication
+resulting  from moving to SourceForge.
+
+.. % ======================================================================
+
+
+What About Python 1.6?
+======================
+
+Python 1.6 can be thought of as the Contractual Obligations Python release.
+After the core development team left CNRI in May 2000, CNRI requested that a 1.6
+release be created, containing all the work on Python that had been performed at
+CNRI.  Python 1.6 therefore represents the state of the CVS tree as of May 2000,
+with the most significant new feature being Unicode support.  Development
+continued after May, of course, so the 1.6 tree received a few fixes to ensure
+that it's forward-compatible with Python 2.0.  1.6 is therefore part of Python's
+evolution, and not a side branch.
+
+So, should you take much interest in Python 1.6?  Probably not.  The 1.6final
+and 2.0beta1 releases were made on the same day (September 5, 2000), the plan
+being to finalize Python 2.0 within a month or so.  If you have applications to
+maintain, there seems little point in breaking things by moving to 1.6, fixing
+them, and then having another round of breakage within a month by moving to 2.0;
+you're better off just going straight to 2.0.  Most of the really interesting
+features described in this document are only in 2.0, because a lot of work was
+done between May and September.
+
+.. % ======================================================================
+
+
+New Development Process
+=======================
+
+The most important change in Python 2.0 may not be to the code at all, but to
+how Python is developed: in May 2000 the Python developers began using the tools
+made available by SourceForge for storing  source code, tracking bug reports,
+and managing the queue of patch submissions.  To report bugs or submit patches
+for Python 2.0, use the bug tracking and patch manager tools available from
+Python's project page, located at http://sourceforge.net/projects/python/.
+
+The most important of the services now hosted at SourceForge is the Python CVS
+tree, the version-controlled repository containing the source code for Python.
+Previously, there were roughly 7 or so people who had write access to the CVS
+tree, and all patches had to be inspected and checked in by one of the people on
+this short list. Obviously, this wasn't very scalable.  By moving the CVS tree
+to SourceForge, it became possible to grant write access to more people; as of
+September 2000 there were 27 people able to check in changes, a fourfold
+increase.  This makes possible large-scale changes that wouldn't be attempted if
+they'd have to be filtered through the small group of core developers.  For
+example, one day Peter Schneider-Kamp took it into his head to drop K&R C
+compatibility and convert the C source for Python to ANSI C. After getting
+approval on the python-dev mailing list, he launched into a flurry of checkins
+that lasted about a week, other developers joined in to help, and the job was
+done.  If there were only 5 people with write access, probably that task would
+have been viewed as "nice, but not worth the time and effort needed" and it
+would never have gotten done.
+
+The shift to using SourceForge's services has resulted in a remarkable increase
+in the speed of development.  Patches now get submitted, commented on, revised
+by people other than the original submitter, and bounced back and forth between
+people until the patch is deemed worth checking in.  Bugs are tracked in one
+central location and can be assigned to a specific person for fixing, and we can
+count the number of open bugs to measure progress.  This didn't come without a
+cost: developers now have more e-mail to deal with, more mailing lists to
+follow, and special tools had to be written for the new environment. For
+example, SourceForge sends default patch and bug notification e-mail messages
+that are completely unhelpful, so Ka-Ping Yee wrote an HTML screen-scraper that
+sends more useful messages.
+
+The ease of adding code caused a few initial growing pains, such as code was
+checked in before it was ready or without getting clear agreement from the
+developer group.  The approval process that has emerged is somewhat similar to
+that used by the Apache group. Developers can vote +1, +0, -0, or -1 on a patch;
++1 and -1 denote acceptance or rejection, while +0 and -0 mean the developer is
+mostly indifferent to the change, though with a slight positive or negative
+slant.  The most significant change from the Apache model is that the voting is
+essentially advisory, letting Guido van Rossum, who has Benevolent Dictator For
+Life status, know what the general opinion is. He can still ignore the result of
+a vote, and approve or reject a change even if the community disagrees with him.
+
+Producing an actual patch is the last step in adding a new feature, and is
+usually easy compared to the earlier task of coming up with a good design.
+Discussions of new features can often explode into lengthy mailing list threads,
+making the discussion hard to follow, and no one can read every posting to
+python-dev.  Therefore, a relatively formal process has been set up to write
+Python Enhancement Proposals (PEPs), modelled on the Internet RFC process.  PEPs
+are draft documents that describe a proposed new feature, and are continually
+revised until the community reaches a consensus, either accepting or rejecting
+the proposal.  Quoting from the introduction to PEP 1, "PEP Purpose and
+Guidelines":
+
+
+.. epigraph::
+
+   PEP stands for Python Enhancement Proposal.  A PEP is a design document
+   providing information to the Python community, or describing a new feature for
+   Python.  The PEP should provide a concise technical specification of the feature
+   and a rationale for the feature.
+
+   We intend PEPs to be the primary mechanisms for proposing new features, for
+   collecting community input on an issue, and for documenting the design decisions
+   that have gone into Python.  The PEP author is responsible for building
+   consensus within the community and documenting dissenting opinions.
+
+Read the rest of PEP 1 for the details of the PEP editorial process, style, and
+format.  PEPs are kept in the Python CVS tree on SourceForge, though they're not
+part of the Python 2.0 distribution, and are also available in HTML form from
+http://www.python.org/peps/.  As of September 2000, there are 25 PEPS, ranging
+from PEP 201, "Lockstep Iteration", to PEP 225, "Elementwise/Objectwise
+Operators".
+
+.. % ======================================================================
+
+
+Unicode
+=======
+
+The largest new feature in Python 2.0 is a new fundamental data type: Unicode
+strings.  Unicode uses 16-bit numbers to represent characters instead of the
+8-bit number used by ASCII, meaning that 65,536 distinct characters can be
+supported.
+
+The final interface for Unicode support was arrived at through countless often-
+stormy discussions on the python-dev mailing list, and mostly implemented by
+Marc-André Lemburg, based on a Unicode string type implementation by Fredrik
+Lundh.  A detailed explanation of the interface was written up as :pep:`100`,
+"Python Unicode Integration". This article will simply cover the most
+significant points about the Unicode interfaces.
+
+In Python source code, Unicode strings are written as ``u"string"``.  Arbitrary
+Unicode characters can be written using a new escape sequence, ``\uHHHH``, where
+*HHHH* is a 4-digit hexadecimal number from 0000 to FFFF.  The existing
+``\xHHHH`` escape sequence can also be used, and octal escapes can be used for
+characters up to U+01FF, which is represented by ``\777``.
+
+Unicode strings, just like regular strings, are an immutable sequence type.
+They can be indexed and sliced, but not modified in place. Unicode strings have
+an ``encode( [encoding] )`` method that returns an 8-bit string in the desired
+encoding.  Encodings are named by strings, such as ``'ascii'``, ``'utf-8'``,
+``'iso-8859-1'``, or whatever.  A codec API is defined for implementing and
+registering new encodings that are then available throughout a Python program.
+If an encoding isn't specified, the default encoding is usually 7-bit ASCII,
+though it can be changed for your Python installation by calling the
+:func:`sys.setdefaultencoding(encoding)` function in a customised version of
+:file:`site.py`.
+
+Combining 8-bit and Unicode strings always coerces to Unicode, using the default
+ASCII encoding; the result of ``'a' + u'bc'`` is ``u'abc'``.
+
+New built-in functions have been added, and existing built-ins modified to
+support Unicode:
+
+* ``unichr(ch)`` returns a Unicode string 1 character long, containing the
+  character *ch*.
+
+* ``ord(u)``, where *u* is a 1-character regular or Unicode string, returns the
+  number of the character as an integer.
+
+* ``unicode(string [, encoding]  [, errors] )`` creates a Unicode string
+  from an 8-bit string.  ``encoding`` is a string naming the encoding to use. The
+  ``errors`` parameter specifies the treatment of characters that are invalid for
+  the current encoding; passing ``'strict'`` as the value causes an exception to
+  be raised on any encoding error, while ``'ignore'`` causes errors to be silently
+  ignored and ``'replace'`` uses U+FFFD, the official replacement character, in
+  case of any problems.
+
+* The :keyword:`exec` statement, and various built-ins such as ``eval()``,
+  ``getattr()``, and ``setattr()`` will also accept Unicode strings as well as
+  regular strings.  (It's possible that the process of fixing this missed some
+  built-ins; if you find a built-in function that accepts strings but doesn't
+  accept Unicode strings at all, please report it as a bug.)
+
+A new module, :mod:`unicodedata`, provides an interface to Unicode character
+properties.  For example, ``unicodedata.category(u'A')`` returns the 2-character
+string 'Lu', the 'L' denoting it's a letter, and 'u' meaning that it's
+uppercase. ``unicodedata.bidirectional(u'\u0660')`` returns 'AN', meaning that
+U+0660 is an Arabic number.
+
+The :mod:`codecs` module contains functions to look up existing encodings and
+register new ones.  Unless you want to implement a new encoding, you'll most
+often use the :func:`codecs.lookup(encoding)` function, which returns a
+4-element tuple: ``(encode_func, decode_func, stream_reader, stream_writer)``.
+
+* *encode_func* is a function that takes a Unicode string, and returns a 2-tuple
+  ``(string, length)``.  *string* is an 8-bit string containing a portion (perhaps
+  all) of the Unicode string converted into the given encoding, and *length* tells
+  you how much of the Unicode string was converted.
+
+* *decode_func* is the opposite of *encode_func*, taking an 8-bit string and
+  returning a 2-tuple ``(ustring, length)``, consisting of the resulting Unicode
+  string *ustring* and the integer *length* telling how much of the 8-bit string
+  was consumed.
+
+* *stream_reader* is a class that supports decoding input from a stream.
+  *stream_reader(file_obj)* returns an object that supports the :meth:`read`,
+  :meth:`readline`, and :meth:`readlines` methods.  These methods will all
+  translate from the given encoding and return Unicode strings.
+
+* *stream_writer*, similarly, is a class that supports encoding output to a
+  stream.  *stream_writer(file_obj)* returns an object that supports the
+  :meth:`write` and :meth:`writelines` methods.  These methods expect Unicode
+  strings, translating them to the given encoding on output.
+
+For example, the following code writes a Unicode string into a file,  encoding
+it as UTF-8::
+
+   import codecs
+
+   unistr = u'\u0660\u2000ab ...'
+
+   (UTF8_encode, UTF8_decode,
+    UTF8_streamreader, UTF8_streamwriter) = codecs.lookup('UTF-8')
+
+   output = UTF8_streamwriter( open( '/tmp/output', 'wb') )
+   output.write( unistr )
+   output.close()
+
+The following code would then read UTF-8 input from the file::
+
+   input = UTF8_streamreader( open( '/tmp/output', 'rb') )
+   print repr(input.read())
+   input.close()
+
+Unicode-aware regular expressions are available through the :mod:`re` module,
+which has a new underlying implementation called SRE written by Fredrik Lundh of
+Secret Labs AB.
+
+A ``-U`` command line option was added which causes the Python compiler to
+interpret all string literals as Unicode string literals. This is intended to be
+used in testing and future-proofing your Python code, since some future version
+of Python may drop support for 8-bit strings and provide only Unicode strings.
+
+.. % ======================================================================
+
+
+List Comprehensions
+===================
+
+Lists are a workhorse data type in Python, and many programs manipulate a list
+at some point.  Two common operations on lists are to loop over them, and either
+pick out the elements that meet a certain criterion, or apply some function to
+each element.  For example, given a list of strings, you might want to pull out
+all the strings containing a given substring, or strip off trailing whitespace
+from each line.
+
+The existing :func:`map` and :func:`filter` functions can be used for this
+purpose, but they require a function as one of their arguments.  This is fine if
+there's an existing built-in function that can be passed directly, but if there
+isn't, you have to create a little function to do the required work, and
+Python's scoping rules make the result ugly if the little function needs
+additional information.  Take the first example in the previous paragraph,
+finding all the strings in the list containing a given substring.  You could
+write the following to do it::
+
+   # Given the list L, make a list of all strings 
+   # containing the substring S.
+   sublist = filter( lambda s, substring=S: 
+                        string.find(s, substring) != -1,
+   	          L)
+
+Because of Python's scoping rules, a default argument is used so that the
+anonymous function created by the :keyword:`lambda` statement knows what
+substring is being searched for.  List comprehensions make this cleaner::
+
+   sublist = [ s for s in L if string.find(s, S) != -1 ]
+
+List comprehensions have the form::
+
+   [ expression for expr in sequence1 
+                for expr2 in sequence2 ...
+   	     for exprN in sequenceN
+                if condition ]
+
+The :keyword:`for`...\ :keyword:`in` clauses contain the sequences to be
+iterated over.  The sequences do not have to be the same length, because they
+are *not* iterated over in parallel, but from left to right; this is explained
+more clearly in the following paragraphs.  The elements of the generated list
+will be the successive values of *expression*.  The final :keyword:`if` clause
+is optional; if present, *expression* is only evaluated and added to the result
+if *condition* is true.
+
+To make the semantics very clear, a list comprehension is equivalent to the
+following Python code::
+
+   for expr1 in sequence1:
+       for expr2 in sequence2:
+       ...
+           for exprN in sequenceN:
+                if (condition):
+                     # Append the value of 
+                     # the expression to the 
+                     # resulting list.
+
+This means that when there are multiple :keyword:`for`...\ :keyword:`in`
+clauses, the resulting list will be equal to the product of the lengths of all
+the sequences.  If you have two lists of length 3, the output list is 9 elements
+long::
+
+   seq1 = 'abc'
+   seq2 = (1,2,3)
+   >>> [ (x,y) for x in seq1 for y in seq2]
+   [('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1),
+   ('c', 2), ('c', 3)]
+
+To avoid introducing an ambiguity into Python's grammar, if *expression* is
+creating a tuple, it must be surrounded with parentheses.  The first list
+comprehension below is a syntax error, while the second one is correct::
+
+   # Syntax error
+   [ x,y for x in seq1 for y in seq2]
+   # Correct
+   [ (x,y) for x in seq1 for y in seq2]
+
+The idea of list comprehensions originally comes from the functional programming
+language Haskell (http://www.haskell.org).  Greg Ewing argued most effectively
+for adding them to Python and wrote the initial list comprehension patch, which
+was then discussed for a seemingly endless time on the python-dev mailing list
+and kept up-to-date by Skip Montanaro.
+
+.. % ======================================================================
+
+
+Augmented Assignment
+====================
+
+Augmented assignment operators, another long-requested feature, have been added
+to Python 2.0.  Augmented assignment operators include ``+=``, ``-=``, ``*=``,
+and so forth.  For example, the statement ``a += 2`` increments the value of the
+variable  ``a`` by 2, equivalent to the slightly lengthier ``a = a + 2``.
+
+The full list of supported assignment operators is ``+=``, ``-=``, ``*=``,
+``/=``, ``%=``, ``**=``, ``&=``, ``|=``, ``^=``, ``>>=``, and ``<<=``.  Python
+classes can override the augmented assignment operators by defining methods
+named :meth:`__iadd__`, :meth:`__isub__`, etc.  For example, the following
+:class:`Number` class stores a number and supports using += to create a new
+instance with an incremented value.
+
+.. % The empty groups below prevent conversion to guillemets.
+
+::
+
+   class Number:
+       def __init__(self, value):
+           self.value = value
+       def __iadd__(self, increment):
+   	return Number( self.value + increment)
+
+   n = Number(5)
+   n += 3
+   print n.value
+
+The :meth:`__iadd__` special method is called with the value of the increment,
+and should return a new instance with an appropriately modified value; this
+return value is bound as the new value of the variable on the left-hand side.
+
+Augmented assignment operators were first introduced in the C programming
+language, and most C-derived languages, such as :program:`awk`, C++, Java, Perl,
+and PHP also support them.  The augmented assignment patch was implemented by
+Thomas Wouters.
+
+.. % ======================================================================
+
+
+String Methods
+==============
+
+Until now string-manipulation functionality was in the :mod:`string` module,
+which was usually a front-end for the :mod:`strop` module written in C.  The
+addition of Unicode posed a difficulty for the :mod:`strop` module, because the
+functions would all need to be rewritten in order to accept either 8-bit or
+Unicode strings.  For functions such as :func:`string.replace`, which takes 3
+string arguments, that means eight possible permutations, and correspondingly
+complicated code.
+
+Instead, Python 2.0 pushes the problem onto the string type, making string
+manipulation functionality available through methods on both 8-bit strings and
+Unicode strings.   ::
+
+   >>> 'andrew'.capitalize()
+   'Andrew'
+   >>> 'hostname'.replace('os', 'linux')
+   'hlinuxtname'
+   >>> 'moshe'.find('sh')
+   2
+
+One thing that hasn't changed, a noteworthy April Fools' joke notwithstanding,
+is that Python strings are immutable. Thus, the string methods return new
+strings, and do not modify the string on which they operate.
+
+The old :mod:`string` module is still around for backwards compatibility, but it
+mostly acts as a front-end to the new string methods.
+
+Two methods which have no parallel in pre-2.0 versions, although they did exist
+in JPython for quite some time, are :meth:`startswith` and :meth:`endswith`.
+``s.startswith(t)`` is equivalent to ``s[:len(t)] == t``, while
+``s.endswith(t)`` is equivalent to ``s[-len(t):] == t``.
+
+One other method which deserves special mention is :meth:`join`.  The
+:meth:`join` method of a string receives one parameter, a sequence of strings,
+and is equivalent to the :func:`string.join` function from the old :mod:`string`
+module, with the arguments reversed. In other words, ``s.join(seq)`` is
+equivalent to the old ``string.join(seq, s)``.
+
+.. % ======================================================================
+
+
+Garbage Collection of Cycles
+============================
+
+The C implementation of Python uses reference counting to implement garbage
+collection.  Every Python object maintains a count of the number of references
+pointing to itself, and adjusts the count as references are created or
+destroyed.  Once the reference count reaches zero, the object is no longer
+accessible, since you need to have a reference to an object to access it, and if
+the count is zero, no references exist any longer.
+
+Reference counting has some pleasant properties: it's easy to understand and
+implement, and the resulting implementation is portable, fairly fast, and reacts
+well with other libraries that implement their own memory handling schemes.  The
+major problem with reference counting is that it sometimes doesn't realise that
+objects are no longer accessible, resulting in a memory leak.  This happens when
+there are cycles of references.
+
+Consider the simplest possible cycle,  a class instance which has a reference to
+itself::
+
+   instance = SomeClass()
+   instance.myself = instance
+
+After the above two lines of code have been executed, the reference count of
+``instance`` is 2; one reference is from the variable named ``'instance'``, and
+the other is from the ``myself`` attribute of the instance.
+
+If the next line of code is ``del instance``, what happens?  The reference count
+of ``instance`` is decreased by 1, so it has a reference count of 1; the
+reference in the ``myself`` attribute still exists.  Yet the instance is no
+longer accessible through Python code, and it could be deleted.  Several objects
+can participate in a cycle if they have references to each other, causing all of
+the objects to be leaked.
+
+Python 2.0 fixes this problem by periodically executing a cycle detection
+algorithm which looks for inaccessible cycles and deletes the objects involved.
+A new :mod:`gc` module provides functions to perform a garbage collection,
+obtain debugging statistics, and tuning the collector's parameters.
+
+Running the cycle detection algorithm takes some time, and therefore will result
+in some additional overhead.  It is hoped that after we've gotten experience
+with the cycle collection from using 2.0, Python 2.1 will be able to minimize
+the overhead with careful tuning.  It's not yet obvious how much performance is
+lost, because benchmarking this is tricky and depends crucially on how often the
+program creates and destroys objects.  The detection of cycles can be disabled
+when Python is compiled, if you can't afford even a tiny speed penalty or
+suspect that the cycle collection is buggy, by specifying the
+:option:`--without-cycle-gc` switch when running the :program:`configure`
+script.
+
+Several people tackled this problem and contributed to a solution.  An early
+implementation of the cycle detection approach was written by Toby Kelsey.  The
+current algorithm was suggested by Eric Tiedemann during a visit to CNRI, and
+Guido van Rossum and Neil Schemenauer wrote two different implementations, which
+were later integrated by Neil.  Lots of other people offered suggestions along
+the way; the March 2000 archives of the python-dev mailing list contain most of
+the relevant discussion, especially in the threads titled "Reference cycle
+collection for Python" and "Finalization again".
+
+.. % ======================================================================
+
+
+Other Core Changes
+==================
+
+Various minor changes have been made to Python's syntax and built-in functions.
+None of the changes are very far-reaching, but they're handy conveniences.
+
+
+Minor Language Changes
+----------------------
+
+A new syntax makes it more convenient to call a given function with a tuple of
+arguments and/or a dictionary of keyword arguments. In Python 1.5 and earlier,
+you'd use the :func:`apply` built-in function: ``apply(f, args, kw)`` calls the
+function :func:`f` with the argument tuple *args* and the keyword arguments in
+the dictionary *kw*.  :func:`apply`  is the same in 2.0, but thanks to a patch
+from Greg Ewing, ``f(*args, **kw)`` as a shorter and clearer way to achieve the
+same effect.  This syntax is symmetrical with the syntax for defining
+functions::
+
+   def f(*args, **kw):
+       # args is a tuple of positional args,
+       # kw is a dictionary of keyword args
+       ...
+
+The :keyword:`print` statement can now have its output directed to a file-like
+object by following the :keyword:`print` with  ``>> file``, similar to the
+redirection operator in Unix shells. Previously you'd either have to use the
+:meth:`write` method of the file-like object, which lacks the convenience and
+simplicity of :keyword:`print`, or you could assign a new value to
+``sys.stdout`` and then restore the old value.  For sending output to standard
+error, it's much easier to write this::
+
+   print >> sys.stderr, "Warning: action field not supplied"
+
+Modules can now be renamed on importing them, using the syntax ``import module
+as name`` or ``from module import name as othername``.  The patch was submitted
+by Thomas Wouters.
+
+A new format style is available when using the ``%`` operator; '%r' will insert
+the :func:`repr` of its argument.  This was also added from symmetry
+considerations, this time for symmetry with the existing '%s' format style,
+which inserts the :func:`str` of its argument.  For example, ``'%r %s' % ('abc',
+'abc')`` returns a string containing ``'abc' abc``.
+
+Previously there was no way to implement a class that overrode Python's built-in
+:keyword:`in` operator and implemented a custom version.  ``obj in seq`` returns
+true if *obj* is present in the sequence *seq*; Python computes this by simply
+trying every index of the sequence until either *obj* is found or an
+:exc:`IndexError` is encountered.  Moshe Zadka contributed a patch which adds a
+:meth:`__contains__` magic method for providing a custom implementation for
+:keyword:`in`. Additionally, new built-in objects written in C can define what
+:keyword:`in` means for them via a new slot in the sequence protocol.
+
+Earlier versions of Python used a recursive algorithm for deleting objects.
+Deeply nested data structures could cause the interpreter to fill up the C stack
+and crash; Christian Tismer rewrote the deletion logic to fix this problem.  On
+a related note, comparing recursive objects recursed infinitely and crashed;
+Jeremy Hylton rewrote the code to no longer crash, producing a useful result
+instead.  For example, after this code::
+
+   a = []
+   b = []
+   a.append(a)
+   b.append(b)
+
+The comparison ``a==b`` returns true, because the two recursive data structures
+are isomorphic. See the thread "trashcan and PR#7" in the April 2000 archives of
+the python-dev mailing list for the discussion leading up to this
+implementation, and some useful relevant links.    Note that comparisons can now
+also raise exceptions. In earlier versions of Python, a comparison operation
+such as ``cmp(a,b)`` would always produce an answer, even if a user-defined
+:meth:`__cmp__` method encountered an error, since the resulting exception would
+simply be silently swallowed.
+
+.. % Starting URL:
+.. % http://www.python.org/pipermail/python-dev/2000-April/004834.html
+
+Work has been done on porting Python to 64-bit Windows on the Itanium processor,
+mostly by Trent Mick of ActiveState.  (Confusingly, ``sys.platform`` is still
+``'win32'`` on Win64 because it seems that for ease of porting, MS Visual C++
+treats code as 32 bit on Itanium.) PythonWin also supports Windows CE; see the
+Python CE page at http://starship.python.net/crew/mhammond/ce/ for more
+information.
+
+Another new platform is Darwin/MacOS X; initial support for it is in Python 2.0.
+Dynamic loading works, if you specify "configure --with-dyld --with-suffix=.x".
+Consult the README in the Python source distribution for more instructions.
+
+An attempt has been made to alleviate one of Python's warts, the often-confusing
+:exc:`NameError` exception when code refers to a local variable before the
+variable has been assigned a value.  For example, the following code raises an
+exception on the :keyword:`print` statement in both 1.5.2 and 2.0; in 1.5.2 a
+:exc:`NameError` exception is raised, while 2.0 raises a new
+:exc:`UnboundLocalError` exception. :exc:`UnboundLocalError` is a subclass of
+:exc:`NameError`, so any existing code that expects :exc:`NameError` to be
+raised should still work. ::
+
+   def f():
+       print "i=",i
+       i = i + 1 
+   f()
+
+Two new exceptions, :exc:`TabError` and :exc:`IndentationError`, have been
+introduced.  They're both subclasses of :exc:`SyntaxError`, and are raised when
+Python code is found to be improperly indented.
+
+
+Changes to Built-in Functions
+-----------------------------
+
+A new built-in, :func:`zip(seq1, seq2, ...)`, has been added.  :func:`zip`
+returns a list of tuples where each tuple contains the i-th element from each of
+the argument sequences.  The difference between :func:`zip` and ``map(None,
+seq1, seq2)`` is that :func:`map` pads the sequences with ``None`` if the
+sequences aren't all of the same length, while :func:`zip` truncates the
+returned list to the length of the shortest argument sequence.
+
+The :func:`int` and :func:`long` functions now accept an optional "base"
+parameter when the first argument is a string. ``int('123', 10)`` returns 123,
+while ``int('123', 16)`` returns 291.  ``int(123, 16)`` raises a
+:exc:`TypeError` exception with the message "can't convert non-string with
+explicit base".
+
+A new variable holding more detailed version information has been added to the
+:mod:`sys` module.  ``sys.version_info`` is a tuple ``(major, minor, micro,
+level, serial)`` For example, in a hypothetical 2.0.1beta1, ``sys.version_info``
+would be ``(2, 0, 1, 'beta', 1)``. *level* is a string such as ``"alpha"``,
+``"beta"``, or ``"final"`` for a final release.
+
+Dictionaries have an odd new method, :meth:`setdefault(key, default)`, which
+behaves similarly to the existing :meth:`get` method.  However, if the key is
+missing, :meth:`setdefault` both returns the value of *default* as :meth:`get`
+would do, and also inserts it into the dictionary as the value for *key*.  Thus,
+the following lines of code::
+
+   if dict.has_key( key ): return dict[key]
+   else: 
+       dict[key] = []
+       return dict[key]
+
+can be reduced to a single ``return dict.setdefault(key, [])`` statement.
+
+The interpreter sets a maximum recursion depth in order to catch runaway
+recursion before filling the C stack and causing a core dump or GPF..
+Previously this limit was fixed when you compiled Python, but in 2.0 the maximum
+recursion depth can be read and modified using :func:`sys.getrecursionlimit` and
+:func:`sys.setrecursionlimit`. The default value is 1000, and a rough maximum
+value for a given platform can be found by running a new script,
+:file:`Misc/find_recursionlimit.py`.
+
+.. % ======================================================================
+
+
+Porting to 2.0
+==============
+
+New Python releases try hard to be compatible with previous releases, and the
+record has been pretty good.  However, some changes are considered useful
+enough, usually because they fix initial design decisions that turned out to be
+actively mistaken, that breaking backward compatibility can't always be avoided.
+This section lists the changes in Python 2.0 that may cause old Python code to
+break.
+
+The change which will probably break the most code is tightening up the
+arguments accepted by some methods.  Some methods would take multiple arguments
+and treat them as a tuple, particularly various list methods such as
+:meth:`.append` and :meth:`.insert`. In earlier versions of Python, if ``L`` is
+a list, ``L.append( 1,2 )`` appends the tuple ``(1,2)`` to the list.  In Python
+2.0 this causes a :exc:`TypeError` exception to be raised, with the message:
+'append requires exactly 1 argument; 2 given'.  The fix is to simply add an
+extra set of parentheses to pass both values as a tuple:  ``L.append( (1,2) )``.
+
+The earlier versions of these methods were more forgiving because they used an
+old function in Python's C interface to parse their arguments; 2.0 modernizes
+them to use :func:`PyArg_ParseTuple`, the current argument parsing function,
+which provides more helpful error messages and treats multi-argument calls as
+errors.  If you absolutely must use 2.0 but can't fix your code, you can edit
+:file:`Objects/listobject.c` and define the preprocessor symbol
+``NO_STRICT_LIST_APPEND`` to preserve the old behaviour; this isn't recommended.
+
+Some of the functions in the :mod:`socket` module are still forgiving in this
+way.  For example, :func:`socket.connect( ('hostname', 25) )` is the correct
+form, passing a tuple representing an IP address, but :func:`socket.connect(
+'hostname', 25 )` also works. :func:`socket.connect_ex` and :func:`socket.bind`
+are similarly easy-going.  2.0alpha1 tightened these functions up, but because
+the documentation actually used the erroneous multiple argument form, many
+people wrote code which would break with the stricter checking.  GvR backed out
+the changes in the face of public reaction, so for the :mod:`socket` module, the
+documentation was fixed and the multiple argument form is simply marked as
+deprecated; it *will* be tightened up again in a future Python version.
+
+The ``\x`` escape in string literals now takes exactly 2 hex digits.  Previously
+it would consume all the hex digits following the 'x' and take the lowest 8 bits
+of the result, so ``\x123456`` was equivalent to ``\x56``.
+
+The :exc:`AttributeError` and :exc:`NameError` exceptions have a more friendly
+error message, whose text will be something like ``'Spam' instance has no
+attribute 'eggs'`` or ``name 'eggs' is not defined``.  Previously the error
+message was just the missing attribute name ``eggs``, and code written to take
+advantage of this fact will break in 2.0.
+
+Some work has been done to make integers and long integers a bit more
+interchangeable.  In 1.5.2, large-file support was added for Solaris, to allow
+reading files larger than 2 GiB; this made the :meth:`tell` method of file
+objects return a long integer instead of a regular integer.  Some code would
+subtract two file offsets and attempt to use the result to multiply a sequence
+or slice a string, but this raised a :exc:`TypeError`.  In 2.0, long integers
+can be used to multiply or slice a sequence, and it'll behave as you'd
+intuitively expect it to; ``3L * 'abc'`` produces 'abcabcabc', and
+``(0,1,2,3)[2L:4L]`` produces (2,3). Long integers can also be used in various
+contexts where previously only integers were accepted, such as in the
+:meth:`seek` method of file objects, and in the formats supported by the ``%``
+operator (``%d``, ``%i``, ``%x``, etc.).  For example, ``"%d" % 2L**64`` will
+produce the string ``18446744073709551616``.
+
+The subtlest long integer change of all is that the :func:`str` of a long
+integer no longer has a trailing 'L' character, though :func:`repr` still
+includes it.  The 'L' annoyed many people who wanted to print long integers that
+looked just like regular integers, since they had to go out of their way to chop
+off the character.  This is no longer a problem in 2.0, but code which does
+``str(longval)[:-1]`` and assumes the 'L' is there, will now lose the final
+digit.
+
+Taking the :func:`repr` of a float now uses a different formatting precision
+than :func:`str`.  :func:`repr` uses ``%.17g`` format string for C's
+:func:`sprintf`, while :func:`str` uses ``%.12g`` as before.  The effect is that
+:func:`repr` may occasionally show more decimal places than  :func:`str`, for
+certain numbers.  For example, the number 8.1 can't be represented exactly in
+binary, so ``repr(8.1)`` is ``'8.0999999999999996'``, while str(8.1) is
+``'8.1'``.
+
+The ``-X`` command-line option, which turned all standard exceptions into
+strings instead of classes, has been removed; the standard exceptions will now
+always be classes.  The :mod:`exceptions` module containing the standard
+exceptions was translated from Python to a built-in C module, written by Barry
+Warsaw and Fredrik Lundh.
+
+.. % Commented out for now -- I don't think anyone will care.
+.. % The pattern and match objects provided by SRE are C types, not Python
+.. % class instances as in 1.5.  This means you can no longer inherit from
+.. % \class{RegexObject} or \class{MatchObject}, but that shouldn't be much
+.. % of a problem since no one should have been doing that in the first
+.. % place.
+.. % ======================================================================
+
+
+Extending/Embedding Changes
+===========================
+
+Some of the changes are under the covers, and will only be apparent to people
+writing C extension modules or embedding a Python interpreter in a larger
+application.  If you aren't dealing with Python's C API, you can safely skip
+this section.
+
+The version number of the Python C API was incremented, so C extensions compiled
+for 1.5.2 must be recompiled in order to work with 2.0.  On Windows, it's not
+possible for Python 2.0 to import a third party extension built for Python 1.5.x
+due to how Windows DLLs work, so Python will raise an exception and the import
+will fail.
+
+Users of Jim Fulton's ExtensionClass module will be pleased to find out that
+hooks have been added so that ExtensionClasses are now supported by
+:func:`isinstance` and :func:`issubclass`. This means you no longer have to
+remember to write code such as ``if type(obj) == myExtensionClass``, but can use
+the more natural ``if isinstance(obj, myExtensionClass)``.
+
+The :file:`Python/importdl.c` file, which was a mass of #ifdefs to support
+dynamic loading on many different platforms, was cleaned up and reorganised by
+Greg Stein.  :file:`importdl.c` is now quite small, and platform-specific code
+has been moved into a bunch of :file:`Python/dynload_\*.c` files.  Another
+cleanup: there were also a number of :file:`my\*.h` files in the Include/
+directory that held various portability hacks; they've been merged into a single
+file, :file:`Include/pyport.h`.
+
+Vladimir Marangozov's long-awaited malloc restructuring was completed, to make
+it easy to have the Python interpreter use a custom allocator instead of C's
+standard :func:`malloc`.  For documentation, read the comments in
+:file:`Include/pymem.h` and :file:`Include/objimpl.h`.  For the lengthy
+discussions during which the interface was hammered out, see the Web archives of
+the 'patches' and 'python-dev' lists at python.org.
+
+Recent versions of the GUSI development environment for MacOS support POSIX
+threads.  Therefore, Python's POSIX threading support now works on the
+Macintosh.  Threading support using the user-space GNU ``pth`` library was also
+contributed.
+
+Threading support on Windows was enhanced, too.  Windows supports thread locks
+that use kernel objects only in case of contention; in the common case when
+there's no contention, they use simpler functions which are an order of
+magnitude faster.  A threaded version of Python 1.5.2 on NT is twice as slow as
+an unthreaded version; with the 2.0 changes, the difference is only 10%.  These
+improvements were contributed by Yakov Markovitch.
+
+Python 2.0's source now uses only ANSI C prototypes, so compiling Python now
+requires an ANSI C compiler, and can no longer be done using a compiler that
+only supports K&R C.
+
+Previously the Python virtual machine used 16-bit numbers in its bytecode,
+limiting the size of source files.  In particular, this affected the maximum
+size of literal lists and dictionaries in Python source; occasionally people who
+are generating Python code would run into this limit.  A patch by Charles G.
+Waldman raises the limit from ``2^16`` to ``2^{32}``.
+
+Three new convenience functions intended for adding constants to a module's
+dictionary at module initialization time were added: :func:`PyModule_AddObject`,
+:func:`PyModule_AddIntConstant`, and :func:`PyModule_AddStringConstant`.  Each
+of these functions takes a module object, a null-terminated C string containing
+the name to be added, and a third argument for the value to be assigned to the
+name.  This third argument is, respectively, a Python object, a C long, or a C
+string.
+
+A wrapper API was added for Unix-style signal handlers. :func:`PyOS_getsig` gets
+a signal handler and :func:`PyOS_setsig` will set a new handler.
+
+.. % ======================================================================
+
+
+Distutils: Making Modules Easy to Install
+=========================================
+
+Before Python 2.0, installing modules was a tedious affair -- there was no way
+to figure out automatically where Python is installed, or what compiler options
+to use for extension modules.  Software authors had to go through an arduous
+ritual of editing Makefiles and configuration files, which only really work on
+Unix and leave Windows and MacOS unsupported.  Python users faced wildly
+differing installation instructions which varied between different extension
+packages, which made administering a Python installation something of  a chore.
+
+The SIG for distribution utilities, shepherded by Greg Ward, has created the
+Distutils, a system to make package installation much easier.  They form the
+:mod:`distutils` package, a new part of Python's standard library. In the best
+case, installing a Python module from source will require the same steps: first
+you simply mean unpack the tarball or zip archive, and the run "``python
+setup.py install``".  The platform will be automatically detected, the compiler
+will be recognized, C extension modules will be compiled, and the distribution
+installed into the proper directory.  Optional command-line arguments provide
+more control over the installation process, the distutils package offers many
+places to override defaults -- separating the build from the install, building
+or installing in non-default directories, and more.
+
+In order to use the Distutils, you need to write a :file:`setup.py` script.  For
+the simple case, when the software contains only .py files, a minimal
+:file:`setup.py` can be just a few lines long::
+
+   from distutils.core import setup
+   setup (name = "foo", version = "1.0", 
+          py_modules = ["module1", "module2"])
+
+The :file:`setup.py` file isn't much more complicated if the software consists
+of a few packages::
+
+   from distutils.core import setup
+   setup (name = "foo", version = "1.0", 
+          packages = ["package", "package.subpackage"])
+
+A C extension can be the most complicated case; here's an example taken from
+the PyXML package::
+
+   from distutils.core import setup, Extension
+
+   expat_extension = Extension('xml.parsers.pyexpat',
+   	define_macros = [('XML_NS', None)],
+   	include_dirs = [ 'extensions/expat/xmltok',
+   	                 'extensions/expat/xmlparse' ],
+   	sources = [ 'extensions/pyexpat.c',
+   	            'extensions/expat/xmltok/xmltok.c',
+    		    'extensions/expat/xmltok/xmlrole.c',
+                     ]
+          )
+   setup (name = "PyXML", version = "0.5.4", 
+          ext_modules =[ expat_extension ] )
+
+The Distutils can also take care of creating source and binary distributions.
+The "sdist" command, run by "``python setup.py sdist``', builds a source
+distribution such as :file:`foo-1.0.tar.gz`. Adding new commands isn't
+difficult, "bdist_rpm" and "bdist_wininst" commands have already been
+contributed to create an RPM distribution and a Windows installer for the
+software, respectively.  Commands to create other distribution formats such as
+Debian packages and Solaris :file:`.pkg` files are in various stages of
+development.
+
+All this is documented in a new manual, *Distributing Python Modules*, that
+joins the basic set of Python documentation.
+
+.. % ======================================================================
+
+
+XML Modules
+===========
+
+Python 1.5.2 included a simple XML parser in the form of the :mod:`xmllib`
+module, contributed by Sjoerd Mullender.  Since 1.5.2's release, two different
+interfaces for processing XML have become common: SAX2 (version 2 of the Simple
+API for XML) provides an event-driven interface with some similarities to
+:mod:`xmllib`, and the DOM (Document Object Model) provides a tree-based
+interface, transforming an XML document into a tree of nodes that can be
+traversed and modified.  Python 2.0 includes a SAX2 interface and a stripped-
+down DOM interface as part of the :mod:`xml` package. Here we will give a brief
+overview of these new interfaces; consult the Python documentation or the source
+code for complete details. The Python XML SIG is also working on improved
+documentation.
+
+
+SAX2 Support
+------------
+
+SAX defines an event-driven interface for parsing XML.  To use SAX, you must
+write a SAX handler class.  Handler classes inherit from various classes
+provided by SAX, and override various methods that will then be called by the
+XML parser.  For example, the :meth:`startElement` and :meth:`endElement`
+methods are called for every starting and end tag encountered by the parser, the
+:meth:`characters` method is called for every chunk of character data, and so
+forth.
+
+The advantage of the event-driven approach is that the whole document doesn't
+have to be resident in memory at any one time, which matters if you are
+processing really huge documents.  However, writing the SAX handler class can
+get very complicated if you're trying to modify the document structure in some
+elaborate way.
+
+For example, this little example program defines a handler that prints a message
+for every starting and ending tag, and then parses the file :file:`hamlet.xml`
+using it::
+
+   from xml import sax
+
+   class SimpleHandler(sax.ContentHandler):
+       def startElement(self, name, attrs):
+           print 'Start of element:', name, attrs.keys()
+
+       def endElement(self, name):
+           print 'End of element:', name
+
+   # Create a parser object
+   parser = sax.make_parser()
+
+   # Tell it what handler to use
+   handler = SimpleHandler()
+   parser.setContentHandler( handler )
+
+   # Parse a file!
+   parser.parse( 'hamlet.xml' )
+
+For more information, consult the Python documentation, or the XML HOWTO at
+http://pyxml.sourceforge.net/topics/howto/xml-howto.html.
+
+
+DOM Support
+-----------
+
+The Document Object Model is a tree-based representation for an XML document.  A
+top-level :class:`Document` instance is the root of the tree, and has a single
+child which is the top-level :class:`Element` instance. This :class:`Element`
+has children nodes representing character data and any sub-elements, which may
+have further children of their own, and so forth.  Using the DOM you can
+traverse the resulting tree any way you like, access element and attribute
+values, insert and delete nodes, and convert the tree back into XML.
+
+The DOM is useful for modifying XML documents, because you can create a DOM
+tree, modify it by adding new nodes or rearranging subtrees, and then produce a
+new XML document as output.  You can also construct a DOM tree manually and
+convert it to XML, which can be a more flexible way of producing XML output than
+simply writing ``<tag1>``...\ ``</tag1>`` to a file.
+
+The DOM implementation included with Python lives in the :mod:`xml.dom.minidom`
+module.  It's a lightweight implementation of the Level 1 DOM with support for
+XML namespaces.  The  :func:`parse` and :func:`parseString` convenience
+functions are provided for generating a DOM tree::
+
+   from xml.dom import minidom
+   doc = minidom.parse('hamlet.xml')
+
+``doc`` is a :class:`Document` instance.  :class:`Document`, like all the other
+DOM classes such as :class:`Element` and :class:`Text`, is a subclass of the
+:class:`Node` base class.  All the nodes in a DOM tree therefore support certain
+common methods, such as :meth:`toxml` which returns a string containing the XML
+representation of the node and its children.  Each class also has special
+methods of its own; for example, :class:`Element` and :class:`Document`
+instances have a method to find all child elements with a given tag name.
+Continuing from the previous 2-line example::
+
+   perslist = doc.getElementsByTagName( 'PERSONA' )
+   print perslist[0].toxml()
+   print perslist[1].toxml()
+
+For the *Hamlet* XML file, the above few lines output::
+
+   <PERSONA>CLAUDIUS, king of Denmark. </PERSONA>
+   <PERSONA>HAMLET, son to the late, and nephew to the present king.</PERSONA>
+
+The root element of the document is available as ``doc.documentElement``, and
+its children can be easily modified by deleting, adding, or removing nodes::
+
+   root = doc.documentElement
+
+   # Remove the first child
+   root.removeChild( root.childNodes[0] )
+
+   # Move the new first child to the end
+   root.appendChild( root.childNodes[0] )
+
+   # Insert the new first child (originally,
+   # the third child) before the 20th child.
+   root.insertBefore( root.childNodes[0], root.childNodes[20] )
+
+Again, I will refer you to the Python documentation for a complete listing of
+the different :class:`Node` classes and their various methods.
+
+
+Relationship to PyXML
+---------------------
+
+The XML Special Interest Group has been working on XML-related Python code for a
+while.  Its code distribution, called PyXML, is available from the SIG's Web
+pages at http://www.python.org/sigs/xml-sig/. The PyXML distribution also used
+the package name ``xml``.  If you've written programs that used PyXML, you're
+probably wondering about its compatibility with the 2.0 :mod:`xml` package.
+
+The answer is that Python 2.0's :mod:`xml` package isn't compatible with PyXML,
+but can be made compatible by installing a recent version PyXML.  Many
+applications can get by with the XML support that is included with Python 2.0,
+but more complicated applications will require that the full PyXML package will
+be installed.  When installed, PyXML versions 0.6.0 or greater will replace the
+:mod:`xml` package shipped with Python, and will be a strict superset of the
+standard package, adding a bunch of additional features.  Some of the additional
+features in PyXML include:
+
+* 4DOM, a full DOM implementation from FourThought, Inc.
+
+* The xmlproc validating parser, written by Lars Marius Garshol.
+
+* The :mod:`sgmlop` parser accelerator module, written by Fredrik Lundh.
+
+.. % ======================================================================
+
+
+Module changes
+==============
+
+Lots of improvements and bugfixes were made to Python's extensive standard
+library; some of the affected modules include :mod:`readline`,
+:mod:`ConfigParser`, :mod:`cgi`, :mod:`calendar`, :mod:`posix`, :mod:`readline`,
+:mod:`xmllib`, :mod:`aifc`, :mod:`chunk, wave`, :mod:`random`, :mod:`shelve`,
+and :mod:`nntplib`.  Consult the CVS logs for the exact patch-by-patch details.
+
+Brian Gallew contributed OpenSSL support for the :mod:`socket` module.  OpenSSL
+is an implementation of the Secure Socket Layer, which encrypts the data being
+sent over a socket.  When compiling Python, you can edit :file:`Modules/Setup`
+to include SSL support, which adds an additional function to the :mod:`socket`
+module: :func:`socket.ssl(socket, keyfile, certfile)`, which takes a socket
+object and returns an SSL socket.  The :mod:`httplib` and :mod:`urllib` modules
+were also changed to support "https://" URLs, though no one has implemented FTP
+or SMTP over SSL.
+
+The :mod:`httplib` module has been rewritten by Greg Stein to support HTTP/1.1.
+Backward compatibility with the 1.5 version of :mod:`httplib` is provided,
+though using HTTP/1.1 features such as pipelining will require rewriting code to
+use a different set of interfaces.
+
+The :mod:`Tkinter` module now supports Tcl/Tk version 8.1, 8.2, or 8.3, and
+support for the older 7.x versions has been dropped.  The Tkinter module now
+supports displaying Unicode strings in Tk widgets. Also, Fredrik Lundh
+contributed an optimization which makes operations like ``create_line`` and
+``create_polygon`` much faster, especially when using lots of coordinates.
+
+The :mod:`curses` module has been greatly extended, starting from Oliver
+Andrich's enhanced version, to provide many additional functions from ncurses
+and SYSV curses, such as colour, alternative character set support, pads, and
+mouse support.  This means the module is no longer compatible with operating
+systems that only have BSD curses, but there don't seem to be any currently
+maintained OSes that fall into this category.
+
+As mentioned in the earlier discussion of 2.0's Unicode support, the underlying
+implementation of the regular expressions provided by the :mod:`re` module has
+been changed.  SRE, a new regular expression engine written by Fredrik Lundh and
+partially funded by Hewlett Packard, supports matching against both 8-bit
+strings and Unicode strings.
+
+.. % ======================================================================
+
+
+New modules
+===========
+
+A number of new modules were added.  We'll simply list them with brief
+descriptions; consult the 2.0 documentation for the details of a particular
+module.
+
+* :mod:`atexit`:  For registering functions to be called before the Python
+  interpreter exits. Code that currently sets ``sys.exitfunc`` directly should be
+  changed to  use the :mod:`atexit` module instead, importing :mod:`atexit` and
+  calling :func:`atexit.register` with  the function to be called on exit.
+  (Contributed by Skip Montanaro.)
+
+* :mod:`codecs`, :mod:`encodings`, :mod:`unicodedata`:  Added as part of the new
+  Unicode support.
+
+* :mod:`filecmp`: Supersedes the old :mod:`cmp`, :mod:`cmpcache` and
+  :mod:`dircmp` modules, which have now become deprecated. (Contributed by Gordon
+  MacMillan and Moshe Zadka.)
+
+* :mod:`gettext`: This module provides internationalization (I18N) and
+  localization (L10N) support for Python programs by providing an interface to the
+  GNU gettext message catalog library. (Integrated by Barry Warsaw, from separate
+  contributions by Martin  von Löwis, Peter Funk, and James Henstridge.)
+
+* :mod:`linuxaudiodev`: Support for the :file:`/dev/audio` device on Linux, a
+  twin to the existing :mod:`sunaudiodev` module. (Contributed by Peter Bosch,
+  with fixes by Jeremy Hylton.)
+
+* :mod:`mmap`: An interface to memory-mapped files on both Windows and Unix.  A
+  file's contents can be mapped directly into memory, at which point it behaves
+  like a mutable string, so its contents can be read and modified.  They can even
+  be passed to functions that expect ordinary strings, such as the :mod:`re`
+  module. (Contributed by Sam Rushing, with some extensions by A.M. Kuchling.)
+
+* :mod:`pyexpat`: An interface to the Expat XML parser. (Contributed by Paul
+  Prescod.)
+
+* :mod:`robotparser`: Parse a :file:`robots.txt` file, which is used for writing
+  Web spiders that politely avoid certain areas of a Web site.  The parser accepts
+  the contents of a :file:`robots.txt` file, builds a set of rules from it, and
+  can then answer questions about the fetchability of a given URL.  (Contributed
+  by Skip Montanaro.)
+
+* :mod:`tabnanny`: A module/script to  check Python source code for ambiguous
+  indentation. (Contributed by Tim Peters.)
+
+* :mod:`UserString`: A base class useful for deriving objects that behave like
+  strings.
+
+* :mod:`webbrowser`: A module that provides a platform independent way to launch
+  a web browser on a specific URL. For each platform, various browsers are tried
+  in a specific order. The user can alter which browser is launched by setting the
+  *BROWSER* environment variable.  (Originally inspired by Eric S. Raymond's patch
+  to :mod:`urllib` which added similar functionality, but the final module comes
+  from code originally  implemented by Fred Drake as
+  :file:`Tools/idle/BrowserControl.py`, and adapted for the standard library by
+  Fred.)
+
+* :mod:`_winreg`: An interface to the Windows registry.  :mod:`_winreg` is an
+  adaptation of functions that have been part of PythonWin since 1995, but has now
+  been added to the core  distribution, and enhanced to support Unicode.
+  :mod:`_winreg` was written by Bill Tutt and Mark Hammond.
+
+* :mod:`zipfile`: A module for reading and writing ZIP-format archives.  These
+  are archives produced by :program:`PKZIP` on DOS/Windows or :program:`zip` on
+  Unix, not to be confused with :program:`gzip`\ -format files (which are
+  supported by the :mod:`gzip` module) (Contributed by James C. Ahlstrom.)
+
+* :mod:`imputil`: A module that provides a simpler way for writing customised
+  import hooks, in comparison to the existing :mod:`ihooks` module.  (Implemented
+  by Greg Stein, with much discussion on python-dev along the way.)
+
+.. % ======================================================================
+
+
+IDLE Improvements
+=================
+
+IDLE is the official Python cross-platform IDE, written using Tkinter. Python
+2.0 includes IDLE 0.6, which adds a number of new features and improvements.  A
+partial list:
+
+* UI improvements and optimizations, especially in the area of syntax
+  highlighting and auto-indentation.
+
+* The class browser now shows more information, such as the top level functions
+  in a module.
+
+* Tab width is now a user settable option. When opening an existing Python file,
+  IDLE automatically detects the indentation conventions, and adapts.
+
+* There is now support for calling browsers on various platforms, used to open
+  the Python documentation in a browser.
+
+* IDLE now has a command line, which is largely similar to  the vanilla Python
+  interpreter.
+
+* Call tips were added in many places.
+
+* IDLE can now be installed as a package.
+
+* In the editor window, there is now a line/column bar at the bottom.
+
+* Three new keystroke commands: Check module (Alt-F5), Import module (F5) and
+  Run script (Ctrl-F5).
+
+.. % ======================================================================
+
+
+Deleted and Deprecated Modules
+==============================
+
+A few modules have been dropped because they're obsolete, or because there are
+now better ways to do the same thing.  The :mod:`stdwin` module is gone; it was
+for a platform-independent windowing toolkit that's no longer developed.
+
+A number of modules have been moved to the :file:`lib-old` subdirectory:
+:mod:`cmp`, :mod:`cmpcache`, :mod:`dircmp`, :mod:`dump`,  :mod:`find`,
+:mod:`grep`, :mod:`packmail`,  :mod:`poly`, :mod:`util`, :mod:`whatsound`,
+:mod:`zmod`.  If you have code which relies on a module  that's been moved to
+:file:`lib-old`, you can simply add that directory to ``sys.path``   to get them
+back, but you're encouraged to update any code that uses these modules.
+
+
+Acknowledgements
+================
+
+The authors would like to thank the following people for offering suggestions on
+various drafts of this article: David Bolen, Mark Hammond, Gregg Hauser, Jeremy
+Hylton, Fredrik Lundh, Detlef Lannert, Aahz Maruch, Skip Montanaro, Vladimir
+Marangozov, Tobias Polzin, Guido van Rossum, Neil Schemenauer, and Russ Schmidt.
+
diff --git a/Doc/whatsnew/2.1.rst b/Doc/whatsnew/2.1.rst
new file mode 100644
index 0000000..2be11ba
--- /dev/null
+++ b/Doc/whatsnew/2.1.rst
@@ -0,0 +1,794 @@
+****************************
+  What's New in Python 2.1  
+****************************
+
+:Author: A.M. Kuchling
+
+.. |release| replace:: 1.01
+
+.. % $Id: whatsnew21.tex 51211 2006-08-11 14:57:12Z thomas.wouters $
+
+
+Introduction
+============
+
+This article explains the new features in Python 2.1.  While there aren't as
+many changes in 2.1 as there were in Python 2.0, there are still some pleasant
+surprises in store.  2.1 is the first release to be steered through the use of
+Python Enhancement Proposals, or PEPs, so most of the sizable changes have
+accompanying PEPs that provide more complete documentation and a design
+rationale for the change.  This article doesn't attempt to document the new
+features completely, but simply provides an overview of the new features for
+Python programmers. Refer to the Python 2.1 documentation, or to the specific
+PEP, for more details about any new feature that particularly interests you.
+
+One recent goal of the Python development team has been to accelerate the pace
+of new releases, with a new release coming every 6 to 9 months. 2.1 is the first
+release to come out at this faster pace, with the first alpha appearing in
+January, 3 months after the final version of 2.0 was released.
+
+The final release of Python 2.1 was made on April 17, 2001.
+
+.. % ======================================================================
+
+
+PEP 227: Nested Scopes
+======================
+
+The largest change in Python 2.1 is to Python's scoping rules.  In Python 2.0,
+at any given time there are at most three namespaces used to look up variable
+names: local, module-level, and the built-in namespace.  This often surprised
+people because it didn't match their intuitive expectations.  For example, a
+nested recursive function definition doesn't work::
+
+   def f():
+       ...
+       def g(value):
+           ...
+           return g(value-1) + 1
+       ...
+
+The function :func:`g` will always raise a :exc:`NameError` exception, because
+the binding of the name ``g`` isn't in either its local namespace or in the
+module-level namespace.  This isn't much of a problem in practice (how often do
+you recursively define interior functions like this?), but this also made using
+the :keyword:`lambda` statement clumsier, and this was a problem in practice.
+In code which uses :keyword:`lambda` you can often find local variables being
+copied by passing them as the default values of arguments. ::
+
+   def find(self, name):
+       "Return list of any entries equal to 'name'"
+       L = filter(lambda x, name=name: x == name,
+                  self.list_attribute)
+       return L
+
+The readability of Python code written in a strongly functional style suffers
+greatly as a result.
+
+The most significant change to Python 2.1 is that static scoping has been added
+to the language to fix this problem.  As a first effect, the ``name=name``
+default argument is now unnecessary in the above example.  Put simply, when a
+given variable name is not assigned a value within a function (by an assignment,
+or the :keyword:`def`, :keyword:`class`, or :keyword:`import` statements),
+references to the variable will be looked up in the local namespace of the
+enclosing scope.  A more detailed explanation of the rules, and a dissection of
+the implementation, can be found in the PEP.
+
+This change may cause some compatibility problems for code where the same
+variable name is used both at the module level and as a local variable within a
+function that contains further function definitions. This seems rather unlikely
+though, since such code would have been pretty confusing to read in the first
+place.
+
+One side effect of the change is that the ``from module import *`` and
+:keyword:`exec` statements have been made illegal inside a function scope under
+certain conditions.  The Python reference manual has said all along that ``from
+module import *`` is only legal at the top level of a module, but the CPython
+interpreter has never enforced this before.  As part of the implementation of
+nested scopes, the compiler which turns Python source into bytecodes has to
+generate different code to access variables in a containing scope.  ``from
+module import *`` and :keyword:`exec` make it impossible for the compiler to
+figure this out, because they add names to the local namespace that are
+unknowable at compile time. Therefore, if a function contains function
+definitions or :keyword:`lambda` expressions with free variables, the compiler
+will flag this by raising a :exc:`SyntaxError` exception.
+
+To make the preceding explanation a bit clearer, here's an example::
+
+   x = 1
+   def f():
+       # The next line is a syntax error
+       exec 'x=2'  
+       def g():
+           return x
+
+Line 4 containing the :keyword:`exec` statement is a syntax error, since
+:keyword:`exec` would define a new local variable named ``x`` whose value should
+be accessed by :func:`g`.
+
+This shouldn't be much of a limitation, since :keyword:`exec` is rarely used in
+most Python code (and when it is used, it's often a sign of a poor design
+anyway).
+
+Compatibility concerns have led to nested scopes being introduced gradually; in
+Python 2.1, they aren't enabled by default, but can be turned on within a module
+by using a future statement as described in PEP 236.  (See the following section
+for further discussion of PEP 236.)  In Python 2.2, nested scopes will become
+the default and there will be no way to turn them off, but users will have had
+all of 2.1's lifetime to fix any breakage resulting from their introduction.
+
+
+.. seealso::
+
+   :pep:`227` - Statically Nested Scopes
+      Written and implemented by Jeremy Hylton.
+
+.. % ======================================================================
+
+
+PEP 236: __future__ Directives
+==============================
+
+The reaction to nested scopes was widespread concern about the dangers of
+breaking code with the 2.1 release, and it was strong enough to make the
+Pythoneers take a more conservative approach.  This approach consists of
+introducing a convention for enabling optional functionality in release N that
+will become compulsory in release N+1.
+
+The syntax uses a ``from...import`` statement using the reserved module name
+:mod:`__future__`.  Nested scopes can be enabled by the following statement::
+
+   from __future__ import nested_scopes
+
+While it looks like a normal :keyword:`import` statement, it's not; there are
+strict rules on where such a future statement can be put. They can only be at
+the top of a module, and must precede any Python code or regular
+:keyword:`import` statements.  This is because such statements can affect how
+the Python bytecode compiler parses code and generates bytecode, so they must
+precede any statement that will result in bytecodes being produced.
+
+
+.. seealso::
+
+   :pep:`236` - Back to the :mod:`__future__`
+      Written by Tim Peters, and primarily implemented by Jeremy Hylton.
+
+.. % ======================================================================
+
+
+PEP 207: Rich Comparisons
+=========================
+
+In earlier versions, Python's support for implementing comparisons on user-
+defined classes and extension types was quite simple. Classes could implement a
+:meth:`__cmp__` method that was given two instances of a class, and could only
+return 0 if they were equal or +1 or -1 if they weren't; the method couldn't
+raise an exception or return anything other than a Boolean value.  Users of
+Numeric Python often found this model too weak and restrictive, because in the
+number-crunching programs that numeric Python is used for, it would be more
+useful to be able to perform elementwise comparisons of two matrices, returning
+a matrix containing the results of a given comparison for each element.  If the
+two matrices are of different sizes, then the compare has to be able to raise an
+exception to signal the error.
+
+In Python 2.1, rich comparisons were added in order to support this need.
+Python classes can now individually overload each of the ``<``, ``<=``, ``>``,
+``>=``, ``==``, and ``!=`` operations.  The new magic method names are:
+
++-----------+----------------+
+| Operation | Method name    |
++===========+================+
+| ``<``     | :meth:`__lt__` |
++-----------+----------------+
+| ``<=``    | :meth:`__le__` |
++-----------+----------------+
+| ``>``     | :meth:`__gt__` |
++-----------+----------------+
+| ``>=``    | :meth:`__ge__` |
++-----------+----------------+
+| ``==``    | :meth:`__eq__` |
++-----------+----------------+
+| ``!=``    | :meth:`__ne__` |
++-----------+----------------+
+
+(The magic methods are named after the corresponding Fortran operators ``.LT.``.
+``.LE.``, &c.  Numeric programmers are almost certainly quite familiar with
+these names and will find them easy to remember.)
+
+Each of these magic methods is of the form ``method(self, other)``, where
+``self`` will be the object on the left-hand side of the operator, while
+``other`` will be the object on the right-hand side.  For example, the
+expression ``A < B`` will cause ``A.__lt__(B)`` to be called.
+
+Each of these magic methods can return anything at all: a Boolean, a matrix, a
+list, or any other Python object.  Alternatively they can raise an exception if
+the comparison is impossible, inconsistent, or otherwise meaningless.
+
+The built-in :func:`cmp(A,B)` function can use the rich comparison machinery,
+and now accepts an optional argument specifying which comparison operation to
+use; this is given as one of the strings ``"<"``, ``"<="``, ``">"``, ``">="``,
+``"=="``, or ``"!="``.  If called without the optional third argument,
+:func:`cmp` will only return -1, 0, or +1 as in previous versions of Python;
+otherwise it will call the appropriate method and can return any Python object.
+
+There are also corresponding changes of interest to C programmers; there's a new
+slot ``tp_richcmp`` in type objects and an API for performing a given rich
+comparison.  I won't cover the C API here, but will refer you to PEP 207, or to
+2.1's C API documentation, for the full list of related functions.
+
+
+.. seealso::
+
+   :pep:`207` - Rich Comparisions
+      Written by Guido van Rossum, heavily based on earlier work by David Ascher, and
+      implemented by Guido van Rossum.
+
+.. % ======================================================================
+
+
+PEP 230: Warning Framework
+==========================
+
+Over its 10 years of existence, Python has accumulated a certain number of
+obsolete modules and features along the way.  It's difficult to know when a
+feature is safe to remove, since there's no way of knowing how much code uses it
+--- perhaps no programs depend on the feature, or perhaps many do.  To enable
+removing old features in a more structured way, a warning framework was added.
+When the Python developers want to get rid of a feature, it will first trigger a
+warning in the next version of Python.  The following Python version can then
+drop the feature, and users will have had a full release cycle to remove uses of
+the old feature.
+
+Python 2.1 adds the warning framework to be used in this scheme.  It adds a
+:mod:`warnings` module that provide functions to issue warnings, and to filter
+out warnings that you don't want to be displayed. Third-party modules can also
+use this framework to deprecate old features that they no longer wish to
+support.
+
+For example, in Python 2.1 the :mod:`regex` module is deprecated, so importing
+it causes a warning to be printed::
+
+   >>> import regex
+   __main__:1: DeprecationWarning: the regex module
+            is deprecated; please use the re module
+   >>>
+
+Warnings can be issued by calling the :func:`warnings.warn` function::
+
+   warnings.warn("feature X no longer supported")
+
+The first parameter is the warning message; an additional optional parameters
+can be used to specify a particular warning category.
+
+Filters can be added to disable certain warnings; a regular expression pattern
+can be applied to the message or to the module name in order to suppress a
+warning.  For example, you may have a program that uses the :mod:`regex` module
+and not want to spare the time to convert it to use the :mod:`re` module right
+now.  The warning can be suppressed by calling ::
+
+   import warnings
+   warnings.filterwarnings(action = 'ignore',
+                           message='.*regex module is deprecated',
+                           category=DeprecationWarning,
+                           module = '__main__')
+
+This adds a filter that will apply only to warnings of the class
+:class:`DeprecationWarning` triggered in the :mod:`__main__` module, and applies
+a regular expression to only match the message about the :mod:`regex` module
+being deprecated, and will cause such warnings to be ignored.  Warnings can also
+be printed only once, printed every time the offending code is executed, or
+turned into exceptions that will cause the program to stop (unless the
+exceptions are caught in the usual way, of course).
+
+Functions were also added to Python's C API for issuing warnings; refer to PEP
+230 or to Python's API documentation for the details.
+
+
+.. seealso::
+
+   :pep:`5` - Guidelines for Language Evolution
+      Written by Paul Prescod, to specify procedures to be followed when removing old
+      features from Python.  The policy described in this PEP hasn't been officially
+      adopted, but the eventual policy probably won't be too different from Prescod's
+      proposal.
+
+   :pep:`230` - Warning Framework
+      Written and implemented by Guido van Rossum.
+
+.. % ======================================================================
+
+
+PEP 229: New Build System
+=========================
+
+When compiling Python, the user had to go in and edit the :file:`Modules/Setup`
+file in order to enable various additional modules; the default set is
+relatively small and limited to modules that compile on most Unix platforms.
+This means that on Unix platforms with many more features, most notably Linux,
+Python installations often don't contain all useful modules they could.
+
+Python 2.0 added the Distutils, a set of modules for distributing and installing
+extensions.  In Python 2.1, the Distutils are used to compile much of the
+standard library of extension modules, autodetecting which ones are supported on
+the current machine.  It's hoped that this will make Python installations easier
+and more featureful.
+
+Instead of having to edit the :file:`Modules/Setup` file in order to enable
+modules, a :file:`setup.py` script in the top directory of the Python source
+distribution is run at build time, and attempts to discover which modules can be
+enabled by examining the modules and header files on the system.  If a module is
+configured in :file:`Modules/Setup`, the :file:`setup.py` script won't attempt
+to compile that module and will defer to the :file:`Modules/Setup` file's
+contents.  This provides a way to specific any strange command-line flags or
+libraries that are required for a specific platform.
+
+In another far-reaching change to the build mechanism, Neil Schemenauer
+restructured things so Python now uses a single makefile that isn't recursive,
+instead of makefiles in the top directory and in each of the :file:`Python/`,
+:file:`Parser/`, :file:`Objects/`, and :file:`Modules/` subdirectories.  This
+makes building Python faster and also makes hacking the Makefiles clearer and
+simpler.
+
+
+.. seealso::
+
+   :pep:`229` - Using Distutils to Build Python
+      Written and implemented by A.M. Kuchling.
+
+.. % ======================================================================
+
+
+PEP 205: Weak References
+========================
+
+Weak references, available through the :mod:`weakref` module, are a minor but
+useful new data type in the Python programmer's toolbox.
+
+Storing a reference to an object (say, in a dictionary or a list) has the side
+effect of keeping that object alive forever.  There are a few specific cases
+where this behaviour is undesirable, object caches being the most common one,
+and another being circular references in data structures such as trees.
+
+For example, consider a memoizing function that caches the results of another
+function :func:`f(x)` by storing the function's argument and its result in a
+dictionary::
+
+   _cache = {}
+   def memoize(x):
+       if _cache.has_key(x):
+           return _cache[x]
+
+       retval = f(x)
+
+       # Cache the returned object
+       _cache[x] = retval
+
+       return retval
+
+This version works for simple things such as integers, but it has a side effect;
+the ``_cache`` dictionary holds a reference to the return values, so they'll
+never be deallocated until the Python process exits and cleans up This isn't
+very noticeable for integers, but if :func:`f` returns an object, or a data
+structure that takes up a lot of memory, this can be a problem.
+
+Weak references provide a way to implement a cache that won't keep objects alive
+beyond their time.  If an object is only accessible through weak references, the
+object will be deallocated and the weak references will now indicate that the
+object it referred to no longer exists.  A weak reference to an object *obj* is
+created by calling ``wr = weakref.ref(obj)``.  The object being referred to is
+returned by calling the weak reference as if it were a function: ``wr()``.  It
+will return the referenced object, or ``None`` if the object no longer exists.
+
+This makes it possible to write a :func:`memoize` function whose cache doesn't
+keep objects alive, by storing weak references in the cache. ::
+
+   _cache = {}
+   def memoize(x):
+       if _cache.has_key(x):
+           obj = _cache[x]()
+           # If weak reference object still exists,
+           # return it
+           if obj is not None: return obj
+
+       retval = f(x)
+
+       # Cache a weak reference
+       _cache[x] = weakref.ref(retval)
+
+       return retval
+
+The :mod:`weakref` module also allows creating proxy objects which behave like
+weak references --- an object referenced only by proxy objects is deallocated --
+but instead of requiring an explicit call to retrieve the object, the proxy
+transparently forwards all operations to the object as long as the object still
+exists.  If the object is deallocated, attempting to use a proxy will cause a
+:exc:`weakref.ReferenceError` exception to be raised. ::
+
+   proxy = weakref.proxy(obj)
+   proxy.attr   # Equivalent to obj.attr
+   proxy.meth() # Equivalent to obj.meth()
+   del obj
+   proxy.attr   # raises weakref.ReferenceError
+
+
+.. seealso::
+
+   :pep:`205` - Weak References
+      Written and implemented by Fred L. Drake, Jr.
+
+.. % ======================================================================
+
+
+PEP 232: Function Attributes
+============================
+
+In Python 2.1, functions can now have arbitrary information attached to them.
+People were often using docstrings to hold information about functions and
+methods, because the ``__doc__`` attribute was the only way of attaching any
+information to a function.  For example, in the Zope Web application server,
+functions are marked as safe for public access by having a docstring, and in
+John Aycock's SPARK parsing framework, docstrings hold parts of the BNF grammar
+to be parsed.  This overloading is unfortunate, since docstrings are really
+intended to hold a function's documentation; for example, it means you can't
+properly document functions intended for private use in Zope.
+
+Arbitrary attributes can now be set and retrieved on functions using the regular
+Python syntax::
+
+   def f(): pass
+
+   f.publish = 1
+   f.secure = 1
+   f.grammar = "A ::= B (C D)*"
+
+The dictionary containing attributes can be accessed as the function's
+:attr:`__dict__`. Unlike the :attr:`__dict__` attribute of class instances, in
+functions you can actually assign a new dictionary to :attr:`__dict__`, though
+the new value is restricted to a regular Python dictionary; you *can't* be
+tricky and set it to a :class:`UserDict` instance, or any other random object
+that behaves like a mapping.
+
+
+.. seealso::
+
+   :pep:`232` - Function Attributes
+      Written and implemented by Barry Warsaw.
+
+.. % ======================================================================
+
+
+PEP 235: Importing Modules on Case-Insensitive Platforms
+========================================================
+
+Some operating systems have filesystems that are case-insensitive, MacOS and
+Windows being the primary examples; on these systems, it's impossible to
+distinguish the filenames ``FILE.PY`` and ``file.py``, even though they do store
+the file's name  in its original case (they're case-preserving, too).
+
+In Python 2.1, the :keyword:`import` statement will work to simulate case-
+sensitivity on case-insensitive platforms.  Python will now search for the first
+case-sensitive match by default, raising an :exc:`ImportError` if no such file
+is found, so ``import file`` will not import a module named ``FILE.PY``.  Case-
+insensitive matching can be requested by setting the :envvar:`PYTHONCASEOK`
+environment variable before starting the Python interpreter.
+
+.. % ======================================================================
+
+
+PEP 217: Interactive Display Hook
+=================================
+
+When using the Python interpreter interactively, the output of commands is
+displayed using the built-in :func:`repr` function. In Python 2.1, the variable
+:func:`sys.displayhook` can be set to a callable object which will be called
+instead of :func:`repr`. For example, you can set it to a special pretty-
+printing function::
+
+   >>> # Create a recursive data structure
+   ... L = [1,2,3]
+   >>> L.append(L)
+   >>> L # Show Python's default output
+   [1, 2, 3, [...]]
+   >>> # Use pprint.pprint() as the display function
+   ... import sys, pprint
+   >>> sys.displayhook = pprint.pprint
+   >>> L
+   [1, 2, 3,  <Recursion on list with id=135143996>]
+   >>>
+
+
+.. seealso::
+
+   :pep:`217` - Display Hook for Interactive Use
+      Written and implemented by Moshe Zadka.
+
+.. % ======================================================================
+
+
+PEP 208: New Coercion Model
+===========================
+
+How numeric coercion is done at the C level was significantly modified.  This
+will only affect the authors of C extensions to Python, allowing them more
+flexibility in writing extension types that support numeric operations.
+
+Extension types can now set the type flag ``Py_TPFLAGS_CHECKTYPES`` in their
+``PyTypeObject`` structure to indicate that they support the new coercion model.
+In such extension types, the numeric slot functions can no longer assume that
+they'll be passed two arguments of the same type; instead they may be passed two
+arguments of differing types, and can then perform their own internal coercion.
+If the slot function is passed a type it can't handle, it can indicate the
+failure by returning a reference to the ``Py_NotImplemented`` singleton value.
+The numeric functions of the other type will then be tried, and perhaps they can
+handle the operation; if the other type also returns ``Py_NotImplemented``, then
+a :exc:`TypeError` will be raised.  Numeric methods written in Python can also
+return ``Py_NotImplemented``, causing the interpreter to act as if the method
+did not exist (perhaps raising a :exc:`TypeError`, perhaps trying another
+object's numeric methods).
+
+
+.. seealso::
+
+   :pep:`208` - Reworking the Coercion Model
+      Written and implemented by Neil Schemenauer, heavily based upon earlier work by
+      Marc-André Lemburg.  Read this to understand the fine points of how numeric
+      operations will now be processed at the C level.
+
+.. % ======================================================================
+
+
+PEP 241: Metadata in Python Packages
+====================================
+
+A common complaint from Python users is that there's no single catalog of all
+the Python modules in existence.  T. Middleton's Vaults of Parnassus at
+http://www.vex.net/parnassus/ are the largest catalog of Python modules, but
+registering software at the Vaults is optional, and many people don't bother.
+
+As a first small step toward fixing the problem, Python software packaged using
+the Distutils :command:`sdist` command will include a file named
+:file:`PKG-INFO` containing information about the package such as its name,
+version, and author (metadata, in cataloguing terminology).  PEP 241 contains
+the full list of fields that can be present in the :file:`PKG-INFO` file.  As
+people began to package their software using Python 2.1, more and more packages
+will include metadata, making it possible to build automated cataloguing systems
+and experiment with them.  With the result experience, perhaps it'll be possible
+to design a really good catalog and then build support for it into Python 2.2.
+For example, the Distutils :command:`sdist` and :command:`bdist_\*` commands
+could support a :option:`upload` option that would automatically upload your
+package to a catalog server.
+
+You can start creating packages containing :file:`PKG-INFO` even if you're not
+using Python 2.1, since a new release of the Distutils will be made for users of
+earlier Python versions.  Version 1.0.2 of the Distutils includes the changes
+described in PEP 241, as well as various bugfixes and enhancements.  It will be
+available from  the Distutils SIG at http://www.python.org/sigs/distutils-sig/.
+
+
+.. seealso::
+
+   :pep:`241` - Metadata for Python Software Packages
+      Written and implemented by A.M. Kuchling.
+
+   :pep:`243` - Module Repository Upload Mechanism
+      Written by Sean Reifschneider, this draft PEP describes a proposed mechanism for
+      uploading  Python packages to a central server.
+
+.. % ======================================================================
+
+
+New and Improved Modules
+========================
+
+* Ka-Ping Yee contributed two new modules: :mod:`inspect.py`, a module for
+  getting information about live Python code, and :mod:`pydoc.py`, a module for
+  interactively converting docstrings to HTML or text.  As a bonus,
+  :file:`Tools/scripts/pydoc`, which is now automatically installed, uses
+  :mod:`pydoc.py` to display documentation given a Python module, package, or
+  class name.  For example, ``pydoc xml.dom`` displays the following::
+
+     Python Library Documentation: package xml.dom in xml
+
+     NAME
+         xml.dom - W3C Document Object Model implementation for Python.
+
+     FILE
+         /usr/local/lib/python2.1/xml/dom/__init__.pyc
+
+     DESCRIPTION
+         The Python mapping of the Document Object Model is documented in the
+         Python Library Reference in the section on the xml.dom package.
+
+         This package contains the following modules:
+           ...
+
+  :file:`pydoc` also includes a Tk-based interactive help browser.   :file:`pydoc`
+  quickly becomes addictive; try it out!
+
+* Two different modules for unit testing were added to the standard library.
+  The :mod:`doctest` module, contributed by Tim Peters, provides a testing
+  framework based on running embedded examples in docstrings and comparing the
+  results against the expected output.  PyUnit, contributed by Steve Purcell, is a
+  unit testing framework inspired by JUnit, which was in turn an adaptation of
+  Kent Beck's Smalltalk testing framework.  See http://pyunit.sourceforge.net/ for
+  more information about PyUnit.
+
+* The :mod:`difflib` module contains a class, :class:`SequenceMatcher`, which
+  compares two sequences and computes the changes required to transform one
+  sequence into the other.  For example, this module can be used to write a tool
+  similar to the Unix :program:`diff` program, and in fact the sample program
+  :file:`Tools/scripts/ndiff.py` demonstrates how to write such a script.
+
+* :mod:`curses.panel`, a wrapper for the panel library, part of ncurses and of
+  SYSV curses, was contributed by Thomas Gellekum.  The panel library provides
+  windows with the additional feature of depth. Windows can be moved higher or
+  lower in the depth ordering, and the panel library figures out where panels
+  overlap and which sections are visible.
+
+* The PyXML package has gone through a few releases since Python 2.0, and Python
+  2.1 includes an updated version of the :mod:`xml` package.  Some of the
+  noteworthy changes include support for Expat 1.2 and later versions, the ability
+  for Expat parsers to handle files in any encoding supported by Python, and
+  various bugfixes for SAX, DOM, and the :mod:`minidom` module.
+
+* Ping also contributed another hook for handling uncaught exceptions.
+  :func:`sys.excepthook` can be set to a callable object.  When an exception isn't
+  caught by any :keyword:`try`...\ :keyword:`except` blocks, the exception will be
+  passed to :func:`sys.excepthook`, which can then do whatever it likes.  At the
+  Ninth Python Conference, Ping demonstrated an application for this hook:
+  printing an extended traceback that not only lists the stack frames, but also
+  lists the function arguments and the local variables for each frame.
+
+* Various functions in the :mod:`time` module, such as :func:`asctime` and
+  :func:`localtime`, require a floating point argument containing the time in
+  seconds since the epoch.  The most common use of these functions is to work with
+  the current time, so the floating point argument has been made optional; when a
+  value isn't provided, the current time will be used.  For example, log file
+  entries usually need a string containing the current time; in Python 2.1,
+  ``time.asctime()`` can be used, instead of the lengthier
+  ``time.asctime(time.localtime(time.time()))`` that was previously required.
+
+  This change was proposed and implemented by Thomas Wouters.
+
+* The :mod:`ftplib` module now defaults to retrieving files in passive mode,
+  because passive mode is more likely to work from behind a firewall.  This
+  request came from the Debian bug tracking system, since other Debian packages
+  use :mod:`ftplib` to retrieve files and then don't work from behind a firewall.
+  It's deemed unlikely that this will cause problems for anyone, because Netscape
+  defaults to passive mode and few people complain, but if passive mode is
+  unsuitable for your application or network setup, call :meth:`set_pasv(0)` on
+  FTP objects to disable passive mode.
+
+* Support for raw socket access has been added to the :mod:`socket` module,
+  contributed by Grant Edwards.
+
+* The :mod:`pstats` module now contains a simple interactive statistics browser
+  for displaying timing profiles for Python programs, invoked when the module is
+  run as a script.  Contributed by  Eric S. Raymond.
+
+* A new implementation-dependent function, :func:`sys._getframe([depth])`, has
+  been added to return a given frame object from the current call stack.
+  :func:`sys._getframe` returns the frame at the top of the call stack;  if the
+  optional integer argument *depth* is supplied, the function returns the frame
+  that is *depth* calls below the top of the stack.  For example,
+  ``sys._getframe(1)`` returns the caller's frame object.
+
+  This function is only present in CPython, not in Jython or the .NET
+  implementation.  Use it for debugging, and resist the temptation to put it into
+  production code.
+
+.. % ======================================================================
+
+
+Other Changes and Fixes
+=======================
+
+There were relatively few smaller changes made in Python 2.1 due to the shorter
+release cycle.  A search through the CVS change logs turns up 117 patches
+applied, and 136 bugs fixed; both figures are likely to be underestimates.  Some
+of the more notable changes are:
+
+* A specialized object allocator is now optionally available, that should be
+  faster than the system :func:`malloc` and have less memory overhead.  The
+  allocator uses C's :func:`malloc` function to get large pools of memory, and
+  then fulfills smaller memory requests from these pools.  It can be enabled by
+  providing the :option:`--with-pymalloc` option to the :program:`configure`
+  script; see :file:`Objects/obmalloc.c` for the implementation details.
+
+  Authors of C extension modules should test their code with the object allocator
+  enabled, because some incorrect code may break, causing core dumps at runtime.
+  There are a bunch of memory allocation functions in Python's C API that have
+  previously been just aliases for the C library's :func:`malloc` and
+  :func:`free`, meaning that if you accidentally called mismatched functions, the
+  error wouldn't be noticeable.  When the object allocator is enabled, these
+  functions aren't aliases of :func:`malloc` and :func:`free` any more, and
+  calling the wrong function to free memory will get you a core dump.  For
+  example, if memory was allocated using :func:`PyMem_New`, it has to be freed
+  using :func:`PyMem_Del`, not :func:`free`.  A few modules included with Python
+  fell afoul of this and had to be fixed; doubtless there are more third-party
+  modules that will have the same problem.
+
+  The object allocator was contributed by Vladimir Marangozov.
+
+* The speed of line-oriented file I/O has been improved because people often
+  complain about its lack of speed, and because it's often been used as a naïve
+  benchmark.  The :meth:`readline` method of file objects has therefore been
+  rewritten to be much faster.  The exact amount of the speedup will vary from
+  platform to platform depending on how slow the C library's :func:`getc` was, but
+  is around 66%, and potentially much faster on some particular operating systems.
+  Tim Peters did much of the benchmarking and coding for this change, motivated by
+  a discussion in comp.lang.python.
+
+  A new module and method for file objects was also added, contributed by Jeff
+  Epler. The new method, :meth:`xreadlines`, is similar to the existing
+  :func:`xrange` built-in.  :func:`xreadlines` returns an opaque sequence object
+  that only supports being iterated over, reading a line on every iteration but
+  not reading the entire file into memory as the existing :meth:`readlines` method
+  does. You'd use it like this::
+
+     for line in sys.stdin.xreadlines():
+         # ... do something for each line ...
+         ...
+
+  For a fuller discussion of the line I/O changes, see the python-dev summary for
+  January 1-15, 2001 at http://www.python.org/dev/summary/2001-01-1.html.
+
+* A new method, :meth:`popitem`, was added to dictionaries to enable
+  destructively iterating through the contents of a dictionary; this can be faster
+  for large dictionaries because there's no need to construct a list containing
+  all the keys or values. ``D.popitem()`` removes a random ``(key, value)`` pair
+  from the dictionary ``D`` and returns it as a 2-tuple.  This was implemented
+  mostly by Tim Peters and Guido van Rossum, after a suggestion and preliminary
+  patch by Moshe Zadka.
+
+* Modules can now control which names are imported when ``from module import *``
+  is used, by defining an ``__all__`` attribute containing a list of names that
+  will be imported.  One common complaint is that if the module imports other
+  modules such as :mod:`sys` or :mod:`string`, ``from module import *`` will add
+  them to the importing module's namespace.  To fix this, simply list the public
+  names in ``__all__``::
+
+     # List public names
+     __all__ = ['Database', 'open']
+
+  A stricter version of this patch was first suggested and implemented by Ben
+  Wolfson, but after some python-dev discussion, a weaker final version was
+  checked in.
+
+* Applying :func:`repr` to strings previously used octal escapes for
+  non-printable characters; for example, a newline was ``'\012'``.  This was a
+  vestigial trace of Python's C ancestry, but today octal is of very little
+  practical use.  Ka-Ping Yee suggested using hex escapes instead of octal ones,
+  and using the ``\n``, ``\t``, ``\r`` escapes for the appropriate characters,
+  and implemented this new formatting.
+
+* Syntax errors detected at compile-time can now raise exceptions containing the
+  filename and line number of the error, a pleasant side effect of the compiler
+  reorganization done by Jeremy Hylton.
+
+* C extensions which import other modules have been changed to use
+  :func:`PyImport_ImportModule`, which means that they will use any import hooks
+  that have been installed.  This is also encouraged for third-party extensions
+  that need to import some other module from C code.
+
+* The size of the Unicode character database was shrunk by another 340K thanks
+  to Fredrik Lundh.
+
+* Some new ports were contributed: MacOS X (by Steven Majewski), Cygwin (by
+  Jason Tishler); RISCOS (by Dietmar Schwertberger); Unixware 7  (by Billy G.
+  Allie).
+
+And there's the usual list of minor bugfixes, minor memory leaks, docstring
+edits, and other tweaks, too lengthy to be worth itemizing; see the CVS logs for
+the full details if you want them.
+
+.. % ======================================================================
+
+
+Acknowledgements
+================
+
+The author would like to thank the following people for offering suggestions on
+various drafts of this article: Graeme Cross, David Goodger, Jay Graves, Michael
+Hudson, Marc-André Lemburg, Fredrik Lundh, Neil Schemenauer, Thomas Wouters.
+
diff --git a/Doc/whatsnew/2.2.rst b/Doc/whatsnew/2.2.rst
new file mode 100644
index 0000000..6a7e0e8
--- /dev/null
+++ b/Doc/whatsnew/2.2.rst
@@ -0,0 +1,1269 @@
+****************************
+  What's New in Python 2.2  
+****************************
+
+:Author: A.M. Kuchling
+
+.. |release| replace:: 1.02
+
+.. % $Id: whatsnew22.tex 37315 2004-09-10 19:33:00Z akuchling $
+
+
+Introduction
+============
+
+This article explains the new features in Python 2.2.2, released on October 14,
+2002.  Python 2.2.2 is a bugfix release of Python 2.2, originally released on
+December 21, 2001.
+
+Python 2.2 can be thought of as the "cleanup release".  There are some features
+such as generators and iterators that are completely new, but most of the
+changes, significant and far-reaching though they may be, are aimed at cleaning
+up irregularities and dark corners of the language design.
+
+This article doesn't attempt to provide a complete specification of the new
+features, but instead provides a convenient overview.  For full details, you
+should refer to the documentation for Python 2.2, such as the `Python Library
+Reference <http://www.python.org/doc/2.2/lib/lib.html>`_ and the `Python
+Reference Manual <http://www.python.org/doc/2.2/ref/ref.html>`_.  If you want to
+understand the complete implementation and design rationale for a change, refer
+to the PEP for a particular new feature.
+
+
+.. seealso::
+
+   http://www.unixreview.com/documents/s=1356/urm0109h/0109h.htm
+      "What's So Special About Python 2.2?" is also about the new 2.2 features, and
+      was written by Cameron Laird and Kathryn Soraiz.
+
+.. % ======================================================================
+
+
+PEPs 252 and 253: Type and Class Changes
+========================================
+
+The largest and most far-reaching changes in Python 2.2 are to Python's model of
+objects and classes.  The changes should be backward compatible, so it's likely
+that your code will continue to run unchanged, but the changes provide some
+amazing new capabilities. Before beginning this, the longest and most
+complicated section of this article, I'll provide an overview of the changes and
+offer some comments.
+
+A long time ago I wrote a Web page (http://www.amk.ca/python/writing/warts.html)
+listing flaws in Python's design.  One of the most significant flaws was that
+it's impossible to subclass Python types implemented in C.  In particular, it's
+not possible to subclass built-in types, so you can't just subclass, say, lists
+in order to add a single useful method to them. The :mod:`UserList` module
+provides a class that supports all of the methods of lists and that can be
+subclassed further, but there's lots of C code that expects a regular Python
+list and won't accept a :class:`UserList` instance.
+
+Python 2.2 fixes this, and in the process adds some exciting new capabilities.
+A brief summary:
+
+* You can subclass built-in types such as lists and even integers, and your
+  subclasses should work in every place that requires the original type.
+
+* It's now possible to define static and class methods, in addition to the
+  instance methods available in previous versions of Python.
+
+* It's also possible to automatically call methods on accessing or setting an
+  instance attribute by using a new mechanism called :dfn:`properties`.  Many uses
+  of :meth:`__getattr__` can be rewritten to use properties instead, making the
+  resulting code simpler and faster.  As a small side benefit, attributes can now
+  have docstrings, too.
+
+* The list of legal attributes for an instance can be limited to a particular
+  set using :dfn:`slots`, making it possible to safeguard against typos and
+  perhaps make more optimizations possible in future versions of Python.
+
+Some users have voiced concern about all these changes.  Sure, they say, the new
+features are neat and lend themselves to all sorts of tricks that weren't
+possible in previous versions of Python, but they also make the language more
+complicated.  Some people have said that they've always recommended Python for
+its simplicity, and feel that its simplicity is being lost.
+
+Personally, I think there's no need to worry.  Many of the new features are
+quite esoteric, and you can write a lot of Python code without ever needed to be
+aware of them.  Writing a simple class is no more difficult than it ever was, so
+you don't need to bother learning or teaching them unless they're actually
+needed.  Some very complicated tasks that were previously only possible from C
+will now be possible in pure Python, and to my mind that's all for the better.
+
+I'm not going to attempt to cover every single corner case and small change that
+were required to make the new features work.  Instead this section will paint
+only the broad strokes.  See section :ref:`sect-rellinks`, "Related Links", for
+further sources of information about Python 2.2's new object model.
+
+
+Old and New Classes
+-------------------
+
+First, you should know that Python 2.2 really has two kinds of classes: classic
+or old-style classes, and new-style classes.  The old-style class model is
+exactly the same as the class model in earlier versions of Python.  All the new
+features described in this section apply only to new-style classes. This
+divergence isn't intended to last forever; eventually old-style classes will be
+dropped, possibly in Python 3.0.
+
+So how do you define a new-style class?  You do it by subclassing an existing
+new-style class.  Most of Python's built-in types, such as integers, lists,
+dictionaries, and even files, are new-style classes now.  A new-style class
+named :class:`object`, the base class for all built-in types, has also been
+added so if no built-in type is suitable, you can just subclass
+:class:`object`::
+
+   class C(object):
+       def __init__ (self):
+           ...
+       ...
+
+This means that :keyword:`class` statements that don't have any base classes are
+always classic classes in Python 2.2.  (Actually you can also change this by
+setting a module-level variable named :attr:`__metaclass__` --- see :pep:`253`
+for the details --- but it's easier to just subclass :keyword:`object`.)
+
+The type objects for the built-in types are available as built-ins, named using
+a clever trick.  Python has always had built-in functions named :func:`int`,
+:func:`float`, and :func:`str`.  In 2.2, they aren't functions any more, but
+type objects that behave as factories when called. ::
+
+   >>> int
+   <type 'int'>
+   >>> int('123')
+   123
+
+To make the set of types complete, new type objects such as :func:`dict` and
+:func:`file` have been added.  Here's a more interesting example, adding a
+:meth:`lock` method to file objects::
+
+   class LockableFile(file):
+       def lock (self, operation, length=0, start=0, whence=0):
+           import fcntl
+           return fcntl.lockf(self.fileno(), operation,
+                              length, start, whence)
+
+The now-obsolete :mod:`posixfile` module contained a class that emulated all of
+a file object's methods and also added a :meth:`lock` method, but this class
+couldn't be passed to internal functions that expected a built-in file,
+something which is possible with our new :class:`LockableFile`.
+
+
+Descriptors
+-----------
+
+In previous versions of Python, there was no consistent way to discover what
+attributes and methods were supported by an object. There were some informal
+conventions, such as defining :attr:`__members__` and :attr:`__methods__`
+attributes that were lists of names, but often the author of an extension type
+or a class wouldn't bother to define them.  You could fall back on inspecting
+the :attr:`__dict__` of an object, but when class inheritance or an arbitrary
+:meth:`__getattr__` hook were in use this could still be inaccurate.
+
+The one big idea underlying the new class model is that an API for describing
+the attributes of an object using :dfn:`descriptors` has been formalized.
+Descriptors specify the value of an attribute, stating whether it's a method or
+a field.  With the descriptor API, static methods and class methods become
+possible, as well as more exotic constructs.
+
+Attribute descriptors are objects that live inside class objects, and have a few
+attributes of their own:
+
+* :attr:`__name__` is the attribute's name.
+
+* :attr:`__doc__` is the attribute's docstring.
+
+* :meth:`__get__(object)` is a method that retrieves the attribute value from
+  *object*.
+
+* :meth:`__set__(object, value)` sets the attribute on *object* to *value*.
+
+* :meth:`__delete__(object, value)` deletes the *value*  attribute of *object*.
+
+For example, when you write ``obj.x``, the steps that Python actually performs
+are::
+
+   descriptor = obj.__class__.x
+   descriptor.__get__(obj)
+
+For methods, :meth:`descriptor.__get__` returns a temporary object that's
+callable, and wraps up the instance and the method to be called on it. This is
+also why static methods and class methods are now possible; they have
+descriptors that wrap up just the method, or the method and the class.  As a
+brief explanation of these new kinds of methods, static methods aren't passed
+the instance, and therefore resemble regular functions.  Class methods are
+passed the class of the object, but not the object itself.  Static and class
+methods are defined like this::
+
+   class C(object):
+       def f(arg1, arg2):
+           ...
+       f = staticmethod(f)
+
+       def g(cls, arg1, arg2):
+           ...
+       g = classmethod(g)
+
+The :func:`staticmethod` function takes the function :func:`f`, and returns it
+wrapped up in a descriptor so it can be stored in the class object.  You might
+expect there to be special syntax for creating such methods (``def static f``,
+``defstatic f()``, or something like that) but no such syntax has been defined
+yet; that's been left for future versions of Python.
+
+More new features, such as slots and properties, are also implemented as new
+kinds of descriptors, and it's not difficult to write a descriptor class that
+does something novel.  For example, it would be possible to write a descriptor
+class that made it possible to write Eiffel-style preconditions and
+postconditions for a method.  A class that used this feature might be defined
+like this::
+
+   from eiffel import eiffelmethod
+
+   class C(object):
+       def f(self, arg1, arg2):
+           # The actual function
+           ...
+       def pre_f(self):
+           # Check preconditions
+           ...
+       def post_f(self):
+           # Check postconditions
+           ...
+
+       f = eiffelmethod(f, pre_f, post_f)
+
+Note that a person using the new :func:`eiffelmethod` doesn't have to understand
+anything about descriptors.  This is why I think the new features don't increase
+the basic complexity of the language. There will be a few wizards who need to
+know about it in order to write :func:`eiffelmethod` or the ZODB or whatever,
+but most users will just write code on top of the resulting libraries and ignore
+the implementation details.
+
+
+Multiple Inheritance: The Diamond Rule
+--------------------------------------
+
+Multiple inheritance has also been made more useful through changing the rules
+under which names are resolved.  Consider this set of classes (diagram taken
+from :pep:`253` by Guido van Rossum)::
+
+         class A:
+           ^ ^  def save(self): ...
+          /   \
+         /     \
+        /       \
+       /         \
+   class B     class C:
+       ^         ^  def save(self): ...
+        \       /
+         \     /
+          \   /
+           \ /
+         class D
+
+The lookup rule for classic classes is simple but not very smart; the base
+classes are searched depth-first, going from left to right.  A reference to
+:meth:`D.save` will search the classes :class:`D`, :class:`B`, and then
+:class:`A`, where :meth:`save` would be found and returned.  :meth:`C.save`
+would never be found at all.  This is bad, because if :class:`C`'s :meth:`save`
+method is saving some internal state specific to :class:`C`, not calling it will
+result in that state never getting saved.
+
+New-style classes follow a different algorithm that's a bit more complicated to
+explain, but does the right thing in this situation. (Note that Python 2.3
+changes this algorithm to one that produces the same results in most cases, but
+produces more useful results for really complicated inheritance graphs.)
+
+#. List all the base classes, following the classic lookup rule and include a
+   class multiple times if it's visited repeatedly.  In the above example, the list
+   of visited classes is [:class:`D`, :class:`B`, :class:`A`, :class:`C`,
+   :class:`A`].
+
+#. Scan the list for duplicated classes.  If any are found, remove all but one
+   occurrence, leaving the *last* one in the list.  In the above example, the list
+   becomes [:class:`D`, :class:`B`, :class:`C`, :class:`A`] after dropping
+   duplicates.
+
+Following this rule, referring to :meth:`D.save` will return :meth:`C.save`,
+which is the behaviour we're after.  This lookup rule is the same as the one
+followed by Common Lisp.  A new built-in function, :func:`super`, provides a way
+to get at a class's superclasses without having to reimplement Python's
+algorithm. The most commonly used form will be  :func:`super(class, obj)`, which
+returns  a bound superclass object (not the actual class object).  This form
+will be used in methods to call a method in the superclass; for example,
+:class:`D`'s :meth:`save` method would look like this::
+
+   class D (B,C):
+       def save (self):
+   	# Call superclass .save()
+           super(D, self).save()
+           # Save D's private information here
+           ...
+
+:func:`super` can also return unbound superclass objects when called as
+:func:`super(class)` or :func:`super(class1, class2)`, but this probably won't
+often be useful.
+
+
+Attribute Access
+----------------
+
+A fair number of sophisticated Python classes define hooks for attribute access
+using :meth:`__getattr__`; most commonly this is done for convenience, to make
+code more readable by automatically mapping an attribute access such as
+``obj.parent`` into a method call such as ``obj.get_parent``.  Python 2.2 adds
+some new ways of controlling attribute access.
+
+First, :meth:`__getattr__(attr_name)` is still supported by new-style classes,
+and nothing about it has changed.  As before, it will be called when an attempt
+is made to access ``obj.foo`` and no attribute named ``foo`` is found in the
+instance's dictionary.
+
+New-style classes also support a new method,
+:meth:`__getattribute__(attr_name)`.  The difference between the two methods is
+that :meth:`__getattribute__` is *always* called whenever any attribute is
+accessed, while the old :meth:`__getattr__` is only called if ``foo`` isn't
+found in the instance's dictionary.
+
+However, Python 2.2's support for :dfn:`properties` will often be a simpler way
+to trap attribute references.  Writing a :meth:`__getattr__` method is
+complicated because to avoid recursion you can't use regular attribute accesses
+inside them, and instead have to mess around with the contents of
+:attr:`__dict__`. :meth:`__getattr__` methods also end up being called by Python
+when it checks for other methods such as :meth:`__repr__` or :meth:`__coerce__`,
+and so have to be written with this in mind. Finally, calling a function on
+every attribute access results in a sizable performance loss.
+
+:class:`property` is a new built-in type that packages up three functions that
+get, set, or delete an attribute, and a docstring.  For example, if you want to
+define a :attr:`size` attribute that's computed, but also settable, you could
+write::
+
+   class C(object):
+       def get_size (self):
+           result = ... computation ...
+           return result
+       def set_size (self, size):
+           ... compute something based on the size
+           and set internal state appropriately ...
+
+       # Define a property.  The 'delete this attribute'
+       # method is defined as None, so the attribute
+       # can't be deleted.
+       size = property(get_size, set_size,
+                       None,
+                       "Storage size of this instance")
+
+That is certainly clearer and easier to write than a pair of
+:meth:`__getattr__`/:meth:`__setattr__` methods that check for the :attr:`size`
+attribute and handle it specially while retrieving all other attributes from the
+instance's :attr:`__dict__`.  Accesses to :attr:`size` are also the only ones
+which have to perform the work of calling a function, so references to other
+attributes run at their usual speed.
+
+Finally, it's possible to constrain the list of attributes that can be
+referenced on an object using the new :attr:`__slots__` class attribute. Python
+objects are usually very dynamic; at any time it's possible to define a new
+attribute on an instance by just doing ``obj.new_attr=1``.   A new-style class
+can define a class attribute named :attr:`__slots__` to limit the legal
+attributes  to a particular set of names.  An example will make this clear::
+
+   >>> class C(object):
+   ...     __slots__ = ('template', 'name')
+   ...
+   >>> obj = C()
+   >>> print obj.template
+   None
+   >>> obj.template = 'Test'
+   >>> print obj.template
+   Test
+   >>> obj.newattr = None
+   Traceback (most recent call last):
+     File "<stdin>", line 1, in ?
+   AttributeError: 'C' object has no attribute 'newattr'
+
+Note how you get an :exc:`AttributeError` on the attempt to assign to an
+attribute not listed in :attr:`__slots__`.
+
+
+.. _sect-rellinks:
+
+Related Links
+-------------
+
+This section has just been a quick overview of the new features, giving enough
+of an explanation to start you programming, but many details have been
+simplified or ignored.  Where should you go to get a more complete picture?
+
+http://www.python.org/2.2/descrintro.html is a lengthy tutorial introduction to
+the descriptor features, written by Guido van Rossum. If my description has
+whetted your appetite, go read this tutorial next, because it goes into much
+more detail about the new features while still remaining quite easy to read.
+
+Next, there are two relevant PEPs, :pep:`252` and :pep:`253`.  :pep:`252` is
+titled "Making Types Look More Like Classes", and covers the descriptor API.
+:pep:`253` is titled "Subtyping Built-in Types", and describes the changes to
+type objects that make it possible to subtype built-in objects.  :pep:`253` is
+the more complicated PEP of the two, and at a few points the necessary
+explanations of types and meta-types may cause your head to explode.  Both PEPs
+were written and implemented by Guido van Rossum, with substantial assistance
+from the rest of the Zope Corp. team.
+
+Finally, there's the ultimate authority: the source code.  Most of the machinery
+for the type handling is in :file:`Objects/typeobject.c`, but you should only
+resort to it after all other avenues have been exhausted, including posting a
+question to python-list or python-dev.
+
+.. % ======================================================================
+
+
+PEP 234: Iterators
+==================
+
+Another significant addition to 2.2 is an iteration interface at both the C and
+Python levels.  Objects can define how they can be looped over by callers.
+
+In Python versions up to 2.1, the usual way to make ``for item in obj`` work is
+to define a :meth:`__getitem__` method that looks something like this::
+
+   def __getitem__(self, index):
+       return <next item>
+
+:meth:`__getitem__` is more properly used to define an indexing operation on an
+object so that you can write ``obj[5]`` to retrieve the sixth element.  It's a
+bit misleading when you're using this only to support :keyword:`for` loops.
+Consider some file-like object that wants to be looped over; the *index*
+parameter is essentially meaningless, as the class probably assumes that a
+series of :meth:`__getitem__` calls will be made with *index* incrementing by
+one each time.  In other words, the presence of the :meth:`__getitem__` method
+doesn't mean that using ``file[5]``  to randomly access the sixth element will
+work, though it really should.
+
+In Python 2.2, iteration can be implemented separately, and :meth:`__getitem__`
+methods can be limited to classes that really do support random access.  The
+basic idea of iterators is  simple.  A new built-in function, :func:`iter(obj)`
+or ``iter(C, sentinel)``, is used to get an iterator. :func:`iter(obj)` returns
+an iterator for the object *obj*, while ``iter(C, sentinel)`` returns an
+iterator that will invoke the callable object *C* until it returns *sentinel* to
+signal that the iterator is done.
+
+Python classes can define an :meth:`__iter__` method, which should create and
+return a new iterator for the object; if the object is its own iterator, this
+method can just return ``self``.  In particular, iterators will usually be their
+own iterators.  Extension types implemented in C can implement a :attr:`tp_iter`
+function in order to return an iterator, and extension types that want to behave
+as iterators can define a :attr:`tp_iternext` function.
+
+So, after all this, what do iterators actually do?  They have one required
+method, :meth:`next`, which takes no arguments and returns the next value.  When
+there are no more values to be returned, calling :meth:`next` should raise the
+:exc:`StopIteration` exception. ::
+
+   >>> L = [1,2,3]
+   >>> i = iter(L)
+   >>> print i
+   <iterator object at 0x8116870>
+   >>> i.next()
+   1
+   >>> i.next()
+   2
+   >>> i.next()
+   3
+   >>> i.next()
+   Traceback (most recent call last):
+     File "<stdin>", line 1, in ?
+   StopIteration
+   >>>      
+
+In 2.2, Python's :keyword:`for` statement no longer expects a sequence; it
+expects something for which :func:`iter` will return an iterator. For backward
+compatibility and convenience, an iterator is automatically constructed for
+sequences that don't implement :meth:`__iter__` or a :attr:`tp_iter` slot, so
+``for i in [1,2,3]`` will still work.  Wherever the Python interpreter loops
+over a sequence, it's been changed to use the iterator protocol.  This means you
+can do things like this::
+
+   >>> L = [1,2,3]
+   >>> i = iter(L)
+   >>> a,b,c = i
+   >>> a,b,c
+   (1, 2, 3)
+
+Iterator support has been added to some of Python's basic types.   Calling
+:func:`iter` on a dictionary will return an iterator which loops over its keys::
+
+   >>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
+   ...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
+   >>> for key in m: print key, m[key]
+   ...
+   Mar 3
+   Feb 2
+   Aug 8
+   Sep 9
+   May 5
+   Jun 6
+   Jul 7
+   Jan 1
+   Apr 4
+   Nov 11
+   Dec 12
+   Oct 10
+
+That's just the default behaviour.  If you want to iterate over keys, values, or
+key/value pairs, you can explicitly call the :meth:`iterkeys`,
+:meth:`itervalues`, or :meth:`iteritems` methods to get an appropriate iterator.
+In a minor related change, the :keyword:`in` operator now works on dictionaries,
+so ``key in dict`` is now equivalent to ``dict.has_key(key)``.
+
+Files also provide an iterator, which calls the :meth:`readline` method until
+there are no more lines in the file.  This means you can now read each line of a
+file using code like this::
+
+   for line in file:
+       # do something for each line
+       ...
+
+Note that you can only go forward in an iterator; there's no way to get the
+previous element, reset the iterator, or make a copy of it. An iterator object
+could provide such additional capabilities, but the iterator protocol only
+requires a :meth:`next` method.
+
+
+.. seealso::
+
+   :pep:`234` - Iterators
+      Written by Ka-Ping Yee and GvR; implemented  by the Python Labs crew, mostly by
+      GvR and Tim Peters.
+
+.. % ======================================================================
+
+
+PEP 255: Simple Generators
+==========================
+
+Generators are another new feature, one that interacts with the introduction of
+iterators.
+
+You're doubtless familiar with how function calls work in Python or C.  When you
+call a function, it gets a private namespace where its local variables are
+created.  When the function reaches a :keyword:`return` statement, the local
+variables are destroyed and the resulting value is returned to the caller.  A
+later call to the same function will get a fresh new set of local variables.
+But, what if the local variables weren't thrown away on exiting a function?
+What if you could later resume the function where it left off?  This is what
+generators provide; they can be thought of as resumable functions.
+
+Here's the simplest example of a generator function::
+
+   def generate_ints(N):
+       for i in range(N):
+           yield i
+
+A new keyword, :keyword:`yield`, was introduced for generators.  Any function
+containing a :keyword:`yield` statement is a generator function; this is
+detected by Python's bytecode compiler which compiles the function specially as
+a result.  Because a new keyword was introduced, generators must be explicitly
+enabled in a module by including a ``from __future__ import generators``
+statement near the top of the module's source code.  In Python 2.3 this
+statement will become unnecessary.
+
+When you call a generator function, it doesn't return a single value; instead it
+returns a generator object that supports the iterator protocol.  On executing
+the :keyword:`yield` statement, the generator outputs the value of ``i``,
+similar to a :keyword:`return` statement.  The big difference between
+:keyword:`yield` and a :keyword:`return` statement is that on reaching a
+:keyword:`yield` the generator's state of execution is suspended and local
+variables are preserved.  On the next call to the generator's ``next()`` method,
+the function will resume executing immediately after the :keyword:`yield`
+statement.  (For complicated reasons, the :keyword:`yield` statement isn't
+allowed inside the :keyword:`try` block of a :keyword:`try`...\
+:keyword:`finally` statement; read :pep:`255` for a full explanation of the
+interaction between :keyword:`yield` and exceptions.)
+
+Here's a sample usage of the :func:`generate_ints` generator::
+
+   >>> gen = generate_ints(3)
+   >>> gen
+   <generator object at 0x8117f90>
+   >>> gen.next()
+   0
+   >>> gen.next()
+   1
+   >>> gen.next()
+   2
+   >>> gen.next()
+   Traceback (most recent call last):
+     File "<stdin>", line 1, in ?
+     File "<stdin>", line 2, in generate_ints
+   StopIteration
+
+You could equally write ``for i in generate_ints(5)``, or ``a,b,c =
+generate_ints(3)``.
+
+Inside a generator function, the :keyword:`return` statement can only be used
+without a value, and signals the end of the procession of values; afterwards the
+generator cannot return any further values. :keyword:`return` with a value, such
+as ``return 5``, is a syntax error inside a generator function.  The end of the
+generator's results can also be indicated by raising :exc:`StopIteration`
+manually, or by just letting the flow of execution fall off the bottom of the
+function.
+
+You could achieve the effect of generators manually by writing your own class
+and storing all the local variables of the generator as instance variables.  For
+example, returning a list of integers could be done by setting ``self.count`` to
+0, and having the :meth:`next` method increment ``self.count`` and return it.
+However, for a moderately complicated generator, writing a corresponding class
+would be much messier. :file:`Lib/test/test_generators.py` contains a number of
+more interesting examples.  The simplest one implements an in-order traversal of
+a tree using generators recursively. ::
+
+   # A recursive generator that generates Tree leaves in in-order.
+   def inorder(t):
+       if t:
+           for x in inorder(t.left):
+               yield x
+           yield t.label
+           for x in inorder(t.right):
+               yield x
+
+Two other examples in :file:`Lib/test/test_generators.py` produce solutions for
+the N-Queens problem (placing $N$ queens on an $NxN$ chess board so that no
+queen threatens another) and the Knight's Tour (a route that takes a knight to
+every square of an $NxN$ chessboard without visiting any square twice).
+
+The idea of generators comes from other programming languages, especially Icon
+(http://www.cs.arizona.edu/icon/), where the idea of generators is central.  In
+Icon, every expression and function call behaves like a generator.  One example
+from "An Overview of the Icon Programming Language" at
+http://www.cs.arizona.edu/icon/docs/ipd266.htm gives an idea of what this looks
+like::
+
+   sentence := "Store it in the neighboring harbor"
+   if (i := find("or", sentence)) > 5 then write(i)
+
+In Icon the :func:`find` function returns the indexes at which the substring
+"or" is found: 3, 23, 33.  In the :keyword:`if` statement, ``i`` is first
+assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon
+retries it with the second value of 23.  23 is greater than 5, so the comparison
+now succeeds, and the code prints the value 23 to the screen.
+
+Python doesn't go nearly as far as Icon in adopting generators as a central
+concept.  Generators are considered a new part of the core Python language, but
+learning or using them isn't compulsory; if they don't solve any problems that
+you have, feel free to ignore them. One novel feature of Python's interface as
+compared to Icon's is that a generator's state is represented as a concrete
+object (the iterator) that can be passed around to other functions or stored in
+a data structure.
+
+
+.. seealso::
+
+   :pep:`255` - Simple Generators
+      Written by Neil Schemenauer, Tim Peters, Magnus Lie Hetland.  Implemented mostly
+      by Neil Schemenauer and Tim Peters, with other fixes from the Python Labs crew.
+
+.. % ======================================================================
+
+
+PEP 237: Unifying Long Integers and Integers
+============================================
+
+In recent versions, the distinction between regular integers, which are 32-bit
+values on most machines, and long integers, which can be of arbitrary size, was
+becoming an annoyance.  For example, on platforms that support files larger than
+``2**32`` bytes, the :meth:`tell` method of file objects has to return a long
+integer. However, there were various bits of Python that expected plain integers
+and would raise an error if a long integer was provided instead.  For example,
+in Python 1.5, only regular integers could be used as a slice index, and
+``'abc'[1L:]`` would raise a :exc:`TypeError` exception with the message 'slice
+index must be int'.
+
+Python 2.2 will shift values from short to long integers as required. The 'L'
+suffix is no longer needed to indicate a long integer literal, as now the
+compiler will choose the appropriate type.  (Using the 'L' suffix will be
+discouraged in future 2.x versions of Python, triggering a warning in Python
+2.4, and probably dropped in Python 3.0.)  Many operations that used to raise an
+:exc:`OverflowError` will now return a long integer as their result.  For
+example::
+
+   >>> 1234567890123
+   1234567890123L
+   >>> 2 ** 64
+   18446744073709551616L
+
+In most cases, integers and long integers will now be treated identically.  You
+can still distinguish them with the :func:`type` built-in function, but that's
+rarely needed.
+
+
+.. seealso::
+
+   :pep:`237` - Unifying Long Integers and Integers
+      Written by Moshe Zadka and Guido van Rossum.  Implemented mostly by Guido van
+      Rossum.
+
+.. % ======================================================================
+
+
+PEP 238: Changing the Division Operator
+=======================================
+
+The most controversial change in Python 2.2 heralds the start of an effort to
+fix an old design flaw that's been in Python from the beginning. Currently
+Python's division operator, ``/``, behaves like C's division operator when
+presented with two integer arguments: it returns an integer result that's
+truncated down when there would be a fractional part.  For example, ``3/2`` is
+1, not 1.5, and ``(-1)/2`` is -1, not -0.5.  This means that the results of
+divison can vary unexpectedly depending on the type of the two operands and
+because Python is dynamically typed, it can be difficult to determine the
+possible types of the operands.
+
+(The controversy is over whether this is *really* a design flaw, and whether
+it's worth breaking existing code to fix this.  It's caused endless discussions
+on python-dev, and in July 2001 erupted into an storm of acidly sarcastic
+postings on :newsgroup:`comp.lang.python`. I won't argue for either side here
+and will stick to describing what's  implemented in 2.2.  Read :pep:`238` for a
+summary of arguments and counter-arguments.)
+
+Because this change might break code, it's being introduced very gradually.
+Python 2.2 begins the transition, but the switch won't be complete until Python
+3.0.
+
+First, I'll borrow some terminology from :pep:`238`.  "True division" is the
+division that most non-programmers are familiar with: 3/2 is 1.5, 1/4 is 0.25,
+and so forth.  "Floor division" is what Python's ``/`` operator currently does
+when given integer operands; the result is the floor of the value returned by
+true division.  "Classic division" is the current mixed behaviour of ``/``; it
+returns the result of floor division when the operands are integers, and returns
+the result of true division when one of the operands is a floating-point number.
+
+Here are the changes 2.2 introduces:
+
+* A new operator, ``//``, is the floor division operator. (Yes, we know it looks
+  like C++'s comment symbol.)  ``//`` *always* performs floor division no matter
+  what the types of its operands are, so ``1 // 2`` is 0 and ``1.0 // 2.0`` is
+  also 0.0.
+
+  ``//`` is always available in Python 2.2; you don't need to enable it using a
+  ``__future__`` statement.
+
+* By including a ``from __future__ import division`` in a module, the ``/``
+  operator will be changed to return the result of true division, so ``1/2`` is
+  0.5.  Without the ``__future__`` statement, ``/`` still means classic division.
+  The default meaning of ``/`` will not change until Python 3.0.
+
+* Classes can define methods called :meth:`__truediv__` and :meth:`__floordiv__`
+  to overload the two division operators.  At the C level, there are also slots in
+  the :ctype:`PyNumberMethods` structure so extension types can define the two
+  operators.
+
+* Python 2.2 supports some command-line arguments for testing whether code will
+  works with the changed division semantics.  Running python with :option:`-Q
+  warn` will cause a warning to be issued whenever division is applied to two
+  integers.  You can use this to find code that's affected by the change and fix
+  it.  By default, Python 2.2 will simply perform classic division without a
+  warning; the warning will be turned on by default in Python 2.3.
+
+
+.. seealso::
+
+   :pep:`238` - Changing the Division Operator
+      Written by Moshe Zadka and  Guido van Rossum.  Implemented by Guido van Rossum..
+
+.. % ======================================================================
+
+
+Unicode Changes
+===============
+
+Python's Unicode support has been enhanced a bit in 2.2.  Unicode strings are
+usually stored as UCS-2, as 16-bit unsigned integers. Python 2.2 can also be
+compiled to use UCS-4, 32-bit unsigned integers, as its internal encoding by
+supplying :option:`--enable-unicode=ucs4` to the configure script.   (It's also
+possible to specify :option:`--disable-unicode` to completely disable Unicode
+support.)
+
+When built to use UCS-4 (a "wide Python"), the interpreter can natively handle
+Unicode characters from U+000000 to U+110000, so the range of legal values for
+the :func:`unichr` function is expanded accordingly.  Using an interpreter
+compiled to use UCS-2 (a "narrow Python"), values greater than 65535 will still
+cause :func:`unichr` to raise a :exc:`ValueError` exception. This is all
+described in :pep:`261`, "Support for 'wide' Unicode characters"; consult it for
+further details.
+
+Another change is simpler to explain. Since their introduction, Unicode strings
+have supported an :meth:`encode` method to convert the string to a selected
+encoding such as UTF-8 or Latin-1.  A symmetric :meth:`decode([*encoding*])`
+method has been added to 8-bit strings (though not to Unicode strings) in 2.2.
+:meth:`decode` assumes that the string is in the specified encoding and decodes
+it, returning whatever is returned by the codec.
+
+Using this new feature, codecs have been added for tasks not directly related to
+Unicode.  For example, codecs have been added for uu-encoding, MIME's base64
+encoding, and compression with the :mod:`zlib` module::
+
+   >>> s = """Here is a lengthy piece of redundant, overly verbose,
+   ... and repetitive text.
+   ... """
+   >>> data = s.encode('zlib')
+   >>> data
+   'x\x9c\r\xc9\xc1\r\x80 \x10\x04\xc0?Ul...'
+   >>> data.decode('zlib')
+   'Here is a lengthy piece of redundant, overly verbose,\nand repetitive text.\n'
+   >>> print s.encode('uu')
+   begin 666 <data>
+   M2&5R92!I<R!A(&QE;F=T:'D@<&EE8V4@;V8@<F5D=6YD86YT+"!O=F5R;'D@
+   >=F5R8F]S92P*86YD(')E<&5T:71I=F4@=&5X="X*
+
+   end
+   >>> "sheesh".encode('rot-13')
+   'furrfu'
+
+To convert a class instance to Unicode, a :meth:`__unicode__` method can be
+defined by a class, analogous to :meth:`__str__`.
+
+:meth:`encode`, :meth:`decode`, and :meth:`__unicode__` were implemented by
+Marc-André Lemburg.  The changes to support using UCS-4 internally were
+implemented by Fredrik Lundh and Martin von Löwis.
+
+
+.. seealso::
+
+   :pep:`261` - Support for 'wide' Unicode characters
+      Written by Paul Prescod.
+
+.. % ======================================================================
+
+
+PEP 227: Nested Scopes
+======================
+
+In Python 2.1, statically nested scopes were added as an optional feature, to be
+enabled by a ``from __future__ import nested_scopes`` directive.  In 2.2 nested
+scopes no longer need to be specially enabled, and are now always present.  The
+rest of this section is a copy of the description of nested scopes from my
+"What's New in Python 2.1" document; if you read it when 2.1 came out, you can
+skip the rest of this section.
+
+The largest change introduced in Python 2.1, and made complete in 2.2, is to
+Python's scoping rules.  In Python 2.0, at any given time there are at most
+three namespaces used to look up variable names: local, module-level, and the
+built-in namespace.  This often surprised people because it didn't match their
+intuitive expectations.  For example, a nested recursive function definition
+doesn't work::
+
+   def f():
+       ...
+       def g(value):
+           ...
+           return g(value-1) + 1
+       ...
+
+The function :func:`g` will always raise a :exc:`NameError` exception, because
+the binding of the name ``g`` isn't in either its local namespace or in the
+module-level namespace.  This isn't much of a problem in practice (how often do
+you recursively define interior functions like this?), but this also made using
+the :keyword:`lambda` statement clumsier, and this was a problem in practice.
+In code which uses :keyword:`lambda` you can often find local variables being
+copied by passing them as the default values of arguments. ::
+
+   def find(self, name):
+       "Return list of any entries equal to 'name'"
+       L = filter(lambda x, name=name: x == name,
+                  self.list_attribute)
+       return L
+
+The readability of Python code written in a strongly functional style suffers
+greatly as a result.
+
+The most significant change to Python 2.2 is that static scoping has been added
+to the language to fix this problem.  As a first effect, the ``name=name``
+default argument is now unnecessary in the above example.  Put simply, when a
+given variable name is not assigned a value within a function (by an assignment,
+or the :keyword:`def`, :keyword:`class`, or :keyword:`import` statements),
+references to the variable will be looked up in the local namespace of the
+enclosing scope.  A more detailed explanation of the rules, and a dissection of
+the implementation, can be found in the PEP.
+
+This change may cause some compatibility problems for code where the same
+variable name is used both at the module level and as a local variable within a
+function that contains further function definitions. This seems rather unlikely
+though, since such code would have been pretty confusing to read in the first
+place.
+
+One side effect of the change is that the ``from module import *`` and
+:keyword:`exec` statements have been made illegal inside a function scope under
+certain conditions.  The Python reference manual has said all along that ``from
+module import *`` is only legal at the top level of a module, but the CPython
+interpreter has never enforced this before.  As part of the implementation of
+nested scopes, the compiler which turns Python source into bytecodes has to
+generate different code to access variables in a containing scope.  ``from
+module import *`` and :keyword:`exec` make it impossible for the compiler to
+figure this out, because they add names to the local namespace that are
+unknowable at compile time. Therefore, if a function contains function
+definitions or :keyword:`lambda` expressions with free variables, the compiler
+will flag this by raising a :exc:`SyntaxError` exception.
+
+To make the preceding explanation a bit clearer, here's an example::
+
+   x = 1
+   def f():
+       # The next line is a syntax error
+       exec 'x=2'  
+       def g():
+           return x
+
+Line 4 containing the :keyword:`exec` statement is a syntax error, since
+:keyword:`exec` would define a new local variable named ``x`` whose value should
+be accessed by :func:`g`.
+
+This shouldn't be much of a limitation, since :keyword:`exec` is rarely used in
+most Python code (and when it is used, it's often a sign of a poor design
+anyway).
+
+
+.. seealso::
+
+   :pep:`227` - Statically Nested Scopes
+      Written and implemented by Jeremy Hylton.
+
+.. % ======================================================================
+
+
+New and Improved Modules
+========================
+
+* The :mod:`xmlrpclib` module was contributed to the standard library by Fredrik
+  Lundh, providing support for writing XML-RPC clients.  XML-RPC is a simple
+  remote procedure call protocol built on top of HTTP and XML. For example, the
+  following snippet retrieves a list of RSS channels from the O'Reilly Network,
+  and then  lists the recent headlines for one channel::
+
+     import xmlrpclib
+     s = xmlrpclib.Server(
+           'http://www.oreillynet.com/meerkat/xml-rpc/server.php')
+     channels = s.meerkat.getChannels()
+     # channels is a list of dictionaries, like this:
+     # [{'id': 4, 'title': 'Freshmeat Daily News'}
+     #  {'id': 190, 'title': '32Bits Online'},
+     #  {'id': 4549, 'title': '3DGamers'}, ... ]
+
+     # Get the items for one channel
+     items = s.meerkat.getItems( {'channel': 4} )
+
+     # 'items' is another list of dictionaries, like this:
+     # [{'link': 'http://freshmeat.net/releases/52719/', 
+     #   'description': 'A utility which converts HTML to XSL FO.', 
+     #   'title': 'html2fo 0.3 (Default)'}, ... ]
+
+  The :mod:`SimpleXMLRPCServer` module makes it easy to create straightforward
+  XML-RPC servers.  See http://www.xmlrpc.com/ for more information about XML-RPC.
+
+* The new :mod:`hmac` module implements the HMAC algorithm described by
+  :rfc:`2104`. (Contributed by Gerhard Häring.)
+
+* Several functions that originally returned lengthy tuples now return pseudo-
+  sequences that still behave like tuples but also have mnemonic attributes such
+  as memberst_mtime or :attr:`tm_year`. The enhanced functions include
+  :func:`stat`, :func:`fstat`, :func:`statvfs`, and :func:`fstatvfs` in the
+  :mod:`os` module, and :func:`localtime`, :func:`gmtime`, and :func:`strptime` in
+  the :mod:`time` module.
+
+  For example, to obtain a file's size using the old tuples, you'd end up writing
+  something like ``file_size = os.stat(filename)[stat.ST_SIZE]``, but now this can
+  be written more clearly as ``file_size = os.stat(filename).st_size``.
+
+  The original patch for this feature was contributed by Nick Mathewson.
+
+* The Python profiler has been extensively reworked and various errors in its
+  output have been corrected.  (Contributed by Fred L. Drake, Jr. and Tim Peters.)
+
+* The :mod:`socket` module can be compiled to support IPv6; specify the
+  :option:`--enable-ipv6` option to Python's configure script.  (Contributed by
+  Jun-ichiro "itojun" Hagino.)
+
+* Two new format characters were added to the :mod:`struct` module for 64-bit
+  integers on platforms that support the C :ctype:`long long` type.  ``q`` is for
+  a signed 64-bit integer, and ``Q`` is for an unsigned one.  The value is
+  returned in Python's long integer type.  (Contributed by Tim Peters.)
+
+* In the interpreter's interactive mode, there's a new built-in function
+  :func:`help` that uses the :mod:`pydoc` module introduced in Python 2.1 to
+  provide interactive help. ``help(object)`` displays any available help text
+  about *object*.  :func:`help` with no argument puts you in an online help
+  utility, where you can enter the names of functions, classes, or modules to read
+  their help text. (Contributed by Guido van Rossum, using Ka-Ping Yee's
+  :mod:`pydoc` module.)
+
+* Various bugfixes and performance improvements have been made to the SRE engine
+  underlying the :mod:`re` module.  For example, the :func:`re.sub` and
+  :func:`re.split` functions have been rewritten in C.  Another contributed patch
+  speeds up certain Unicode character ranges by a factor of two, and a new
+  :meth:`finditer`  method that returns an iterator over all the non-overlapping
+  matches in  a given string.  (SRE is maintained by Fredrik Lundh.  The
+  BIGCHARSET patch was contributed by Martin von Löwis.)
+
+* The :mod:`smtplib` module now supports :rfc:`2487`, "Secure SMTP over TLS", so
+  it's now possible to encrypt the SMTP traffic between a Python program and the
+  mail transport agent being handed a message.  :mod:`smtplib` also supports SMTP
+  authentication.  (Contributed by Gerhard Häring.)
+
+* The :mod:`imaplib` module, maintained by Piers Lauder, has support for several
+  new extensions: the NAMESPACE extension defined in :rfc:`2342`, SORT, GETACL and
+  SETACL.  (Contributed by Anthony Baxter and Michel Pelletier.)
+
+* The :mod:`rfc822` module's parsing of email addresses is now compliant with
+  :rfc:`2822`, an update to :rfc:`822`.  (The module's name is *not* going to be
+  changed to ``rfc2822``.)  A new package, :mod:`email`, has also been added for
+  parsing and generating e-mail messages.  (Contributed by Barry Warsaw, and
+  arising out of his work on Mailman.)
+
+* The :mod:`difflib` module now contains a new :class:`Differ` class for
+  producing human-readable lists of changes (a "delta") between two sequences of
+  lines of text.  There are also two generator functions, :func:`ndiff` and
+  :func:`restore`, which respectively return a delta from two sequences, or one of
+  the original sequences from a delta. (Grunt work contributed by David Goodger,
+  from ndiff.py code by Tim Peters who then did the generatorization.)
+
+* New constants :const:`ascii_letters`, :const:`ascii_lowercase`, and
+  :const:`ascii_uppercase` were added to the :mod:`string` module.  There were
+  several modules in the standard library that used :const:`string.letters` to
+  mean the ranges A-Za-z, but that assumption is incorrect when locales are in
+  use, because :const:`string.letters` varies depending on the set of legal
+  characters defined by the current locale.  The buggy modules have all been fixed
+  to use :const:`ascii_letters` instead. (Reported by an unknown person; fixed by
+  Fred L. Drake, Jr.)
+
+* The :mod:`mimetypes` module now makes it easier to use alternative MIME-type
+  databases by the addition of a :class:`MimeTypes` class, which takes a list of
+  filenames to be parsed.  (Contributed by Fred L. Drake, Jr.)
+
+* A :class:`Timer` class was added to the :mod:`threading` module that allows
+  scheduling an activity to happen at some future time.  (Contributed by Itamar
+  Shtull-Trauring.)
+
+.. % ======================================================================
+
+
+Interpreter Changes and Fixes
+=============================
+
+Some of the changes only affect people who deal with the Python interpreter at
+the C level because they're writing Python extension modules, embedding the
+interpreter, or just hacking on the interpreter itself. If you only write Python
+code, none of the changes described here will affect you very much.
+
+* Profiling and tracing functions can now be implemented in C, which can operate
+  at much higher speeds than Python-based functions and should reduce the overhead
+  of profiling and tracing.  This  will be of interest to authors of development
+  environments for Python.  Two new C functions were added to Python's API,
+  :cfunc:`PyEval_SetProfile` and :cfunc:`PyEval_SetTrace`. The existing
+  :func:`sys.setprofile` and :func:`sys.settrace` functions still exist, and have
+  simply been changed to use the new C-level interface.  (Contributed by Fred L.
+  Drake, Jr.)
+
+* Another low-level API, primarily of interest to implementors of Python
+  debuggers and development tools, was added. :cfunc:`PyInterpreterState_Head` and
+  :cfunc:`PyInterpreterState_Next` let a caller walk through all the existing
+  interpreter objects; :cfunc:`PyInterpreterState_ThreadHead` and
+  :cfunc:`PyThreadState_Next` allow looping over all the thread states for a given
+  interpreter.  (Contributed by David Beazley.)
+
+* The C-level interface to the garbage collector has been changed to make it
+  easier to write extension types that support garbage collection and to debug
+  misuses of the functions. Various functions have slightly different semantics,
+  so a bunch of functions had to be renamed.  Extensions that use the old API will
+  still compile but will *not* participate in garbage collection, so updating them
+  for 2.2 should be considered fairly high priority.
+
+  To upgrade an extension module to the new API, perform the following steps:
+
+* Rename :cfunc:`Py_TPFLAGS_GC` to :cfunc:`PyTPFLAGS_HAVE_GC`.
+
+* Use :cfunc:`PyObject_GC_New` or :cfunc:`PyObject_GC_NewVar` to allocate
+    objects, and :cfunc:`PyObject_GC_Del` to deallocate them.
+
+* Rename :cfunc:`PyObject_GC_Init` to :cfunc:`PyObject_GC_Track` and
+    :cfunc:`PyObject_GC_Fini` to :cfunc:`PyObject_GC_UnTrack`.
+
+* Remove :cfunc:`PyGC_HEAD_SIZE` from object size calculations.
+
+* Remove calls to :cfunc:`PyObject_AS_GC` and :cfunc:`PyObject_FROM_GC`.
+
+* A new ``et`` format sequence was added to :cfunc:`PyArg_ParseTuple`; ``et``
+  takes both a parameter and an encoding name, and converts the parameter to the
+  given encoding if the parameter turns out to be a Unicode string, or leaves it
+  alone if it's an 8-bit string, assuming it to already be in the desired
+  encoding.  This differs from the ``es`` format character, which assumes that
+  8-bit strings are in Python's default ASCII encoding and converts them to the
+  specified new encoding. (Contributed by M.-A. Lemburg, and used for the MBCS
+  support on Windows described in the following section.)
+
+* A different argument parsing function, :cfunc:`PyArg_UnpackTuple`, has been
+  added that's simpler and presumably faster.  Instead of specifying a format
+  string, the caller simply gives the minimum and maximum number of arguments
+  expected, and a set of pointers to :ctype:`PyObject\*` variables that will be
+  filled in with argument values.
+
+* Two new flags :const:`METH_NOARGS` and :const:`METH_O` are available in method
+  definition tables to simplify implementation of methods with no arguments or a
+  single untyped argument. Calling such methods is more efficient than calling a
+  corresponding method that uses :const:`METH_VARARGS`.  Also, the old
+  :const:`METH_OLDARGS` style of writing C methods is  now officially deprecated.
+
+* Two new wrapper functions, :cfunc:`PyOS_snprintf` and :cfunc:`PyOS_vsnprintf`
+  were added to provide  cross-platform implementations for the relatively new
+  :cfunc:`snprintf` and :cfunc:`vsnprintf` C lib APIs. In contrast to the standard
+  :cfunc:`sprintf` and :cfunc:`vsprintf` functions, the Python versions check the
+  bounds of the buffer used to protect against buffer overruns. (Contributed by
+  M.-A. Lemburg.)
+
+* The :cfunc:`_PyTuple_Resize` function has lost an unused parameter, so now it
+  takes 2 parameters instead of 3.  The third argument was never used, and can
+  simply be discarded when porting code from earlier versions to Python 2.2.
+
+.. % ======================================================================
+
+
+Other Changes and Fixes
+=======================
+
+As usual there were a bunch of other improvements and bugfixes scattered
+throughout the source tree.  A search through the CVS change logs finds there
+were 527 patches applied and 683 bugs fixed between Python 2.1 and 2.2; 2.2.1
+applied 139 patches and fixed 143 bugs; 2.2.2 applied 106 patches and fixed 82
+bugs.  These figures are likely to be underestimates.
+
+Some of the more notable changes are:
+
+* The code for the MacOS port for Python, maintained by Jack Jansen, is now kept
+  in the main Python CVS tree, and many changes have been made to support MacOS X.
+
+  The most significant change is the ability to build Python as a framework,
+  enabled by supplying the :option:`--enable-framework` option to the configure
+  script when compiling Python.  According to Jack Jansen, "This installs a self-
+  contained Python installation plus the OS X framework "glue" into
+  :file:`/Library/Frameworks/Python.framework` (or another location of choice).
+  For now there is little immediate added benefit to this (actually, there is the
+  disadvantage that you have to change your PATH to be able to find Python), but
+  it is the basis for creating a full-blown Python application, porting the
+  MacPython IDE, possibly using Python as a standard OSA scripting language and
+  much more."
+
+  Most of the MacPython toolbox modules, which interface to MacOS APIs such as
+  windowing, QuickTime, scripting, etc. have been ported to OS X, but they've been
+  left commented out in :file:`setup.py`.  People who want to experiment with
+  these modules can uncomment them manually.
+
+  .. % Jack's original comments:
+  .. % The main change is the possibility to build Python as a
+  .. % framework. This installs a self-contained Python installation plus the
+  .. % OSX framework "glue" into /Library/Frameworks/Python.framework (or
+  .. % another location of choice). For now there is little immedeate added
+  .. % benefit to this (actually, there is the disadvantage that you have to
+  .. % change your PATH to be able to find Python), but it is the basis for
+  .. % creating a fullblown Python application, porting the MacPython IDE,
+  .. % possibly using Python as a standard OSA scripting language and much
+  .. % more. You enable this with "configure --enable-framework".
+  .. % The other change is that most MacPython toolbox modules, which
+  .. % interface to all the MacOS APIs such as windowing, quicktime,
+  .. % scripting, etc. have been ported. Again, most of these are not of
+  .. % immedeate use, as they need a full application to be really useful, so
+  .. % they have been commented out in setup.py. People wanting to experiment
+  .. % can uncomment them. Gestalt and Internet Config modules are enabled by
+  .. % default.
+
+* Keyword arguments passed to builtin functions that don't take them now cause a
+  :exc:`TypeError` exception to be raised, with the message "*function* takes no
+  keyword arguments".
+
+* Weak references, added in Python 2.1 as an extension module, are now part of
+  the core because they're used in the implementation of new-style classes.  The
+  :exc:`ReferenceError` exception has therefore moved from the :mod:`weakref`
+  module to become a built-in exception.
+
+* A new script, :file:`Tools/scripts/cleanfuture.py` by Tim Peters,
+  automatically removes obsolete ``__future__`` statements from Python source
+  code.
+
+* An additional *flags* argument has been added to the built-in function
+  :func:`compile`, so the behaviour of ``__future__`` statements can now be
+  correctly observed in simulated shells, such as those presented by IDLE and
+  other development environments.  This is described in :pep:`264`. (Contributed
+  by Michael Hudson.)
+
+* The new license introduced with Python 1.6 wasn't GPL-compatible.  This is
+  fixed by some minor textual changes to the 2.2 license, so it's now legal to
+  embed Python inside a GPLed program again.  Note that Python itself is not
+  GPLed, but instead is under a license that's essentially equivalent to the BSD
+  license, same as it always was.  The license changes were also applied to the
+  Python 2.0.1 and 2.1.1 releases.
+
+* When presented with a Unicode filename on Windows, Python will now convert it
+  to an MBCS encoded string, as used by the Microsoft file APIs.  As MBCS is
+  explicitly used by the file APIs, Python's choice of ASCII as the default
+  encoding turns out to be an annoyance.  On Unix, the locale's character set is
+  used if :func:`locale.nl_langinfo(CODESET)` is available.  (Windows support was
+  contributed by Mark Hammond with assistance from Marc-André Lemburg. Unix
+  support was added by Martin von Löwis.)
+
+* Large file support is now enabled on Windows.  (Contributed by Tim Peters.)
+
+* The :file:`Tools/scripts/ftpmirror.py` script now parses a :file:`.netrc`
+  file, if you have one. (Contributed by Mike Romberg.)
+
+* Some features of the object returned by the :func:`xrange` function are now
+  deprecated, and trigger warnings when they're accessed; they'll disappear in
+  Python 2.3. :class:`xrange` objects tried to pretend they were full sequence
+  types by supporting slicing, sequence multiplication, and the :keyword:`in`
+  operator, but these features were rarely used and therefore buggy.  The
+  :meth:`tolist` method and the :attr:`start`, :attr:`stop`, and :attr:`step`
+  attributes are also being deprecated.  At the C level, the fourth argument to
+  the :cfunc:`PyRange_New` function, ``repeat``, has also been deprecated.
+
+* There were a bunch of patches to the dictionary implementation, mostly to fix
+  potential core dumps if a dictionary contains objects that sneakily changed
+  their hash value, or mutated the dictionary they were contained in. For a while
+  python-dev fell into a gentle rhythm of Michael Hudson finding a case that
+  dumped core, Tim Peters fixing the bug, Michael finding another case, and round
+  and round it went.
+
+* On Windows, Python can now be compiled with Borland C thanks to a number of
+  patches contributed by Stephen Hansen, though the result isn't fully functional
+  yet.  (But this *is* progress...)
+
+* Another Windows enhancement: Wise Solutions generously offered PythonLabs use
+  of their InstallerMaster 8.1 system.  Earlier PythonLabs Windows installers used
+  Wise 5.0a, which was beginning to show its age.  (Packaged up by Tim Peters.)
+
+* Files ending in ``.pyw`` can now be imported on Windows. ``.pyw`` is a
+  Windows-only thing, used to indicate that a script needs to be run using
+  PYTHONW.EXE instead of PYTHON.EXE in order to prevent a DOS console from popping
+  up to display the output.  This patch makes it possible to import such scripts,
+  in case they're also usable as modules.  (Implemented by David Bolen.)
+
+* On platforms where Python uses the C :cfunc:`dlopen` function  to load
+  extension modules, it's now possible to set the flags used  by :cfunc:`dlopen`
+  using the :func:`sys.getdlopenflags` and :func:`sys.setdlopenflags` functions.
+  (Contributed by Bram Stolk.)
+
+* The :func:`pow` built-in function no longer supports 3 arguments when
+  floating-point numbers are supplied. ``pow(x, y, z)`` returns ``(x**y) % z``,
+  but this is never useful for floating point numbers, and the final result varies
+  unpredictably depending on the platform.  A call such as ``pow(2.0, 8.0, 7.0)``
+  will now raise a :exc:`TypeError` exception.
+
+.. % ======================================================================
+
+
+Acknowledgements
+================
+
+The author would like to thank the following people for offering suggestions,
+corrections and assistance with various drafts of this article: Fred Bremmer,
+Keith Briggs, Andrew Dalke, Fred L. Drake, Jr., Carel Fellinger, David Goodger,
+Mark Hammond, Stephen Hansen, Michael Hudson, Jack Jansen, Marc-André Lemburg,
+Martin von Löwis, Fredrik Lundh, Michael McLay, Nick Mathewson, Paul Moore,
+Gustavo Niemeyer, Don O'Donnell, Joonas Paalasma, Tim Peters, Jens Quade, Tom
+Reinhardt, Neil Schemenauer, Guido van Rossum, Greg Ward, Edward Welbourne.
+
diff --git a/Doc/whatsnew/2.3.rst b/Doc/whatsnew/2.3.rst
new file mode 100644
index 0000000..7dd4930
--- /dev/null
+++ b/Doc/whatsnew/2.3.rst
@@ -0,0 +1,2084 @@
+****************************
+  What's New in Python 2.3  
+****************************
+
+:Author: A.M. Kuchling
+
+.. |release| replace:: 1.01
+
+.. % $Id: whatsnew23.tex 55005 2007-04-27 19:54:29Z guido.van.rossum $
+
+This article explains the new features in Python 2.3.  Python 2.3 was released
+on July 29, 2003.
+
+The main themes for Python 2.3 are polishing some of the features added in 2.2,
+adding various small but useful enhancements to the core language, and expanding
+the standard library.  The new object model introduced in the previous version
+has benefited from 18 months of bugfixes and from optimization efforts that have
+improved the performance of new-style classes.  A few new built-in functions
+have been added such as :func:`sum` and :func:`enumerate`.  The :keyword:`in`
+operator can now be used for substring searches (e.g. ``"ab" in "abc"`` returns
+:const:`True`).
+
+Some of the many new library features include Boolean, set, heap, and date/time
+data types, the ability to import modules from ZIP-format archives, metadata
+support for the long-awaited Python catalog, an updated version of IDLE, and
+modules for logging messages, wrapping text, parsing CSV files, processing
+command-line options, using BerkeleyDB databases...  the list of new and
+enhanced modules is lengthy.
+
+This article doesn't attempt to provide a complete specification of the new
+features, but instead provides a convenient overview.  For full details, you
+should refer to the documentation for Python 2.3, such as the Python Library
+Reference and the Python Reference Manual.  If you want to understand the
+complete implementation and design rationale, refer to the PEP for a particular
+new feature.
+
+.. % ======================================================================
+
+
+PEP 218: A Standard Set Datatype
+================================
+
+The new :mod:`sets` module contains an implementation of a set datatype.  The
+:class:`Set` class is for mutable sets, sets that can have members added and
+removed.  The :class:`ImmutableSet` class is for sets that can't be modified,
+and instances of :class:`ImmutableSet` can therefore be used as dictionary keys.
+Sets are built on top of dictionaries, so the elements within a set must be
+hashable.
+
+Here's a simple example::
+
+   >>> import sets
+   >>> S = sets.Set([1,2,3])
+   >>> S
+   Set([1, 2, 3])
+   >>> 1 in S
+   True
+   >>> 0 in S
+   False
+   >>> S.add(5)
+   >>> S.remove(3)
+   >>> S
+   Set([1, 2, 5])
+   >>>
+
+The union and intersection of sets can be computed with the :meth:`union` and
+:meth:`intersection` methods; an alternative notation uses the bitwise operators
+``&`` and ``|``. Mutable sets also have in-place versions of these methods,
+:meth:`union_update` and :meth:`intersection_update`. ::
+
+   >>> S1 = sets.Set([1,2,3])
+   >>> S2 = sets.Set([4,5,6])
+   >>> S1.union(S2)
+   Set([1, 2, 3, 4, 5, 6])
+   >>> S1 | S2                  # Alternative notation
+   Set([1, 2, 3, 4, 5, 6])
+   >>> S1.intersection(S2)
+   Set([])
+   >>> S1 & S2                  # Alternative notation
+   Set([])
+   >>> S1.union_update(S2)
+   >>> S1
+   Set([1, 2, 3, 4, 5, 6])
+   >>>
+
+It's also possible to take the symmetric difference of two sets.  This is the
+set of all elements in the union that aren't in the intersection.  Another way
+of putting it is that the symmetric difference contains all elements that are in
+exactly one set.  Again, there's an alternative notation (``^``), and an in-
+place version with the ungainly name :meth:`symmetric_difference_update`. ::
+
+   >>> S1 = sets.Set([1,2,3,4])
+   >>> S2 = sets.Set([3,4,5,6])
+   >>> S1.symmetric_difference(S2)
+   Set([1, 2, 5, 6])
+   >>> S1 ^ S2
+   Set([1, 2, 5, 6])
+   >>>
+
+There are also :meth:`issubset` and :meth:`issuperset` methods for checking
+whether one set is a subset or superset of another::
+
+   >>> S1 = sets.Set([1,2,3])
+   >>> S2 = sets.Set([2,3])
+   >>> S2.issubset(S1)
+   True
+   >>> S1.issubset(S2)
+   False
+   >>> S1.issuperset(S2)
+   True
+   >>>
+
+
+.. seealso::
+
+   :pep:`218` - Adding a Built-In Set Object Type
+      PEP written by Greg V. Wilson. Implemented by Greg V. Wilson, Alex Martelli, and
+      GvR.
+
+.. % ======================================================================
+
+
+.. _section-generators:
+
+PEP 255: Simple Generators
+==========================
+
+In Python 2.2, generators were added as an optional feature, to be enabled by a
+``from __future__ import generators`` directive.  In 2.3 generators no longer
+need to be specially enabled, and are now always present; this means that
+:keyword:`yield` is now always a keyword.  The rest of this section is a copy of
+the description of generators from the "What's New in Python 2.2" document; if
+you read it back when Python 2.2 came out, you can skip the rest of this
+section.
+
+You're doubtless familiar with how function calls work in Python or C. When you
+call a function, it gets a private namespace where its local variables are
+created.  When the function reaches a :keyword:`return` statement, the local
+variables are destroyed and the resulting value is returned to the caller.  A
+later call to the same function will get a fresh new set of local variables.
+But, what if the local variables weren't thrown away on exiting a function?
+What if you could later resume the function where it left off?  This is what
+generators provide; they can be thought of as resumable functions.
+
+Here's the simplest example of a generator function::
+
+   def generate_ints(N):
+       for i in range(N):
+           yield i
+
+A new keyword, :keyword:`yield`, was introduced for generators.  Any function
+containing a :keyword:`yield` statement is a generator function; this is
+detected by Python's bytecode compiler which compiles the function specially as
+a result.
+
+When you call a generator function, it doesn't return a single value; instead it
+returns a generator object that supports the iterator protocol.  On executing
+the :keyword:`yield` statement, the generator outputs the value of ``i``,
+similar to a :keyword:`return` statement.  The big difference between
+:keyword:`yield` and a :keyword:`return` statement is that on reaching a
+:keyword:`yield` the generator's state of execution is suspended and local
+variables are preserved.  On the next call to the generator's ``.next()``
+method, the function will resume executing immediately after the
+:keyword:`yield` statement.  (For complicated reasons, the :keyword:`yield`
+statement isn't allowed inside the :keyword:`try` block of a :keyword:`try`...\
+:keyword:`finally` statement; read :pep:`255` for a full explanation of the
+interaction between :keyword:`yield` and exceptions.)
+
+Here's a sample usage of the :func:`generate_ints` generator::
+
+   >>> gen = generate_ints(3)
+   >>> gen
+   <generator object at 0x8117f90>
+   >>> gen.next()
+   0
+   >>> gen.next()
+   1
+   >>> gen.next()
+   2
+   >>> gen.next()
+   Traceback (most recent call last):
+     File "stdin", line 1, in ?
+     File "stdin", line 2, in generate_ints
+   StopIteration
+
+You could equally write ``for i in generate_ints(5)``, or ``a,b,c =
+generate_ints(3)``.
+
+Inside a generator function, the :keyword:`return` statement can only be used
+without a value, and signals the end of the procession of values; afterwards the
+generator cannot return any further values. :keyword:`return` with a value, such
+as ``return 5``, is a syntax error inside a generator function.  The end of the
+generator's results can also be indicated by raising :exc:`StopIteration`
+manually, or by just letting the flow of execution fall off the bottom of the
+function.
+
+You could achieve the effect of generators manually by writing your own class
+and storing all the local variables of the generator as instance variables.  For
+example, returning a list of integers could be done by setting ``self.count`` to
+0, and having the :meth:`next` method increment ``self.count`` and return it.
+However, for a moderately complicated generator, writing a corresponding class
+would be much messier. :file:`Lib/test/test_generators.py` contains a number of
+more interesting examples.  The simplest one implements an in-order traversal of
+a tree using generators recursively. ::
+
+   # A recursive generator that generates Tree leaves in in-order.
+   def inorder(t):
+       if t:
+           for x in inorder(t.left):
+               yield x
+           yield t.label
+           for x in inorder(t.right):
+               yield x
+
+Two other examples in :file:`Lib/test/test_generators.py` produce solutions for
+the N-Queens problem (placing $N$ queens on an $NxN$ chess board so that no
+queen threatens another) and the Knight's Tour (a route that takes a knight to
+every square of an $NxN$ chessboard without visiting any square twice).
+
+The idea of generators comes from other programming languages, especially Icon
+(http://www.cs.arizona.edu/icon/), where the idea of generators is central.  In
+Icon, every expression and function call behaves like a generator.  One example
+from "An Overview of the Icon Programming Language" at
+http://www.cs.arizona.edu/icon/docs/ipd266.htm gives an idea of what this looks
+like::
+
+   sentence := "Store it in the neighboring harbor"
+   if (i := find("or", sentence)) > 5 then write(i)
+
+In Icon the :func:`find` function returns the indexes at which the substring
+"or" is found: 3, 23, 33.  In the :keyword:`if` statement, ``i`` is first
+assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon
+retries it with the second value of 23.  23 is greater than 5, so the comparison
+now succeeds, and the code prints the value 23 to the screen.
+
+Python doesn't go nearly as far as Icon in adopting generators as a central
+concept.  Generators are considered part of the core Python language, but
+learning or using them isn't compulsory; if they don't solve any problems that
+you have, feel free to ignore them. One novel feature of Python's interface as
+compared to Icon's is that a generator's state is represented as a concrete
+object (the iterator) that can be passed around to other functions or stored in
+a data structure.
+
+
+.. seealso::
+
+   :pep:`255` - Simple Generators
+      Written by Neil Schemenauer, Tim Peters, Magnus Lie Hetland.  Implemented mostly
+      by Neil Schemenauer and Tim Peters, with other fixes from the Python Labs crew.
+
+.. % ======================================================================
+
+
+.. _section-encodings:
+
+PEP 263: Source Code Encodings
+==============================
+
+Python source files can now be declared as being in different character set
+encodings.  Encodings are declared by including a specially formatted comment in
+the first or second line of the source file.  For example, a UTF-8 file can be
+declared with::
+
+   #!/usr/bin/env python
+   # -*- coding: UTF-8 -*-
+
+Without such an encoding declaration, the default encoding used is 7-bit ASCII.
+Executing or importing modules that contain string literals with 8-bit
+characters and have no encoding declaration will result in a
+:exc:`DeprecationWarning` being signalled by Python 2.3; in 2.4 this will be a
+syntax error.
+
+The encoding declaration only affects Unicode string literals, which will be
+converted to Unicode using the specified encoding.  Note that Python identifiers
+are still restricted to ASCII characters, so you can't have variable names that
+use characters outside of the usual alphanumerics.
+
+
+.. seealso::
+
+   :pep:`263` - Defining Python Source Code Encodings
+      Written by Marc-André Lemburg and Martin von Löwis; implemented by Suzuki Hisao
+      and Martin von Löwis.
+
+.. % ======================================================================
+
+
+PEP 273: Importing Modules from ZIP Archives
+============================================
+
+The new :mod:`zipimport` module adds support for importing modules from a ZIP-
+format archive.  You don't need to import the module explicitly; it will be
+automatically imported if a ZIP archive's filename is added to ``sys.path``.
+For example::
+
+   amk@nyman:~/src/python$ unzip -l /tmp/example.zip
+   Archive:  /tmp/example.zip
+     Length     Date   Time    Name
+    --------    ----   ----    ----
+        8467  11-26-02 22:30   jwzthreading.py
+    --------                   -------
+        8467                   1 file
+   amk@nyman:~/src/python$ ./python
+   Python 2.3 (#1, Aug 1 2003, 19:54:32) 
+   >>> import sys
+   >>> sys.path.insert(0, '/tmp/example.zip')  # Add .zip file to front of path
+   >>> import jwzthreading
+   >>> jwzthreading.__file__
+   '/tmp/example.zip/jwzthreading.py'
+   >>>
+
+An entry in ``sys.path`` can now be the filename of a ZIP archive. The ZIP
+archive can contain any kind of files, but only files named :file:`\*.py`,
+:file:`\*.pyc`, or :file:`\*.pyo` can be imported.  If an archive only contains
+:file:`\*.py` files, Python will not attempt to modify the archive by adding the
+corresponding :file:`\*.pyc` file, meaning that if a ZIP archive doesn't contain
+:file:`\*.pyc` files, importing may be rather slow.
+
+A path within the archive can also be specified to only import from a
+subdirectory; for example, the path :file:`/tmp/example.zip/lib/` would only
+import from the :file:`lib/` subdirectory within the archive.
+
+
+.. seealso::
+
+   :pep:`273` - Import Modules from Zip Archives
+      Written by James C. Ahlstrom,  who also provided an implementation. Python 2.3
+      follows the specification in :pep:`273`,  but uses an implementation written by
+      Just van Rossum  that uses the import hooks described in :pep:`302`. See section
+      :ref:`section-pep302` for a description of the new import hooks.
+
+.. % ======================================================================
+
+
+PEP 277: Unicode file name support for Windows NT
+=================================================
+
+On Windows NT, 2000, and XP, the system stores file names as Unicode strings.
+Traditionally, Python has represented file names as byte strings, which is
+inadequate because it renders some file names inaccessible.
+
+Python now allows using arbitrary Unicode strings (within the limitations of the
+file system) for all functions that expect file names, most notably the
+:func:`open` built-in function. If a Unicode string is passed to
+:func:`os.listdir`, Python now returns a list of Unicode strings.  A new
+function, :func:`os.getcwdu`, returns the current directory as a Unicode string.
+
+Byte strings still work as file names, and on Windows Python will transparently
+convert them to Unicode using the ``mbcs`` encoding.
+
+Other systems also allow Unicode strings as file names but convert them to byte
+strings before passing them to the system, which can cause a :exc:`UnicodeError`
+to be raised. Applications can test whether arbitrary Unicode strings are
+supported as file names by checking :attr:`os.path.supports_unicode_filenames`,
+a Boolean value.
+
+Under MacOS, :func:`os.listdir` may now return Unicode filenames.
+
+
+.. seealso::
+
+   :pep:`277` - Unicode file name support for Windows NT
+      Written by Neil Hodgson; implemented by Neil Hodgson, Martin von Löwis, and Mark
+      Hammond.
+
+.. % ======================================================================
+
+
+PEP 278: Universal Newline Support
+==================================
+
+The three major operating systems used today are Microsoft Windows, Apple's
+Macintosh OS, and the various Unix derivatives.  A minor irritation of cross-
+platform work  is that these three platforms all use different characters to
+mark the ends of lines in text files.  Unix uses the linefeed (ASCII character
+10), MacOS uses the carriage return (ASCII character 13), and Windows uses a
+two-character sequence of a carriage return plus a newline.
+
+Python's file objects can now support end of line conventions other than the one
+followed by the platform on which Python is running. Opening a file with the
+mode ``'U'`` or ``'rU'`` will open a file for reading in universal newline mode.
+All three line ending conventions will be translated to a ``'\n'`` in the
+strings returned by the various file methods such as :meth:`read` and
+:meth:`readline`.
+
+Universal newline support is also used when importing modules and when executing
+a file with the :func:`execfile` function.  This means that Python modules can
+be shared between all three operating systems without needing to convert the
+line-endings.
+
+This feature can be disabled when compiling Python by specifying the
+:option:`--without-universal-newlines` switch when running Python's
+:program:`configure` script.
+
+
+.. seealso::
+
+   :pep:`278` - Universal Newline Support
+      Written and implemented by Jack Jansen.
+
+.. % ======================================================================
+
+
+.. _section-enumerate:
+
+PEP 279: enumerate()
+====================
+
+A new built-in function, :func:`enumerate`, will make certain loops a bit
+clearer.  ``enumerate(thing)``, where *thing* is either an iterator or a
+sequence, returns a iterator that will return ``(0, thing[0])``, ``(1,
+thing[1])``, ``(2, thing[2])``, and so forth.
+
+A common idiom to change every element of a list looks like this::
+
+   for i in range(len(L)):
+       item = L[i]
+       # ... compute some result based on item ...
+       L[i] = result
+
+This can be rewritten using :func:`enumerate` as::
+
+   for i, item in enumerate(L):
+       # ... compute some result based on item ...
+       L[i] = result
+
+
+.. seealso::
+
+   :pep:`279` - The enumerate() built-in function
+      Written and implemented by Raymond D. Hettinger.
+
+.. % ======================================================================
+
+
+PEP 282: The logging Package
+============================
+
+A standard package for writing logs, :mod:`logging`, has been added to Python
+2.3.  It provides a powerful and flexible mechanism for generating logging
+output which can then be filtered and processed in various ways.  A
+configuration file written in a standard format can be used to control the
+logging behavior of a program.  Python includes handlers that will write log
+records to standard error or to a file or socket, send them to the system log,
+or even e-mail them to a particular address; of course, it's also possible to
+write your own handler classes.
+
+The :class:`Logger` class is the primary class. Most application code will deal
+with one or more :class:`Logger` objects, each one used by a particular
+subsystem of the application. Each :class:`Logger` is identified by a name, and
+names are organized into a hierarchy using ``.``  as the component separator.
+For example, you might have :class:`Logger` instances named ``server``,
+``server.auth`` and ``server.network``.  The latter two instances are below
+``server`` in the hierarchy.  This means that if you turn up the verbosity for
+``server`` or direct ``server`` messages to a different handler, the changes
+will also apply to records logged to ``server.auth`` and ``server.network``.
+There's also a root :class:`Logger` that's the parent of all other loggers.
+
+For simple uses, the :mod:`logging` package contains some convenience functions
+that always use the root log::
+
+   import logging
+
+   logging.debug('Debugging information')
+   logging.info('Informational message')
+   logging.warning('Warning:config file %s not found', 'server.conf')
+   logging.error('Error occurred')
+   logging.critical('Critical error -- shutting down')
+
+This produces the following output::
+
+   WARNING:root:Warning:config file server.conf not found
+   ERROR:root:Error occurred
+   CRITICAL:root:Critical error -- shutting down
+
+In the default configuration, informational and debugging messages are
+suppressed and the output is sent to standard error.  You can enable the display
+of informational and debugging messages by calling the :meth:`setLevel` method
+on the root logger.
+
+Notice the :func:`warning` call's use of string formatting operators; all of the
+functions for logging messages take the arguments ``(msg, arg1, arg2, ...)`` and
+log the string resulting from ``msg % (arg1, arg2, ...)``.
+
+There's also an :func:`exception` function that records the most recent
+traceback.  Any of the other functions will also record the traceback if you
+specify a true value for the keyword argument *exc_info*. ::
+
+   def f():
+       try:    1/0
+       except: logging.exception('Problem recorded')
+
+   f()
+
+This produces the following output::
+
+   ERROR:root:Problem recorded
+   Traceback (most recent call last):
+     File "t.py", line 6, in f
+       1/0
+   ZeroDivisionError: integer division or modulo by zero
+
+Slightly more advanced programs will use a logger other than the root logger.
+The :func:`getLogger(name)` function is used to get a particular log, creating
+it if it doesn't exist yet. :func:`getLogger(None)` returns the root logger. ::
+
+   log = logging.getLogger('server')
+    ...
+   log.info('Listening on port %i', port)
+    ...
+   log.critical('Disk full')
+    ...
+
+Log records are usually propagated up the hierarchy, so a message logged to
+``server.auth`` is also seen by ``server`` and ``root``, but a :class:`Logger`
+can prevent this by setting its :attr:`propagate` attribute to :const:`False`.
+
+There are more classes provided by the :mod:`logging` package that can be
+customized.  When a :class:`Logger` instance is told to log a message, it
+creates a :class:`LogRecord` instance that is sent to any number of different
+:class:`Handler` instances.  Loggers and handlers can also have an attached list
+of filters, and each filter can cause the :class:`LogRecord` to be ignored or
+can modify the record before passing it along.  When they're finally output,
+:class:`LogRecord` instances are converted to text by a :class:`Formatter`
+class.  All of these classes can be replaced by your own specially-written
+classes.
+
+With all of these features the :mod:`logging` package should provide enough
+flexibility for even the most complicated applications.  This is only an
+incomplete overview of its features, so please see the package's reference
+documentation for all of the details.  Reading :pep:`282` will also be helpful.
+
+
+.. seealso::
+
+   :pep:`282` - A Logging System
+      Written by Vinay Sajip and Trent Mick; implemented by Vinay Sajip.
+
+.. % ======================================================================
+
+
+.. _section-bool:
+
+PEP 285: A Boolean Type
+=======================
+
+A Boolean type was added to Python 2.3.  Two new constants were added to the
+:mod:`__builtin__` module, :const:`True` and :const:`False`.  (:const:`True` and
+:const:`False` constants were added to the built-ins in Python 2.2.1, but the
+2.2.1 versions are simply set to integer values of 1 and 0 and aren't a
+different type.)
+
+The type object for this new type is named :class:`bool`; the constructor for it
+takes any Python value and converts it to :const:`True` or :const:`False`. ::
+
+   >>> bool(1)
+   True
+   >>> bool(0)
+   False
+   >>> bool([])
+   False
+   >>> bool( (1,) )
+   True
+
+Most of the standard library modules and built-in functions have been changed to
+return Booleans. ::
+
+   >>> obj = []
+   >>> hasattr(obj, 'append')
+   True
+   >>> isinstance(obj, list)
+   True
+   >>> isinstance(obj, tuple)
+   False
+
+Python's Booleans were added with the primary goal of making code clearer.  For
+example, if you're reading a function and encounter the statement ``return 1``,
+you might wonder whether the ``1`` represents a Boolean truth value, an index,
+or a coefficient that multiplies some other quantity.  If the statement is
+``return True``, however, the meaning of the return value is quite clear.
+
+Python's Booleans were *not* added for the sake of strict type-checking.  A very
+strict language such as Pascal would also prevent you performing arithmetic with
+Booleans, and would require that the expression in an :keyword:`if` statement
+always evaluate to a Boolean result.  Python is not this strict and never will
+be, as :pep:`285` explicitly says.  This means you can still use any expression
+in an :keyword:`if` statement, even ones that evaluate to a list or tuple or
+some random object.  The Boolean type is a subclass of the :class:`int` class so
+that arithmetic using a Boolean still works. ::
+
+   >>> True + 1
+   2
+   >>> False + 1
+   1
+   >>> False * 75
+   0
+   >>> True * 75
+   75
+
+To sum up :const:`True` and :const:`False` in a sentence: they're alternative
+ways to spell the integer values 1 and 0, with the single difference that
+:func:`str` and :func:`repr` return the strings ``'True'`` and ``'False'``
+instead of ``'1'`` and ``'0'``.
+
+
+.. seealso::
+
+   :pep:`285` - Adding a bool type
+      Written and implemented by GvR.
+
+.. % ======================================================================
+
+
+PEP 293: Codec Error Handling Callbacks
+=======================================
+
+When encoding a Unicode string into a byte string, unencodable characters may be
+encountered.  So far, Python has allowed specifying the error processing as
+either "strict" (raising :exc:`UnicodeError`), "ignore" (skipping the
+character), or "replace" (using a question mark in the output string), with
+"strict" being the default behavior. It may be desirable to specify alternative
+processing of such errors, such as inserting an XML character reference or HTML
+entity reference into the converted string.
+
+Python now has a flexible framework to add different processing strategies.  New
+error handlers can be added with :func:`codecs.register_error`, and codecs then
+can access the error handler with :func:`codecs.lookup_error`. An equivalent C
+API has been added for codecs written in C. The error handler gets the necessary
+state information such as the string being converted, the position in the string
+where the error was detected, and the target encoding.  The handler can then
+either raise an exception or return a replacement string.
+
+Two additional error handlers have been implemented using this framework:
+"backslashreplace" uses Python backslash quoting to represent unencodable
+characters and "xmlcharrefreplace" emits XML character references.
+
+
+.. seealso::
+
+   :pep:`293` - Codec Error Handling Callbacks
+      Written and implemented by Walter Dörwald.
+
+.. % ======================================================================
+
+
+.. _section-pep301:
+
+PEP 301: Package Index and Metadata for Distutils
+=================================================
+
+Support for the long-requested Python catalog makes its first appearance in 2.3.
+
+The heart of the catalog is the new Distutils :command:`register` command.
+Running ``python setup.py register`` will collect the metadata describing a
+package, such as its name, version, maintainer, description, &c., and send it to
+a central catalog server.  The resulting catalog is available from
+http://www.python.org/pypi.
+
+To make the catalog a bit more useful, a new optional *classifiers* keyword
+argument has been added to the Distutils :func:`setup` function.  A list of
+`Trove <http://catb.org/~esr/trove/>`_-style strings can be supplied to help
+classify the software.
+
+Here's an example :file:`setup.py` with classifiers, written to be compatible
+with older versions of the Distutils::
+
+   from distutils import core
+   kw = {'name': "Quixote",
+         'version': "0.5.1",
+         'description': "A highly Pythonic Web application framework",
+         # ...
+         }
+
+   if (hasattr(core, 'setup_keywords') and 
+       'classifiers' in core.setup_keywords):
+       kw['classifiers'] = \
+           ['Topic :: Internet :: WWW/HTTP :: Dynamic Content',
+            'Environment :: No Input/Output (Daemon)',
+            'Intended Audience :: Developers'],
+
+   core.setup(**kw)
+
+The full list of classifiers can be obtained by running  ``python setup.py
+register --list-classifiers``.
+
+
+.. seealso::
+
+   :pep:`301` - Package Index and Metadata for Distutils
+      Written and implemented by Richard Jones.
+
+.. % ======================================================================
+
+
+.. _section-pep302:
+
+PEP 302: New Import Hooks
+=========================
+
+While it's been possible to write custom import hooks ever since the
+:mod:`ihooks` module was introduced in Python 1.3, no one has ever been really
+happy with it because writing new import hooks is difficult and messy.  There
+have been various proposed alternatives such as the :mod:`imputil` and :mod:`iu`
+modules, but none of them has ever gained much acceptance, and none of them were
+easily usable from C code.
+
+:pep:`302` borrows ideas from its predecessors, especially from Gordon
+McMillan's :mod:`iu` module.  Three new items  are added to the :mod:`sys`
+module:
+
+* ``sys.path_hooks`` is a list of callable objects; most  often they'll be
+  classes.  Each callable takes a string containing a path and either returns an
+  importer object that will handle imports from this path or raises an
+  :exc:`ImportError` exception if it can't handle this path.
+
+* ``sys.path_importer_cache`` caches importer objects for each path, so
+  ``sys.path_hooks`` will only need to be traversed once for each path.
+
+* ``sys.meta_path`` is a list of importer objects that will be traversed before
+  ``sys.path`` is checked.  This list is initially empty, but user code can add
+  objects to it.  Additional built-in and frozen modules can be imported by an
+  object added to this list.
+
+Importer objects must have a single method, :meth:`find_module(fullname,
+path=None)`.  *fullname* will be a module or package name, e.g. ``string`` or
+``distutils.core``.  :meth:`find_module` must return a loader object that has a
+single method, :meth:`load_module(fullname)`, that creates and returns the
+corresponding module object.
+
+Pseudo-code for Python's new import logic, therefore, looks something like this
+(simplified a bit; see :pep:`302` for the full details)::
+
+   for mp in sys.meta_path:
+       loader = mp(fullname)
+       if loader is not None:
+           <module> = loader.load_module(fullname)
+
+   for path in sys.path:
+       for hook in sys.path_hooks:
+           try:
+               importer = hook(path)
+           except ImportError:
+               # ImportError, so try the other path hooks
+               pass
+           else:
+               loader = importer.find_module(fullname)
+               <module> = loader.load_module(fullname)
+
+   # Not found!
+   raise ImportError
+
+
+.. seealso::
+
+   :pep:`302` - New Import Hooks
+      Written by Just van Rossum and Paul Moore. Implemented by Just van Rossum.
+
+.. % ======================================================================
+
+
+.. _section-pep305:
+
+PEP 305: Comma-separated Files
+==============================
+
+Comma-separated files are a format frequently used for exporting data from
+databases and spreadsheets.  Python 2.3 adds a parser for comma-separated files.
+
+Comma-separated format is deceptively simple at first glance::
+
+   Costs,150,200,3.95
+
+Read a line and call ``line.split(',')``: what could be simpler? But toss in
+string data that can contain commas, and things get more complicated::
+
+   "Costs",150,200,3.95,"Includes taxes, shipping, and sundry items"
+
+A big ugly regular expression can parse this, but using the new  :mod:`csv`
+package is much simpler::
+
+   import csv
+
+   input = open('datafile', 'rb')
+   reader = csv.reader(input)
+   for line in reader:
+       print line
+
+The :func:`reader` function takes a number of different options. The field
+separator isn't limited to the comma and can be changed to any character, and so
+can the quoting and line-ending characters.
+
+Different dialects of comma-separated files can be defined and registered;
+currently there are two dialects, both used by Microsoft Excel. A separate
+:class:`csv.writer` class will generate comma-separated files from a succession
+of tuples or lists, quoting strings that contain the delimiter.
+
+
+.. seealso::
+
+   :pep:`305` - CSV File API
+      Written and implemented  by Kevin Altis, Dave Cole, Andrew McNamara, Skip
+      Montanaro, Cliff Wells.
+
+.. % ======================================================================
+
+
+.. _section-pep307:
+
+PEP 307: Pickle Enhancements
+============================
+
+The :mod:`pickle` and :mod:`cPickle` modules received some attention during the
+2.3 development cycle.  In 2.2, new-style classes could be pickled without
+difficulty, but they weren't pickled very compactly; :pep:`307` quotes a trivial
+example where a new-style class results in a pickled string three times longer
+than that for a classic class.
+
+The solution was to invent a new pickle protocol.  The :func:`pickle.dumps`
+function has supported a text-or-binary flag  for a long time.  In 2.3, this
+flag is redefined from a Boolean to an integer: 0 is the old text-mode pickle
+format, 1 is the old binary format, and now 2 is a new 2.3-specific format.  A
+new constant, :const:`pickle.HIGHEST_PROTOCOL`, can be used to select the
+fanciest protocol available.
+
+Unpickling is no longer considered a safe operation.  2.2's :mod:`pickle`
+provided hooks for trying to prevent unsafe classes from being unpickled
+(specifically, a :attr:`__safe_for_unpickling__` attribute), but none of this
+code was ever audited and therefore it's all been ripped out in 2.3.  You should
+not unpickle untrusted data in any version of Python.
+
+To reduce the pickling overhead for new-style classes, a new interface for
+customizing pickling was added using three special methods:
+:meth:`__getstate__`, :meth:`__setstate__`, and :meth:`__getnewargs__`.  Consult
+:pep:`307` for the full semantics  of these methods.
+
+As a way to compress pickles yet further, it's now possible to use integer codes
+instead of long strings to identify pickled classes. The Python Software
+Foundation will maintain a list of standardized codes; there's also a range of
+codes for private use.  Currently no codes have been specified.
+
+
+.. seealso::
+
+   :pep:`307` - Extensions to the pickle protocol
+      Written and implemented  by Guido van Rossum and Tim Peters.
+
+.. % ======================================================================
+
+
+.. _section-slices:
+
+Extended Slices
+===============
+
+Ever since Python 1.4, the slicing syntax has supported an optional third "step"
+or "stride" argument.  For example, these are all legal Python syntax:
+``L[1:10:2]``, ``L[:-1:1]``, ``L[::-1]``.  This was added to Python at the
+request of the developers of Numerical Python, which uses the third argument
+extensively.  However, Python's built-in list, tuple, and string sequence types
+have never supported this feature, raising a :exc:`TypeError` if you tried it.
+Michael Hudson contributed a patch to fix this shortcoming.
+
+For example, you can now easily extract the elements of a list that have even
+indexes::
+
+   >>> L = range(10)
+   >>> L[::2]
+   [0, 2, 4, 6, 8]
+
+Negative values also work to make a copy of the same list in reverse order::
+
+   >>> L[::-1]
+   [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
+
+This also works for tuples, arrays, and strings::
+
+   >>> s='abcd'
+   >>> s[::2]
+   'ac'
+   >>> s[::-1]
+   'dcba'
+
+If you have a mutable sequence such as a list or an array you can assign to or
+delete an extended slice, but there are some differences between assignment to
+extended and regular slices.  Assignment to a regular slice can be used to
+change the length of the sequence::
+
+   >>> a = range(3)
+   >>> a
+   [0, 1, 2]
+   >>> a[1:3] = [4, 5, 6]
+   >>> a
+   [0, 4, 5, 6]
+
+Extended slices aren't this flexible.  When assigning to an extended slice, the
+list on the right hand side of the statement must contain the same number of
+items as the slice it is replacing::
+
+   >>> a = range(4)
+   >>> a
+   [0, 1, 2, 3]
+   >>> a[::2]
+   [0, 2]
+   >>> a[::2] = [0, -1]
+   >>> a
+   [0, 1, -1, 3]
+   >>> a[::2] = [0,1,2]
+   Traceback (most recent call last):
+     File "<stdin>", line 1, in ?
+   ValueError: attempt to assign sequence of size 3 to extended slice of size 2
+
+Deletion is more straightforward::
+
+   >>> a = range(4)
+   >>> a
+   [0, 1, 2, 3]
+   >>> a[::2]
+   [0, 2]
+   >>> del a[::2]
+   >>> a
+   [1, 3]
+
+One can also now pass slice objects to the :meth:`__getitem__` methods of the
+built-in sequences::
+
+   >>> range(10).__getitem__(slice(0, 5, 2))
+   [0, 2, 4]
+
+Or use slice objects directly in subscripts::
+
+   >>> range(10)[slice(0, 5, 2)]
+   [0, 2, 4]
+
+To simplify implementing sequences that support extended slicing, slice objects
+now have a method :meth:`indices(length)` which, given the length of a sequence,
+returns a ``(start, stop, step)`` tuple that can be passed directly to
+:func:`range`. :meth:`indices` handles omitted and out-of-bounds indices in a
+manner consistent with regular slices (and this innocuous phrase hides a welter
+of confusing details!).  The method is intended to be used like this::
+
+   class FakeSeq:
+       ...
+       def calc_item(self, i):
+           ...
+       def __getitem__(self, item):
+           if isinstance(item, slice):
+               indices = item.indices(len(self))
+               return FakeSeq([self.calc_item(i) for i in range(*indices)])
+           else:
+               return self.calc_item(i)
+
+From this example you can also see that the built-in :class:`slice` object is
+now the type object for the slice type, and is no longer a function.  This is
+consistent with Python 2.2, where :class:`int`, :class:`str`, etc., underwent
+the same change.
+
+.. % ======================================================================
+
+
+Other Language Changes
+======================
+
+Here are all of the changes that Python 2.3 makes to the core Python language.
+
+* The :keyword:`yield` statement is now always a keyword, as described in
+  section :ref:`section-generators` of this document.
+
+* A new built-in function :func:`enumerate` was added, as described in section
+  :ref:`section-enumerate` of this document.
+
+* Two new constants, :const:`True` and :const:`False` were added along with the
+  built-in :class:`bool` type, as described in section :ref:`section-bool` of this
+  document.
+
+* The :func:`int` type constructor will now return a long integer instead of
+  raising an :exc:`OverflowError` when a string or floating-point number is too
+  large to fit into an integer.  This can lead to the paradoxical result that
+  ``isinstance(int(expression), int)`` is false, but that seems unlikely to cause
+  problems in practice.
+
+* Built-in types now support the extended slicing syntax, as described in
+  section :ref:`section-slices` of this document.
+
+* A new built-in function, :func:`sum(iterable, start=0)`,  adds up the numeric
+  items in the iterable object and returns their sum.  :func:`sum` only accepts
+  numbers, meaning that you can't use it to concatenate a bunch of strings.
+  (Contributed by Alex Martelli.)
+
+* ``list.insert(pos, value)`` used to  insert *value* at the front of the list
+  when *pos* was negative.  The behaviour has now been changed to be consistent
+  with slice indexing, so when *pos* is -1 the value will be inserted before the
+  last element, and so forth.
+
+* ``list.index(value)``, which searches for *value*  within the list and returns
+  its index, now takes optional  *start* and *stop* arguments to limit the search
+  to  only part of the list.
+
+* Dictionaries have a new method, :meth:`pop(key[, *default*])`, that returns
+  the value corresponding to *key* and removes that key/value pair from the
+  dictionary.  If the requested key isn't present in the dictionary, *default* is
+  returned if it's specified and :exc:`KeyError` raised if it isn't. ::
+
+     >>> d = {1:2}
+     >>> d
+     {1: 2}
+     >>> d.pop(4)
+     Traceback (most recent call last):
+       File "stdin", line 1, in ?
+     KeyError: 4
+     >>> d.pop(1)
+     2
+     >>> d.pop(1)
+     Traceback (most recent call last):
+       File "stdin", line 1, in ?
+     KeyError: 'pop(): dictionary is empty'
+     >>> d
+     {}
+     >>>
+
+  There's also a new class method,  :meth:`dict.fromkeys(iterable, value)`, that
+  creates a dictionary with keys taken from the supplied iterator *iterable* and
+  all values set to *value*, defaulting to ``None``.
+
+  (Patches contributed by Raymond Hettinger.)
+
+  Also, the :func:`dict` constructor now accepts keyword arguments to simplify
+  creating small dictionaries::
+
+     >>> dict(red=1, blue=2, green=3, black=4)
+     {'blue': 2, 'black': 4, 'green': 3, 'red': 1}    
+
+  (Contributed by Just van Rossum.)
+
+* The :keyword:`assert` statement no longer checks the ``__debug__`` flag, so
+  you can no longer disable assertions by assigning to ``__debug__``. Running
+  Python with the :option:`-O` switch will still generate code that doesn't
+  execute any assertions.
+
+* Most type objects are now callable, so you can use them to create new objects
+  such as functions, classes, and modules.  (This means that the :mod:`new` module
+  can be deprecated in a future Python version, because you can now use the type
+  objects available in the :mod:`types` module.) For example, you can create a new
+  module object with the following code:
+
+  .. % XXX should new.py use PendingDeprecationWarning?
+
+  ::
+
+     >>> import types
+     >>> m = types.ModuleType('abc','docstring')
+     >>> m
+     <module 'abc' (built-in)>
+     >>> m.__doc__
+     'docstring'
+
+* A new warning, :exc:`PendingDeprecationWarning` was added to indicate features
+  which are in the process of being deprecated.  The warning will *not* be printed
+  by default.  To check for use of features that will be deprecated in the future,
+  supply :option:`-Walways::PendingDeprecationWarning::` on the command line or
+  use :func:`warnings.filterwarnings`.
+
+* The process of deprecating string-based exceptions, as in ``raise "Error
+  occurred"``, has begun.  Raising a string will now trigger
+  :exc:`PendingDeprecationWarning`.
+
+* Using ``None`` as a variable name will now result in a :exc:`SyntaxWarning`
+  warning.  In a future version of Python, ``None`` may finally become a keyword.
+
+* The :meth:`xreadlines` method of file objects, introduced in Python 2.1, is no
+  longer necessary because files now behave as their own iterator.
+  :meth:`xreadlines` was originally introduced as a faster way to loop over all
+  the lines in a file, but now you can simply write ``for line in file_obj``.
+  File objects also have a new read-only :attr:`encoding` attribute that gives the
+  encoding used by the file; Unicode strings written to the file will be
+  automatically  converted to bytes using the given encoding.
+
+* The method resolution order used by new-style classes has changed, though
+  you'll only notice the difference if you have a really complicated inheritance
+  hierarchy.  Classic classes are unaffected by this change.  Python 2.2
+  originally used a topological sort of a class's ancestors, but 2.3 now uses the
+  C3 algorithm as described in the paper `"A Monotonic Superclass Linearization
+  for Dylan" <http://www.webcom.com/haahr/dylan/linearization-oopsla96.html>`_. To
+  understand the motivation for this change,  read Michele Simionato's article
+  `"Python 2.3 Method Resolution Order" <http://www.python.org/2.3/mro.html>`_, or
+  read the thread on python-dev starting with the message at
+  http://mail.python.org/pipermail/python-dev/2002-October/029035.html. Samuele
+  Pedroni first pointed out the problem and also implemented the fix by coding the
+  C3 algorithm.
+
+* Python runs multithreaded programs by switching between threads after
+  executing N bytecodes.  The default value for N has been increased from 10 to
+  100 bytecodes, speeding up single-threaded applications by reducing the
+  switching overhead.  Some multithreaded applications may suffer slower response
+  time, but that's easily fixed by setting the limit back to a lower number using
+  :func:`sys.setcheckinterval(N)`. The limit can be retrieved with the new
+  :func:`sys.getcheckinterval` function.
+
+* One minor but far-reaching change is that the names of extension types defined
+  by the modules included with Python now contain the module and a ``'.'`` in
+  front of the type name.  For example, in Python 2.2, if you created a socket and
+  printed its :attr:`__class__`, you'd get this output::
+
+     >>> s = socket.socket()
+     >>> s.__class__
+     <type 'socket'>
+
+  In 2.3, you get this::
+
+     >>> s.__class__
+     <type '_socket.socket'>
+
+* One of the noted incompatibilities between old- and new-style classes has been
+  removed: you can now assign to the :attr:`__name__` and :attr:`__bases__`
+  attributes of new-style classes.  There are some restrictions on what can be
+  assigned to :attr:`__bases__` along the lines of those relating to assigning to
+  an instance's :attr:`__class__` attribute.
+
+.. % ======================================================================
+
+
+String Changes
+--------------
+
+* The :keyword:`in` operator now works differently for strings. Previously, when
+  evaluating ``X in Y`` where *X* and *Y* are strings, *X* could only be a single
+  character. That's now changed; *X* can be a string of any length, and ``X in Y``
+  will return :const:`True` if *X* is a substring of *Y*.  If *X* is the empty
+  string, the result is always :const:`True`. ::
+
+     >>> 'ab' in 'abcd'
+     True
+     >>> 'ad' in 'abcd'
+     False
+     >>> '' in 'abcd'
+     True
+
+  Note that this doesn't tell you where the substring starts; if you need that
+  information, use the :meth:`find` string method.
+
+* The :meth:`strip`, :meth:`lstrip`, and :meth:`rstrip` string methods now have
+  an optional argument for specifying the characters to strip.  The default is
+  still to remove all whitespace characters::
+
+     >>> '   abc '.strip()
+     'abc'
+     >>> '><><abc<><><>'.strip('<>')
+     'abc'
+     >>> '><><abc<><><>\n'.strip('<>')
+     'abc<><><>\n'
+     >>> u'\u4000\u4001abc\u4000'.strip(u'\u4000')
+     u'\u4001abc'
+     >>>
+
+  (Suggested by Simon Brunning and implemented by Walter Dörwald.)
+
+* The :meth:`startswith` and :meth:`endswith` string methods now accept negative
+  numbers for the *start* and *end* parameters.
+
+* Another new string method is :meth:`zfill`, originally a function in the
+  :mod:`string` module.  :meth:`zfill` pads a numeric string with zeros on the
+  left until it's the specified width. Note that the ``%`` operator is still more
+  flexible and powerful than :meth:`zfill`. ::
+
+     >>> '45'.zfill(4)
+     '0045'
+     >>> '12345'.zfill(4)
+     '12345'
+     >>> 'goofy'.zfill(6)
+     '0goofy'
+
+  (Contributed by Walter Dörwald.)
+
+* A new type object, :class:`basestring`, has been added. Both 8-bit strings and
+  Unicode strings inherit from this type, so ``isinstance(obj, basestring)`` will
+  return :const:`True` for either kind of string.  It's a completely abstract
+  type, so you can't create :class:`basestring` instances.
+
+* Interned strings are no longer immortal and will now be garbage-collected in
+  the usual way when the only reference to them is from the internal dictionary of
+  interned strings.  (Implemented by Oren Tirosh.)
+
+.. % ======================================================================
+
+
+Optimizations
+-------------
+
+* The creation of new-style class instances has been made much faster; they're
+  now faster than classic classes!
+
+* The :meth:`sort` method of list objects has been extensively rewritten by Tim
+  Peters, and the implementation is significantly faster.
+
+* Multiplication of large long integers is now much faster thanks to an
+  implementation of Karatsuba multiplication, an algorithm that scales better than
+  the O(n\*n) required for the grade-school multiplication algorithm.  (Original
+  patch by Christopher A. Craig, and significantly reworked by Tim Peters.)
+
+* The ``SET_LINENO`` opcode is now gone.  This may provide a small speed
+  increase, depending on your compiler's idiosyncrasies. See section
+  :ref:`section-other` for a longer explanation. (Removed by Michael Hudson.)
+
+* :func:`xrange` objects now have their own iterator, making ``for i in
+  xrange(n)`` slightly faster than ``for i in range(n)``.  (Patch by Raymond
+  Hettinger.)
+
+* A number of small rearrangements have been made in various hotspots to improve
+  performance, such as inlining a function or removing some code.  (Implemented
+  mostly by GvR, but lots of people have contributed single changes.)
+
+The net result of the 2.3 optimizations is that Python 2.3 runs the  pystone
+benchmark around 25% faster than Python 2.2.
+
+.. % ======================================================================
+
+
+New, Improved, and Deprecated Modules
+=====================================
+
+As usual, Python's standard library received a number of enhancements and bug
+fixes.  Here's a partial list of the most notable changes, sorted alphabetically
+by module name. Consult the :file:`Misc/NEWS` file in the source tree for a more
+complete list of changes, or look through the CVS logs for all the details.
+
+* The :mod:`array` module now supports arrays of Unicode characters using the
+  ``'u'`` format character.  Arrays also now support using the ``+=`` assignment
+  operator to add another array's contents, and the ``*=`` assignment operator to
+  repeat an array. (Contributed by Jason Orendorff.)
+
+* The :mod:`bsddb` module has been replaced by version 4.1.6 of the `PyBSDDB
+  <http://pybsddb.sourceforge.net>`_ package, providing a more complete interface
+  to the transactional features of the BerkeleyDB library.
+
+  The old version of the module has been renamed to  :mod:`bsddb185` and is no
+  longer built automatically; you'll  have to edit :file:`Modules/Setup` to enable
+  it.  Note that the new :mod:`bsddb` package is intended to be compatible with
+  the  old module, so be sure to file bugs if you discover any incompatibilities.
+  When upgrading to Python 2.3, if the new interpreter is compiled with a new
+  version of  the underlying BerkeleyDB library, you will almost certainly have to
+  convert your database files to the new version.  You can do this fairly easily
+  with the new scripts :file:`db2pickle.py` and :file:`pickle2db.py` which you
+  will find in the distribution's :file:`Tools/scripts` directory.  If you've
+  already been using the PyBSDDB package and importing it as :mod:`bsddb3`, you
+  will have to change your ``import`` statements to import it as :mod:`bsddb`.
+
+* The new :mod:`bz2` module is an interface to the bz2 data compression library.
+  bz2-compressed data is usually smaller than  corresponding :mod:`zlib`\
+  -compressed data. (Contributed by Gustavo Niemeyer.)
+
+* A set of standard date/time types has been added in the new :mod:`datetime`
+  module.  See the following section for more details.
+
+* The Distutils :class:`Extension` class now supports an extra constructor
+  argument named *depends* for listing additional source files that an extension
+  depends on.  This lets Distutils recompile the module if any of the dependency
+  files are modified.  For example, if :file:`sampmodule.c` includes the header
+  file :file:`sample.h`, you would create the :class:`Extension` object like
+  this::
+
+     ext = Extension("samp",
+                     sources=["sampmodule.c"],
+                     depends=["sample.h"])
+
+  Modifying :file:`sample.h` would then cause the module to be recompiled.
+  (Contributed by Jeremy Hylton.)
+
+* Other minor changes to Distutils: it now checks for the :envvar:`CC`,
+  :envvar:`CFLAGS`, :envvar:`CPP`, :envvar:`LDFLAGS`, and :envvar:`CPPFLAGS`
+  environment variables, using them to override the settings in Python's
+  configuration (contributed by Robert Weber).
+
+* Previously the :mod:`doctest` module would only search the docstrings of
+  public methods and functions for test cases, but it now also examines private
+  ones as well.  The :func:`DocTestSuite(` function creates a
+  :class:`unittest.TestSuite` object from a set of :mod:`doctest` tests.
+
+* The new :func:`gc.get_referents(object)` function returns a list of all the
+  objects referenced by *object*.
+
+* The :mod:`getopt` module gained a new function, :func:`gnu_getopt`, that
+  supports the same arguments as the existing :func:`getopt` function but uses
+  GNU-style scanning mode. The existing :func:`getopt` stops processing options as
+  soon as a non-option argument is encountered, but in GNU-style mode processing
+  continues, meaning that options and arguments can be mixed.  For example::
+
+     >>> getopt.getopt(['-f', 'filename', 'output', '-v'], 'f:v')
+     ([('-f', 'filename')], ['output', '-v'])
+     >>> getopt.gnu_getopt(['-f', 'filename', 'output', '-v'], 'f:v')
+     ([('-f', 'filename'), ('-v', '')], ['output'])
+
+  (Contributed by Peter Åstrand.)
+
+* The :mod:`grp`, :mod:`pwd`, and :mod:`resource` modules now return enhanced
+  tuples::
+
+     >>> import grp
+     >>> g = grp.getgrnam('amk')
+     >>> g.gr_name, g.gr_gid
+     ('amk', 500)
+
+* The :mod:`gzip` module can now handle files exceeding 2 GiB.
+
+* The new :mod:`heapq` module contains an implementation of a heap queue
+  algorithm.  A heap is an array-like data structure that keeps items in a
+  partially sorted order such that, for every index *k*, ``heap[k] <=
+  heap[2*k+1]`` and ``heap[k] <= heap[2*k+2]``.  This makes it quick to remove the
+  smallest item, and inserting a new item while maintaining the heap property is
+  O(lg n).  (See http://www.nist.gov/dads/HTML/priorityque.html for more
+  information about the priority queue data structure.)
+
+  The :mod:`heapq` module provides :func:`heappush` and :func:`heappop` functions
+  for adding and removing items while maintaining the heap property on top of some
+  other mutable Python sequence type.  Here's an example that uses a Python list::
+
+     >>> import heapq
+     >>> heap = []
+     >>> for item in [3, 7, 5, 11, 1]:
+     ...    heapq.heappush(heap, item)
+     ...
+     >>> heap
+     [1, 3, 5, 11, 7]
+     >>> heapq.heappop(heap)
+     1
+     >>> heapq.heappop(heap)
+     3
+     >>> heap
+     [5, 7, 11]
+
+  (Contributed by Kevin O'Connor.)
+
+* The IDLE integrated development environment has been updated using the code
+  from the IDLEfork project (http://idlefork.sf.net).  The most notable feature is
+  that the code being developed is now executed in a subprocess, meaning that
+  there's no longer any need for manual ``reload()`` operations. IDLE's core code
+  has been incorporated into the standard library as the :mod:`idlelib` package.
+
+* The :mod:`imaplib` module now supports IMAP over SSL. (Contributed by Piers
+  Lauder and Tino Lange.)
+
+* The :mod:`itertools` contains a number of useful functions for use with
+  iterators, inspired by various functions provided by the ML and Haskell
+  languages.  For example, ``itertools.ifilter(predicate, iterator)`` returns all
+  elements in the iterator for which the function :func:`predicate` returns
+  :const:`True`, and ``itertools.repeat(obj, N)`` returns ``obj`` *N* times.
+  There are a number of other functions in the module; see the package's reference
+  documentation for details.
+  (Contributed by Raymond Hettinger.)
+
+* Two new functions in the :mod:`math` module, :func:`degrees(rads)` and
+  :func:`radians(degs)`, convert between radians and degrees.  Other functions in
+  the :mod:`math` module such as :func:`math.sin` and :func:`math.cos` have always
+  required input values measured in radians.  Also, an optional *base* argument
+  was added to :func:`math.log` to make it easier to compute logarithms for bases
+  other than ``e`` and ``10``.  (Contributed by Raymond Hettinger.)
+
+* Several new POSIX functions (:func:`getpgid`, :func:`killpg`, :func:`lchown`,
+  :func:`loadavg`, :func:`major`, :func:`makedev`, :func:`minor`, and
+  :func:`mknod`) were added to the :mod:`posix` module that underlies the
+  :mod:`os` module. (Contributed by Gustavo Niemeyer, Geert Jansen, and Denis S.
+  Otkidach.)
+
+* In the :mod:`os` module, the :func:`\*stat` family of functions can now report
+  fractions of a second in a timestamp.  Such time stamps are represented as
+  floats, similar to the value returned by :func:`time.time`.
+
+  During testing, it was found that some applications will break if time stamps
+  are floats.  For compatibility, when using the tuple interface of the
+  :class:`stat_result` time stamps will be represented as integers. When using
+  named fields (a feature first introduced in Python 2.2), time stamps are still
+  represented as integers, unless :func:`os.stat_float_times` is invoked to enable
+  float return values::
+
+     >>> os.stat("/tmp").st_mtime
+     1034791200
+     >>> os.stat_float_times(True)
+     >>> os.stat("/tmp").st_mtime
+     1034791200.6335014
+
+  In Python 2.4, the default will change to always returning floats.
+
+  Application developers should enable this feature only if all their libraries
+  work properly when confronted with floating point time stamps, or if they use
+  the tuple API. If used, the feature should be activated on an application level
+  instead of trying to enable it on a per-use basis.
+
+* The :mod:`optparse` module contains a new parser for command-line arguments
+  that can convert option values to a particular Python type  and will
+  automatically generate a usage message.  See the following section for  more
+  details.
+
+* The old and never-documented :mod:`linuxaudiodev` module has been deprecated,
+  and a new version named :mod:`ossaudiodev` has been added.  The module was
+  renamed because the OSS sound drivers can be used on platforms other than Linux,
+  and the interface has also been tidied and brought up to date in various ways.
+  (Contributed by Greg Ward and Nicholas FitzRoy-Dale.)
+
+* The new :mod:`platform` module contains a number of functions that try to
+  determine various properties of the platform you're running on.  There are
+  functions for getting the architecture, CPU type, the Windows OS version, and
+  even the Linux distribution version. (Contributed by Marc-André Lemburg.)
+
+* The parser objects provided by the :mod:`pyexpat` module can now optionally
+  buffer character data, resulting in fewer calls to your character data handler
+  and therefore faster performance.  Setting the parser object's
+  :attr:`buffer_text` attribute to :const:`True` will enable buffering.
+
+* The :func:`sample(population, k)` function was added to the :mod:`random`
+  module.  *population* is a sequence or :class:`xrange` object containing the
+  elements of a population, and :func:`sample` chooses *k* elements from the
+  population without replacing chosen elements.  *k* can be any value up to
+  ``len(population)``. For example::
+
+     >>> days = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'St', 'Sn']
+     >>> random.sample(days, 3)      # Choose 3 elements
+     ['St', 'Sn', 'Th']
+     >>> random.sample(days, 7)      # Choose 7 elements
+     ['Tu', 'Th', 'Mo', 'We', 'St', 'Fr', 'Sn']
+     >>> random.sample(days, 7)      # Choose 7 again
+     ['We', 'Mo', 'Sn', 'Fr', 'Tu', 'St', 'Th']
+     >>> random.sample(days, 8)      # Can't choose eight
+     Traceback (most recent call last):
+       File "<stdin>", line 1, in ?
+       File "random.py", line 414, in sample
+           raise ValueError, "sample larger than population"
+     ValueError: sample larger than population
+     >>> random.sample(xrange(1,10000,2), 10)   # Choose ten odd nos. under 10000
+     [3407, 3805, 1505, 7023, 2401, 2267, 9733, 3151, 8083, 9195]
+
+  The :mod:`random` module now uses a new algorithm, the Mersenne Twister,
+  implemented in C.  It's faster and more extensively studied than the previous
+  algorithm.
+
+  (All changes contributed by Raymond Hettinger.)
+
+* The :mod:`readline` module also gained a number of new functions:
+  :func:`get_history_item`, :func:`get_current_history_length`, and
+  :func:`redisplay`.
+
+* The :mod:`rexec` and :mod:`Bastion` modules have been declared dead, and
+  attempts to import them will fail with a :exc:`RuntimeError`.  New-style classes
+  provide new ways to break out of the restricted execution environment provided
+  by :mod:`rexec`, and no one has interest in fixing them or time to do so.  If
+  you have applications using :mod:`rexec`, rewrite them to use something else.
+
+  (Sticking with Python 2.2 or 2.1 will not make your applications any safer
+  because there are known bugs in the :mod:`rexec` module in those versions.  To
+  repeat: if you're using :mod:`rexec`, stop using it immediately.)
+
+* The :mod:`rotor` module has been deprecated because the  algorithm it uses for
+  encryption is not believed to be secure.  If you need encryption, use one of the
+  several AES Python modules that are available separately.
+
+* The :mod:`shutil` module gained a :func:`move(src, dest)` function that
+  recursively moves a file or directory to a new location.
+
+* Support for more advanced POSIX signal handling was added to the :mod:`signal`
+  but then removed again as it proved impossible to make it work reliably across
+  platforms.
+
+* The :mod:`socket` module now supports timeouts.  You can call the
+  :meth:`settimeout(t)` method on a socket object to set a timeout of *t* seconds.
+  Subsequent socket operations that take longer than *t* seconds to complete will
+  abort and raise a :exc:`socket.timeout` exception.
+
+  The original timeout implementation was by Tim O'Malley.  Michael Gilfix
+  integrated it into the Python :mod:`socket` module and shepherded it through a
+  lengthy review.  After the code was checked in, Guido van Rossum rewrote parts
+  of it.  (This is a good example of a collaborative development process in
+  action.)
+
+* On Windows, the :mod:`socket` module now ships with Secure  Sockets Layer
+  (SSL) support.
+
+* The value of the C :const:`PYTHON_API_VERSION` macro is now exposed at the
+  Python level as ``sys.api_version``.  The current exception can be cleared by
+  calling the new :func:`sys.exc_clear` function.
+
+* The new :mod:`tarfile` module  allows reading from and writing to
+  :program:`tar`\ -format archive files. (Contributed by Lars Gustäbel.)
+
+* The new :mod:`textwrap` module contains functions for wrapping strings
+  containing paragraphs of text.  The :func:`wrap(text, width)` function takes a
+  string and returns a list containing the text split into lines of no more than
+  the chosen width.  The :func:`fill(text, width)` function returns a single
+  string, reformatted to fit into lines no longer than the chosen width. (As you
+  can guess, :func:`fill` is built on top of :func:`wrap`.  For example::
+
+     >>> import textwrap
+     >>> paragraph = "Not a whit, we defy augury: ... more text ..."
+     >>> textwrap.wrap(paragraph, 60)
+     ["Not a whit, we defy augury: there's a special providence in",
+      "the fall of a sparrow. If it be now, 'tis not to come; if it",
+      ...]
+     >>> print textwrap.fill(paragraph, 35)
+     Not a whit, we defy augury: there's
+     a special providence in the fall of
+     a sparrow. If it be now, 'tis not
+     to come; if it be not to come, it
+     will be now; if it be not now, yet
+     it will come: the readiness is all.
+     >>>
+
+  The module also contains a :class:`TextWrapper` class that actually implements
+  the text wrapping strategy.   Both the :class:`TextWrapper` class and the
+  :func:`wrap` and :func:`fill` functions support a number of additional keyword
+  arguments for fine-tuning the formatting; consult the module's documentation
+  for details. (Contributed by Greg Ward.)
+
+* The :mod:`thread` and :mod:`threading` modules now have companion modules,
+  :mod:`dummy_thread` and :mod:`dummy_threading`, that provide a do-nothing
+  implementation of the :mod:`thread` module's interface for platforms where
+  threads are not supported.  The intention is to simplify thread-aware modules
+  (ones that *don't* rely on threads to run) by putting the following code at the
+  top::
+
+     try:
+         import threading as _threading
+     except ImportError:
+         import dummy_threading as _threading
+
+  In this example, :mod:`_threading` is used as the module name to make it clear
+  that the module being used is not necessarily the actual :mod:`threading`
+  module. Code can call functions and use classes in :mod:`_threading` whether or
+  not threads are supported, avoiding an :keyword:`if` statement and making the
+  code slightly clearer.  This module will not magically make multithreaded code
+  run without threads; code that waits for another thread to return or to do
+  something will simply hang forever.
+
+* The :mod:`time` module's :func:`strptime` function has long been an annoyance
+  because it uses the platform C library's :func:`strptime` implementation, and
+  different platforms sometimes have odd bugs.  Brett Cannon contributed a
+  portable implementation that's written in pure Python and should behave
+  identically on all platforms.
+
+* The new :mod:`timeit` module helps measure how long snippets of Python code
+  take to execute.  The :file:`timeit.py` file can be run directly from the
+  command line, or the module's :class:`Timer` class can be imported and used
+  directly.  Here's a short example that figures out whether it's faster to
+  convert an 8-bit string to Unicode by appending an empty Unicode string to it or
+  by using the :func:`unicode` function::
+
+     import timeit
+
+     timer1 = timeit.Timer('unicode("abc")')
+     timer2 = timeit.Timer('"abc" + u""')
+
+     # Run three trials
+     print timer1.repeat(repeat=3, number=100000)
+     print timer2.repeat(repeat=3, number=100000)
+
+     # On my laptop this outputs:
+     # [0.36831796169281006, 0.37441694736480713, 0.35304892063140869]
+     # [0.17574405670166016, 0.18193507194519043, 0.17565798759460449]
+
+* The :mod:`Tix` module has received various bug fixes and updates for the
+  current version of the Tix package.
+
+* The :mod:`Tkinter` module now works with a thread-enabled  version of Tcl.
+  Tcl's threading model requires that widgets only be accessed from the thread in
+  which they're created; accesses from another thread can cause Tcl to panic.  For
+  certain Tcl interfaces, :mod:`Tkinter` will now automatically avoid this  when a
+  widget is accessed from a different thread by marshalling a command, passing it
+  to the correct thread, and waiting for the results.  Other interfaces can't be
+  handled automatically but :mod:`Tkinter` will now raise an exception on such an
+  access so that you can at least find out about the problem.  See
+  http://mail.python.org/pipermail/python-dev/2002-December/031107.html for a more
+  detailed explanation of this change.  (Implemented by Martin von Löwis.)
+
+  .. % 
+
+* Calling Tcl methods through :mod:`_tkinter` no longer  returns only strings.
+  Instead, if Tcl returns other objects those objects are converted to their
+  Python equivalent, if one exists, or wrapped with a :class:`_tkinter.Tcl_Obj`
+  object if no Python equivalent exists. This behavior can be controlled through
+  the :meth:`wantobjects` method of :class:`tkapp` objects.
+
+  When using :mod:`_tkinter` through the :mod:`Tkinter` module (as most Tkinter
+  applications will), this feature is always activated. It should not cause
+  compatibility problems, since Tkinter would always convert string results to
+  Python types where possible.
+
+  If any incompatibilities are found, the old behavior can be restored by setting
+  the :attr:`wantobjects` variable in the :mod:`Tkinter` module to false before
+  creating the first :class:`tkapp` object. ::
+
+     import Tkinter
+     Tkinter.wantobjects = 0
+
+  Any breakage caused by this change should be reported as a bug.
+
+* The :mod:`UserDict` module has a new :class:`DictMixin` class which defines
+  all dictionary methods for classes that already have a minimum mapping
+  interface.  This greatly simplifies writing classes that need to be
+  substitutable for dictionaries, such as the classes in  the :mod:`shelve`
+  module.
+
+  Adding the mix-in as a superclass provides the full dictionary interface
+  whenever the class defines :meth:`__getitem__`, :meth:`__setitem__`,
+  :meth:`__delitem__`, and :meth:`keys`. For example::
+
+     >>> import UserDict
+     >>> class SeqDict(UserDict.DictMixin):
+     ...     """Dictionary lookalike implemented with lists."""
+     ...     def __init__(self):
+     ...         self.keylist = []
+     ...         self.valuelist = []
+     ...     def __getitem__(self, key):
+     ...         try:
+     ...             i = self.keylist.index(key)
+     ...         except ValueError:
+     ...             raise KeyError
+     ...         return self.valuelist[i]
+     ...     def __setitem__(self, key, value):
+     ...         try:
+     ...             i = self.keylist.index(key)
+     ...             self.valuelist[i] = value
+     ...         except ValueError:
+     ...             self.keylist.append(key)
+     ...             self.valuelist.append(value)
+     ...     def __delitem__(self, key):
+     ...         try:
+     ...             i = self.keylist.index(key)
+     ...         except ValueError:
+     ...             raise KeyError
+     ...         self.keylist.pop(i)
+     ...         self.valuelist.pop(i)
+     ...     def keys(self):
+     ...         return list(self.keylist)
+     ... 
+     >>> s = SeqDict()
+     >>> dir(s)      # See that other dictionary methods are implemented
+     ['__cmp__', '__contains__', '__delitem__', '__doc__', '__getitem__',
+      '__init__', '__iter__', '__len__', '__module__', '__repr__',
+      '__setitem__', 'clear', 'get', 'has_key', 'items', 'iteritems',
+      'iterkeys', 'itervalues', 'keylist', 'keys', 'pop', 'popitem',
+      'setdefault', 'update', 'valuelist', 'values']
+
+  (Contributed by Raymond Hettinger.)
+
+* The DOM implementation in :mod:`xml.dom.minidom` can now generate XML output
+  in a particular encoding by providing an optional encoding argument to the
+  :meth:`toxml` and :meth:`toprettyxml` methods of DOM nodes.
+
+* The :mod:`xmlrpclib` module now supports an XML-RPC extension for handling nil
+  data values such as Python's ``None``.  Nil values are always supported on
+  unmarshalling an XML-RPC response.  To generate requests containing ``None``,
+  you must supply a true value for the *allow_none* parameter when creating a
+  :class:`Marshaller` instance.
+
+* The new :mod:`DocXMLRPCServer` module allows writing self-documenting XML-RPC
+  servers. Run it in demo mode (as a program) to see it in action.   Pointing the
+  Web browser to the RPC server produces pydoc-style documentation; pointing
+  xmlrpclib to the server allows invoking the actual methods. (Contributed by
+  Brian Quinlan.)
+
+* Support for internationalized domain names (RFCs 3454, 3490, 3491, and 3492)
+  has been added. The "idna" encoding can be used to convert between a Unicode
+  domain name and the ASCII-compatible encoding (ACE) of that name. ::
+
+     >{}>{}> u"www.Alliancefrançaise.nu".encode("idna")
+     'www.xn--alliancefranaise-npb.nu'
+
+  The :mod:`socket` module has also been extended to transparently convert
+  Unicode hostnames to the ACE version before passing them to the C library.
+  Modules that deal with hostnames such as :mod:`httplib` and :mod:`ftplib`)
+  also support Unicode host names; :mod:`httplib` also sends HTTP ``Host``
+  headers using the ACE version of the domain name.  :mod:`urllib` supports
+  Unicode URLs with non-ASCII host names as long as the ``path`` part of the URL
+  is ASCII only.
+
+  To implement this change, the :mod:`stringprep` module, the  ``mkstringprep``
+  tool and the ``punycode`` encoding have been added.
+
+.. % ======================================================================
+
+
+Date/Time Type
+--------------
+
+Date and time types suitable for expressing timestamps were added as the
+:mod:`datetime` module.  The types don't support different calendars or many
+fancy features, and just stick to the basics of representing time.
+
+The three primary types are: :class:`date`, representing a day, month, and year;
+:class:`time`, consisting of hour, minute, and second; and :class:`datetime`,
+which contains all the attributes of both :class:`date` and :class:`time`.
+There's also a :class:`timedelta` class representing differences between two
+points in time, and time zone logic is implemented by classes inheriting from
+the abstract :class:`tzinfo` class.
+
+You can create instances of :class:`date` and :class:`time` by either supplying
+keyword arguments to the appropriate constructor, e.g.
+``datetime.date(year=1972, month=10, day=15)``, or by using one of a number of
+class methods.  For example, the :meth:`date.today` class method returns the
+current local date.
+
+Once created, instances of the date/time classes are all immutable. There are a
+number of methods for producing formatted strings from objects::
+
+   >>> import datetime
+   >>> now = datetime.datetime.now()
+   >>> now.isoformat()
+   '2002-12-30T21:27:03.994956'
+   >>> now.ctime()  # Only available on date, datetime
+   'Mon Dec 30 21:27:03 2002'
+   >>> now.strftime('%Y %d %b')
+   '2002 30 Dec'
+
+The :meth:`replace` method allows modifying one or more fields  of a
+:class:`date` or :class:`datetime` instance, returning a new instance::
+
+   >>> d = datetime.datetime.now()
+   >>> d
+   datetime.datetime(2002, 12, 30, 22, 15, 38, 827738)
+   >>> d.replace(year=2001, hour = 12)
+   datetime.datetime(2001, 12, 30, 12, 15, 38, 827738)
+   >>>
+
+Instances can be compared, hashed, and converted to strings (the result is the
+same as that of :meth:`isoformat`).  :class:`date` and :class:`datetime`
+instances can be subtracted from each other, and added to :class:`timedelta`
+instances.  The largest missing feature is that there's no standard library
+support for parsing strings and getting back a :class:`date` or
+:class:`datetime`.
+
+For more information, refer to the module's reference documentation.
+(Contributed by Tim Peters.)
+
+.. % ======================================================================
+
+
+The optparse Module
+-------------------
+
+The :mod:`getopt` module provides simple parsing of command-line arguments.  The
+new :mod:`optparse` module (originally named Optik) provides more elaborate
+command-line parsing that follows the Unix conventions, automatically creates
+the output for :option:`--help`, and can perform different actions for different
+options.
+
+You start by creating an instance of :class:`OptionParser` and telling it what
+your program's options are. ::
+
+   import sys
+   from optparse import OptionParser
+
+   op = OptionParser()
+   op.add_option('-i', '--input',
+                 action='store', type='string', dest='input',
+                 help='set input filename')
+   op.add_option('-l', '--length',
+                 action='store', type='int', dest='length',
+                 help='set maximum length of output')
+
+Parsing a command line is then done by calling the :meth:`parse_args` method. ::
+
+   options, args = op.parse_args(sys.argv[1:])
+   print options
+   print args
+
+This returns an object containing all of the option values, and a list of
+strings containing the remaining arguments.
+
+Invoking the script with the various arguments now works as you'd expect it to.
+Note that the length argument is automatically converted to an integer. ::
+
+   $ ./python opt.py -i data arg1
+   <Values at 0x400cad4c: {'input': 'data', 'length': None}>
+   ['arg1']
+   $ ./python opt.py --input=data --length=4
+   <Values at 0x400cad2c: {'input': 'data', 'length': 4}>
+   []
+   $
+
+The help message is automatically generated for you::
+
+   $ ./python opt.py --help
+   usage: opt.py [options]
+
+   options:
+     -h, --help            show this help message and exit
+     -iINPUT, --input=INPUT
+                           set input filename
+     -lLENGTH, --length=LENGTH
+                           set maximum length of output
+   $ 
+
+See the module's documentation for more details.
+
+
+Optik was written by Greg Ward, with suggestions from the readers of the Getopt
+SIG.
+
+.. % ======================================================================
+
+
+.. _section-pymalloc:
+
+Pymalloc: A Specialized Object Allocator
+========================================
+
+Pymalloc, a specialized object allocator written by Vladimir Marangozov, was a
+feature added to Python 2.1.  Pymalloc is intended to be faster than the system
+:cfunc:`malloc` and to have less memory overhead for allocation patterns typical
+of Python programs. The allocator uses C's :cfunc:`malloc` function to get large
+pools of memory and then fulfills smaller memory requests from these pools.
+
+In 2.1 and 2.2, pymalloc was an experimental feature and wasn't enabled by
+default; you had to explicitly enable it when compiling Python by providing the
+:option:`--with-pymalloc` option to the :program:`configure` script.  In 2.3,
+pymalloc has had further enhancements and is now enabled by default; you'll have
+to supply :option:`--without-pymalloc` to disable it.
+
+This change is transparent to code written in Python; however, pymalloc may
+expose bugs in C extensions.  Authors of C extension modules should test their
+code with pymalloc enabled, because some incorrect code may cause core dumps at
+runtime.
+
+There's one particularly common error that causes problems.  There are a number
+of memory allocation functions in Python's C API that have previously just been
+aliases for the C library's :cfunc:`malloc` and :cfunc:`free`, meaning that if
+you accidentally called mismatched functions the error wouldn't be noticeable.
+When the object allocator is enabled, these functions aren't aliases of
+:cfunc:`malloc` and :cfunc:`free` any more, and calling the wrong function to
+free memory may get you a core dump.  For example, if memory was allocated using
+:cfunc:`PyObject_Malloc`, it has to be freed using :cfunc:`PyObject_Free`, not
+:cfunc:`free`.  A few modules included with Python fell afoul of this and had to
+be fixed; doubtless there are more third-party modules that will have the same
+problem.
+
+As part of this change, the confusing multiple interfaces for allocating memory
+have been consolidated down into two API families. Memory allocated with one
+family must not be manipulated with functions from the other family.  There is
+one family for allocating chunks of memory and another family of functions
+specifically for allocating Python objects.
+
+* To allocate and free an undistinguished chunk of memory use the "raw memory"
+  family: :cfunc:`PyMem_Malloc`, :cfunc:`PyMem_Realloc`, and :cfunc:`PyMem_Free`.
+
+* The "object memory" family is the interface to the pymalloc facility described
+  above and is biased towards a large number of "small" allocations:
+  :cfunc:`PyObject_Malloc`, :cfunc:`PyObject_Realloc`, and :cfunc:`PyObject_Free`.
+
+* To allocate and free Python objects, use the "object" family
+  :cfunc:`PyObject_New`, :cfunc:`PyObject_NewVar`, and :cfunc:`PyObject_Del`.
+
+Thanks to lots of work by Tim Peters, pymalloc in 2.3 also provides debugging
+features to catch memory overwrites and doubled frees in both extension modules
+and in the interpreter itself.  To enable this support, compile a debugging
+version of the Python interpreter by running :program:`configure` with
+:option:`--with-pydebug`.
+
+To aid extension writers, a header file :file:`Misc/pymemcompat.h` is
+distributed with the source to Python 2.3 that allows Python extensions to use
+the 2.3 interfaces to memory allocation while compiling against any version of
+Python since 1.5.2.  You would copy the file from Python's source distribution
+and bundle it with the source of your extension.
+
+
+.. seealso::
+
+   http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/dist/src/Objects/obmalloc.c
+      For the full details of the pymalloc implementation, see the comments at the top
+      of the file :file:`Objects/obmalloc.c` in the Python source code.  The above
+      link points to the file within the SourceForge CVS browser.
+
+.. % ======================================================================
+
+
+Build and C API Changes
+=======================
+
+Changes to Python's build process and to the C API include:
+
+* The cycle detection implementation used by the garbage collection has proven
+  to be stable, so it's now been made mandatory.  You can no longer compile Python
+  without it, and the :option:`--with-cycle-gc` switch to :program:`configure` has
+  been removed.
+
+* Python can now optionally be built as a shared library
+  (:file:`libpython2.3.so`) by supplying :option:`--enable-shared` when running
+  Python's :program:`configure` script.  (Contributed by Ondrej Palkovsky.)
+
+* The :cmacro:`DL_EXPORT` and :cmacro:`DL_IMPORT` macros are now deprecated.
+  Initialization functions for Python extension modules should now be declared
+  using the new macro :cmacro:`PyMODINIT_FUNC`, while the Python core will
+  generally use the :cmacro:`PyAPI_FUNC` and :cmacro:`PyAPI_DATA` macros.
+
+* The interpreter can be compiled without any docstrings for the built-in
+  functions and modules by supplying :option:`--without-doc-strings` to the
+  :program:`configure` script. This makes the Python executable about 10% smaller,
+  but will also mean that you can't get help for Python's built-ins.  (Contributed
+  by Gustavo Niemeyer.)
+
+* The :cfunc:`PyArg_NoArgs` macro is now deprecated, and code that uses it
+  should be changed.  For Python 2.2 and later, the method definition table can
+  specify the :const:`METH_NOARGS` flag, signalling that there are no arguments,
+  and the argument checking can then be removed.  If compatibility with pre-2.2
+  versions of Python is important, the code could use ``PyArg_ParseTuple(args,
+  "")`` instead, but this will be slower than using :const:`METH_NOARGS`.
+
+* :cfunc:`PyArg_ParseTuple` accepts new format characters for various sizes of
+  unsigned integers: ``B`` for :ctype:`unsigned char`, ``H`` for :ctype:`unsigned
+  short int`,  ``I`` for :ctype:`unsigned int`,  and ``K`` for :ctype:`unsigned
+  long long`.
+
+* A new function, :cfunc:`PyObject_DelItemString(mapping, char \*key)` was added
+  as shorthand for ``PyObject_DelItem(mapping, PyString_New(key))``.
+
+* File objects now manage their internal string buffer differently, increasing
+  it exponentially when needed.  This results in the benchmark tests in
+  :file:`Lib/test/test_bufio.py` speeding up considerably (from 57 seconds to 1.7
+  seconds, according to one measurement).
+
+* It's now possible to define class and static methods for a C extension type by
+  setting either the :const:`METH_CLASS` or :const:`METH_STATIC` flags in a
+  method's :ctype:`PyMethodDef` structure.
+
+* Python now includes a copy of the Expat XML parser's source code, removing any
+  dependence on a system version or local installation of Expat.
+
+* If you dynamically allocate type objects in your extension, you should be
+  aware of a change in the rules relating to the :attr:`__module__` and
+  :attr:`__name__` attributes.  In summary, you will want to ensure the type's
+  dictionary contains a ``'__module__'`` key; making the module name the part of
+  the type name leading up to the final period will no longer have the desired
+  effect.  For more detail, read the API reference documentation or the  source.
+
+.. % ======================================================================
+
+
+Port-Specific Changes
+---------------------
+
+Support for a port to IBM's OS/2 using the EMX runtime environment was merged
+into the main Python source tree.  EMX is a POSIX emulation layer over the OS/2
+system APIs.  The Python port for EMX tries to support all the POSIX-like
+capability exposed by the EMX runtime, and mostly succeeds; :func:`fork` and
+:func:`fcntl` are restricted by the limitations of the underlying emulation
+layer.  The standard OS/2 port, which uses IBM's Visual Age compiler, also
+gained support for case-sensitive import semantics as part of the integration of
+the EMX port into CVS.  (Contributed by Andrew MacIntyre.)
+
+On MacOS, most toolbox modules have been weaklinked to improve backward
+compatibility.  This means that modules will no longer fail to load if a single
+routine is missing on the current OS version. Instead calling the missing
+routine will raise an exception. (Contributed by Jack Jansen.)
+
+The RPM spec files, found in the :file:`Misc/RPM/` directory in the Python
+source distribution, were updated for 2.3.  (Contributed by Sean Reifschneider.)
+
+Other new platforms now supported by Python include AtheOS
+(http://www.atheos.cx/), GNU/Hurd, and OpenVMS.
+
+.. % ======================================================================
+
+
+.. _section-other:
+
+Other Changes and Fixes
+=======================
+
+As usual, there were a bunch of other improvements and bugfixes scattered
+throughout the source tree.  A search through the CVS change logs finds there
+were 523 patches applied and 514 bugs fixed between Python 2.2 and 2.3.  Both
+figures are likely to be underestimates.
+
+Some of the more notable changes are:
+
+* If the :envvar:`PYTHONINSPECT` environment variable is set, the Python
+  interpreter will enter the interactive prompt after running a Python program, as
+  if Python had been invoked with the :option:`-i` option. The environment
+  variable can be set before running the Python interpreter, or it can be set by
+  the Python program as part of its execution.
+
+* The :file:`regrtest.py` script now provides a way to allow "all resources
+  except *foo*."  A resource name passed to the :option:`-u` option can now be
+  prefixed with a hyphen (``'-'``) to mean "remove this resource."  For example,
+  the option '``-uall,-bsddb``' could be used to enable the use of all resources
+  except ``bsddb``.
+
+* The tools used to build the documentation now work under Cygwin as well as
+  Unix.
+
+* The ``SET_LINENO`` opcode has been removed.  Back in the mists of time, this
+  opcode was needed to produce line numbers in tracebacks and support trace
+  functions (for, e.g., :mod:`pdb`). Since Python 1.5, the line numbers in
+  tracebacks have been computed using a different mechanism that works with
+  "python -O".  For Python 2.3 Michael Hudson implemented a similar scheme to
+  determine when to call the trace function, removing the need for ``SET_LINENO``
+  entirely.
+
+  It would be difficult to detect any resulting difference from Python code, apart
+  from a slight speed up when Python is run without :option:`-O`.
+
+  C extensions that access the :attr:`f_lineno` field of frame objects should
+  instead call ``PyCode_Addr2Line(f->f_code, f->f_lasti)``. This will have the
+  added effect of making the code work as desired under "python -O" in earlier
+  versions of Python.
+
+  A nifty new feature is that trace functions can now assign to the
+  :attr:`f_lineno` attribute of frame objects, changing the line that will be
+  executed next.  A ``jump`` command has been added to the :mod:`pdb` debugger
+  taking advantage of this new feature. (Implemented by Richie Hindle.)
+
+.. % ======================================================================
+
+
+Porting to Python 2.3
+=====================
+
+This section lists previously described changes that may require changes to your
+code:
+
+* :keyword:`yield` is now always a keyword; if it's used as a variable name in
+  your code, a different name must be chosen.
+
+* For strings *X* and *Y*, ``X in Y`` now works if *X* is more than one
+  character long.
+
+* The :func:`int` type constructor will now return a long integer instead of
+  raising an :exc:`OverflowError` when a string or floating-point number is too
+  large to fit into an integer.
+
+* If you have Unicode strings that contain 8-bit characters, you must declare
+  the file's encoding (UTF-8, Latin-1, or whatever) by adding a comment to the top
+  of the file.  See section :ref:`section-encodings` for more information.
+
+* Calling Tcl methods through :mod:`_tkinter` no longer  returns only strings.
+  Instead, if Tcl returns other objects those objects are converted to their
+  Python equivalent, if one exists, or wrapped with a :class:`_tkinter.Tcl_Obj`
+  object if no Python equivalent exists.
+
+* Large octal and hex literals such as ``0xffffffff`` now trigger a
+  :exc:`FutureWarning`. Currently they're stored as 32-bit numbers and result in a
+  negative value, but in Python 2.4 they'll become positive long integers.
+
+  There are a few ways to fix this warning.  If you really need a positive number,
+  just add an ``L`` to the end of the literal.  If you're trying to get a 32-bit
+  integer with low bits set and have previously used an expression such as ``~(1
+  << 31)``, it's probably clearest to start with all bits set and clear the
+  desired upper bits. For example, to clear just the top bit (bit 31), you could
+  write ``0xffffffffL &~(1L<<31)``.
+
+  .. % The empty groups below prevent conversion to guillemets.
+
+* You can no longer disable assertions by assigning to ``__debug__``.
+
+* The Distutils :func:`setup` function has gained various new keyword arguments
+  such as *depends*.  Old versions of the Distutils will abort if passed unknown
+  keywords.  A solution is to check for the presence of the new
+  :func:`get_distutil_options` function in your :file:`setup.py` and only uses the
+  new keywords with a version of the Distutils that supports them::
+
+     from distutils import core
+
+     kw = {'sources': 'foo.c', ...}
+     if hasattr(core, 'get_distutil_options'):
+         kw['depends'] = ['foo.h']
+     ext = Extension(**kw)
+
+* Using ``None`` as a variable name will now result in a :exc:`SyntaxWarning`
+  warning.
+
+* Names of extension types defined by the modules included with Python now
+  contain the module and a ``'.'`` in front of the type name.
+
+.. % ======================================================================
+
+
+.. _acks:
+
+Acknowledgements
+================
+
+The author would like to thank the following people for offering suggestions,
+corrections and assistance with various drafts of this article: Jeff Bauer,
+Simon Brunning, Brett Cannon, Michael Chermside, Andrew Dalke, Scott David
+Daniels, Fred L. Drake, Jr., David Fraser,  Kelly Gerber, Raymond Hettinger,
+Michael Hudson, Chris Lambert, Detlef Lannert, Martin von Löwis, Andrew
+MacIntyre, Lalo Martins, Chad Netzer, Gustavo Niemeyer, Neal Norwitz, Hans
+Nowak, Chris Reedy, Francesco Ricciardi, Vinay Sajip, Neil Schemenauer, Roman
+Suzi, Jason Tishler, Just van Rossum.
+
diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst
new file mode 100644
index 0000000..d782f5d
--- /dev/null
+++ b/Doc/whatsnew/2.4.rst
@@ -0,0 +1,1571 @@
+****************************
+  What's New in Python 2.4  
+****************************
+
+:Author: A.M. Kuchling
+
+.. |release| replace:: 1.02
+
+.. % $Id: whatsnew24.tex 55005 2007-04-27 19:54:29Z guido.van.rossum $
+.. % Don't write extensive text for new sections; I'll do that.
+.. % Feel free to add commented-out reminders of things that need
+.. % to be covered.  --amk
+
+This article explains the new features in Python 2.4.1, released on March 30,
+2005.
+
+Python 2.4 is a medium-sized release.  It doesn't introduce as many changes as
+the radical Python 2.2, but introduces more features than the conservative 2.3
+release.  The most significant new language features are function decorators and
+generator expressions; most other changes are to the standard library.
+
+According to the CVS change logs, there were 481 patches applied and 502 bugs
+fixed between Python 2.3 and 2.4.  Both figures are likely to be underestimates.
+
+This article doesn't attempt to provide a complete specification of every single
+new feature, but instead provides a brief introduction to each feature.  For
+full details, you should refer to the documentation for Python 2.4, such as the
+Python Library Reference and the Python Reference Manual.  Often you will be
+referred to the PEP for a particular new feature for explanations of the
+implementation and design rationale.
+
+.. % ======================================================================
+
+
+PEP 218: Built-In Set Objects
+=============================
+
+Python 2.3 introduced the :mod:`sets` module.  C implementations of set data
+types have now been added to the Python core as two new built-in types,
+:func:`set(iterable)` and :func:`frozenset(iterable)`.  They provide high speed
+operations for membership testing, for eliminating duplicates from sequences,
+and for mathematical operations like unions, intersections, differences, and
+symmetric differences. ::
+
+   >>> a = set('abracadabra')              # form a set from a string
+   >>> 'z' in a                            # fast membership testing
+   False
+   >>> a                                   # unique letters in a
+   set(['a', 'r', 'b', 'c', 'd'])
+   >>> ''.join(a)                          # convert back into a string
+   'arbcd'
+
+   >>> b = set('alacazam')                 # form a second set
+   >>> a - b                               # letters in a but not in b
+   set(['r', 'd', 'b'])
+   >>> a | b                               # letters in either a or b
+   set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
+   >>> a & b                               # letters in both a and b
+   set(['a', 'c'])
+   >>> a ^ b                               # letters in a or b but not both
+   set(['r', 'd', 'b', 'm', 'z', 'l'])
+
+   >>> a.add('z')                          # add a new element
+   >>> a.update('wxy')                     # add multiple new elements
+   >>> a
+   set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'x', 'z'])       
+   >>> a.remove('x')                       # take one element out
+   >>> a
+   set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'z'])       
+
+The :func:`frozenset` type is an immutable version of :func:`set`. Since it is
+immutable and hashable, it may be used as a dictionary key or as a member of
+another set.
+
+The :mod:`sets` module remains in the standard library, and may be useful if you
+wish to subclass the :class:`Set` or :class:`ImmutableSet` classes.  There are
+currently no plans to deprecate the module.
+
+
+.. seealso::
+
+   :pep:`218` - Adding a Built-In Set Object Type
+      Originally proposed by Greg Wilson and ultimately implemented by Raymond
+      Hettinger.
+
+.. % ======================================================================
+
+
+PEP 237: Unifying Long Integers and Integers
+============================================
+
+The lengthy transition process for this PEP, begun in Python 2.2, takes another
+step forward in Python 2.4.  In 2.3, certain integer operations that would
+behave differently after int/long unification triggered :exc:`FutureWarning`
+warnings and returned values limited to 32 or 64 bits (depending on your
+platform).  In 2.4, these expressions no longer produce a warning and instead
+produce a different result that's usually a long integer.
+
+The problematic expressions are primarily left shifts and lengthy hexadecimal
+and octal constants.  For example, ``2 << 32`` results in a warning in 2.3,
+evaluating to 0 on 32-bit platforms.  In Python 2.4, this expression now returns
+the correct answer, 8589934592.
+
+
+.. seealso::
+
+   :pep:`237` - Unifying Long Integers and Integers
+      Original PEP written by Moshe Zadka and GvR.  The changes for 2.4 were
+      implemented by  Kalle Svensson.
+
+.. % ======================================================================
+
+
+PEP 289: Generator Expressions
+==============================
+
+The iterator feature introduced in Python 2.2 and the :mod:`itertools` module
+make it easier to write programs that loop through large data sets without
+having the entire data set in memory at one time.  List comprehensions don't fit
+into this picture very well because they produce a Python list object containing
+all of the items.  This unavoidably pulls all of the objects into memory, which
+can be a problem if your data set is very large.  When trying to write a
+functionally-styled program, it would be natural to write something like::
+
+   links = [link for link in get_all_links() if not link.followed]
+   for link in links:
+       ...
+
+instead of  ::
+
+   for link in get_all_links():
+       if link.followed:
+           continue
+       ...
+
+The first form is more concise and perhaps more readable, but if you're dealing
+with a large number of link objects you'd have to write the second form to avoid
+having all link objects in memory at the same time.
+
+Generator expressions work similarly to list comprehensions but don't
+materialize the entire list; instead they create a generator that will return
+elements one by one.  The above example could be written as::
+
+   links = (link for link in get_all_links() if not link.followed)
+   for link in links:
+       ...
+
+Generator expressions always have to be written inside parentheses, as in the
+above example.  The parentheses signalling a function call also count, so if you
+want to create an iterator that will be immediately passed to a function you
+could write::
+
+   print sum(obj.count for obj in list_all_objects())
+
+Generator expressions differ from list comprehensions in various small ways.
+Most notably, the loop variable (*obj* in the above example) is not accessible
+outside of the generator expression.  List comprehensions leave the variable
+assigned to its last value; future versions of Python will change this, making
+list comprehensions match generator expressions in this respect.
+
+
+.. seealso::
+
+   :pep:`289` - Generator Expressions
+      Proposed by Raymond Hettinger and implemented by Jiwon Seo with early efforts
+      steered by Hye-Shik Chang.
+
+.. % ======================================================================
+
+
+PEP 292: Simpler String Substitutions
+=====================================
+
+Some new classes in the standard library provide an alternative mechanism for
+substituting variables into strings; this style of substitution may be better
+for applications where untrained users need to edit templates.
+
+The usual way of substituting variables by name is the ``%`` operator::
+
+   >>> '%(page)i: %(title)s' % {'page':2, 'title': 'The Best of Times'}
+   '2: The Best of Times'
+
+When writing the template string, it can be easy to forget the ``i`` or ``s``
+after the closing parenthesis.  This isn't a big problem if the template is in a
+Python module, because you run the code, get an "Unsupported format character"
+:exc:`ValueError`, and fix the problem.  However, consider an application such
+as Mailman where template strings or translations are being edited by users who
+aren't aware of the Python language.  The format string's syntax is complicated
+to explain to such users, and if they make a mistake, it's difficult to provide
+helpful feedback to them.
+
+PEP 292 adds a :class:`Template` class to the :mod:`string` module that uses
+``$`` to indicate a substitution::
+
+   >>> import string
+   >>> t = string.Template('$page: $title')
+   >>> t.substitute({'page':2, 'title': 'The Best of Times'})
+   '2: The Best of Times'
+
+If a key is missing from the dictionary, the :meth:`substitute` method will
+raise a :exc:`KeyError`.  There's also a :meth:`safe_substitute` method that
+ignores missing keys:
+
+.. % $ Terminate $-mode for Emacs
+
+::
+
+   >>> t = string.Template('$page: $title')
+   >>> t.safe_substitute({'page':3})
+   '3: $title'
+
+.. % $ Terminate math-mode for Emacs
+
+
+.. seealso::
+
+   :pep:`292` - Simpler String Substitutions
+      Written and implemented  by Barry Warsaw.
+
+.. % ======================================================================
+
+
+PEP 318: Decorators for Functions and Methods
+=============================================
+
+Python 2.2 extended Python's object model by adding static methods and class
+methods, but it didn't extend Python's syntax to provide any new way of defining
+static or class methods.  Instead, you had to write a :keyword:`def` statement
+in the usual way, and pass the resulting method to a :func:`staticmethod` or
+:func:`classmethod` function that would wrap up the function as a method of the
+new type. Your code would look like this::
+
+   class C:
+      def meth (cls):
+          ...
+
+      meth = classmethod(meth)   # Rebind name to wrapped-up class method
+
+If the method was very long, it would be easy to miss or forget the
+:func:`classmethod` invocation after the function body.
+
+The intention was always to add some syntax to make such definitions more
+readable, but at the time of 2.2's release a good syntax was not obvious.  Today
+a good syntax *still* isn't obvious but users are asking for easier access to
+the feature; a new syntactic feature has been added to meet this need.
+
+The new feature is called "function decorators".  The name comes from the idea
+that :func:`classmethod`, :func:`staticmethod`, and friends are storing
+additional information on a function object; they're *decorating* functions with
+more details.
+
+The notation borrows from Java and uses the ``'@'`` character as an indicator.
+Using the new syntax, the example above would be written::
+
+   class C:
+
+      @classmethod
+      def meth (cls):
+          ...
+
+
+The ``@classmethod`` is shorthand for the ``meth=classmethod(meth)`` assignment.
+More generally, if you have the following::
+
+   @A
+   @B
+   @C
+   def f ():
+       ...
+
+It's equivalent to the following pre-decorator code::
+
+   def f(): ...
+   f = A(B(C(f)))
+
+Decorators must come on the line before a function definition, one decorator per
+line, and can't be on the same line as the def statement, meaning that ``@A def
+f(): ...`` is illegal.  You can only decorate function definitions, either at
+the module level or inside a class; you can't decorate class definitions.
+
+A decorator is just a function that takes the function to be decorated as an
+argument and returns either the same function or some new object.  The return
+value of the decorator need not be callable (though it typically is), unless
+further decorators will be applied to the result.  It's easy to write your own
+decorators.  The following simple example just sets an attribute on the function
+object::
+
+   >>> def deco(func):
+   ...    func.attr = 'decorated'
+   ...    return func
+   ...
+   >>> @deco
+   ... def f(): pass
+   ...
+   >>> f
+   <function f at 0x402ef0d4>
+   >>> f.attr
+   'decorated'
+   >>>
+
+As a slightly more realistic example, the following decorator checks that the
+supplied argument is an integer::
+
+   def require_int (func):
+       def wrapper (arg):
+           assert isinstance(arg, int)
+           return func(arg)
+
+       return wrapper
+
+   @require_int
+   def p1 (arg):
+       print arg
+
+   @require_int
+   def p2(arg):
+       print arg*2
+
+An example in :pep:`318` contains a fancier version of this idea that lets you
+both specify the required type and check the returned type.
+
+Decorator functions can take arguments.  If arguments are supplied, your
+decorator function is called with only those arguments and must return a new
+decorator function; this function must take a single function and return a
+function, as previously described.  In other words, ``@A @B @C(args)`` becomes::
+
+   def f(): ...
+   _deco = C(args)
+   f = A(B(_deco(f)))
+
+Getting this right can be slightly brain-bending, but it's not too difficult.
+
+A small related change makes the :attr:`func_name` attribute of functions
+writable.  This attribute is used to display function names in tracebacks, so
+decorators should change the name of any new function that's constructed and
+returned.
+
+
+.. seealso::
+
+   :pep:`318` - Decorators for Functions, Methods and Classes
+      Written  by Kevin D. Smith, Jim Jewett, and Skip Montanaro.  Several people
+      wrote patches implementing function decorators, but the one that was actually
+      checked in was patch #979728, written by Mark Russell.
+
+   http://www.python.org/moin/PythonDecoratorLibrary
+      This Wiki page contains several examples of decorators.
+
+.. % ======================================================================
+
+
+PEP 322: Reverse Iteration
+==========================
+
+A new built-in function, :func:`reversed(seq)`, takes a sequence and returns an
+iterator that loops over the elements of the sequence  in reverse order.   ::
+
+   >>> for i in reversed(xrange(1,4)):
+   ...    print i
+   ... 
+   3
+   2
+   1
+
+Compared to extended slicing, such as ``range(1,4)[::-1]``, :func:`reversed` is
+easier to read, runs faster, and uses substantially less memory.
+
+Note that :func:`reversed` only accepts sequences, not arbitrary iterators.  If
+you want to reverse an iterator, first convert it to  a list with :func:`list`.
+::
+
+   >>> input = open('/etc/passwd', 'r')
+   >>> for line in reversed(list(input)):
+   ...   print line
+   ... 
+   root:*:0:0:System Administrator:/var/root:/bin/tcsh
+     ...
+
+
+.. seealso::
+
+   :pep:`322` - Reverse Iteration
+      Written and implemented by Raymond Hettinger.
+
+.. % ======================================================================
+
+
+PEP 324: New subprocess Module
+==============================
+
+The standard library provides a number of ways to execute a subprocess, offering
+different features and different levels of complexity.
+:func:`os.system(command)` is easy to use, but slow (it runs a shell process
+which executes the command) and dangerous (you have to be careful about escaping
+the shell's metacharacters).  The :mod:`popen2` module offers classes that can
+capture standard output and standard error from the subprocess, but the naming
+is confusing.  The :mod:`subprocess` module cleans  this up, providing a unified
+interface that offers all the features you might need.
+
+Instead of :mod:`popen2`'s collection of classes, :mod:`subprocess` contains a
+single class called :class:`Popen`  whose constructor supports a number of
+different keyword arguments. ::
+
+   class Popen(args, bufsize=0, executable=None,
+   	    stdin=None, stdout=None, stderr=None,
+   	    preexec_fn=None, close_fds=False, shell=False,
+   	    cwd=None, env=None, universal_newlines=False,
+   	    startupinfo=None, creationflags=0):
+
+*args* is commonly a sequence of strings that will be the arguments to the
+program executed as the subprocess.  (If the *shell* argument is true, *args*
+can be a string which will then be passed on to the shell for interpretation,
+just as :func:`os.system` does.)
+
+*stdin*, *stdout*, and *stderr* specify what the subprocess's input, output, and
+error streams will be.  You can provide a file object or a file descriptor, or
+you can use the constant ``subprocess.PIPE`` to create a pipe between the
+subprocess and the parent.
+
+The constructor has a number of handy options:
+
+* *close_fds* requests that all file descriptors be closed before running the
+  subprocess.
+
+* *cwd* specifies the working directory in which the subprocess will be executed
+  (defaulting to whatever the parent's working directory is).
+
+* *env* is a dictionary specifying environment variables.
+
+* *preexec_fn* is a function that gets called before the child is started.
+
+* *universal_newlines* opens the child's input and output using Python's
+  universal newline feature.
+
+Once you've created the :class:`Popen` instance,  you can call its :meth:`wait`
+method to pause until the subprocess has exited, :meth:`poll` to check if it's
+exited without pausing,  or :meth:`communicate(data)` to send the string *data*
+to the subprocess's standard input.   :meth:`communicate(data)`  then reads any
+data that the subprocess has sent to its standard output  or standard error,
+returning a tuple ``(stdout_data, stderr_data)``.
+
+:func:`call` is a shortcut that passes its arguments along to the :class:`Popen`
+constructor, waits for the command to complete, and returns the status code of
+the subprocess.  It can serve as a safer analog to :func:`os.system`::
+
+   sts = subprocess.call(['dpkg', '-i', '/tmp/new-package.deb'])
+   if sts == 0:
+       # Success
+       ...
+   else:
+       # dpkg returned an error
+       ...
+
+The command is invoked without use of the shell.  If you really do want to  use
+the shell, you can add ``shell=True`` as a keyword argument and provide a string
+instead of a sequence::
+
+   sts = subprocess.call('dpkg -i /tmp/new-package.deb', shell=True)
+
+The PEP takes various examples of shell and Python code and shows how they'd be
+translated into Python code that uses :mod:`subprocess`.  Reading this section
+of the PEP is highly recommended.
+
+
+.. seealso::
+
+   :pep:`324` - subprocess - New process module
+      Written and implemented by Peter Åstrand, with assistance from Fredrik Lundh and
+      others.
+
+.. % ======================================================================
+
+
+PEP 327: Decimal Data Type
+==========================
+
+Python has always supported floating-point (FP) numbers, based on the underlying
+C :ctype:`double` type, as a data type.  However, while most programming
+languages provide a floating-point type, many people (even programmers) are
+unaware that floating-point numbers don't represent certain decimal fractions
+accurately.  The new :class:`Decimal` type can represent these fractions
+accurately, up to a user-specified precision limit.
+
+
+Why is Decimal needed?
+----------------------
+
+The limitations arise from the representation used for floating-point numbers.
+FP numbers are made up of three components:
+
+* The sign, which is positive or negative.
+
+* The mantissa, which is a single-digit binary number   followed by a fractional
+  part.  For example, ``1.01`` in base-2 notation is ``1 + 0/2 + 1/4``, or 1.25 in
+  decimal notation.
+
+* The exponent, which tells where the decimal point is located in the number
+  represented.
+
+For example, the number 1.25 has positive sign, a mantissa value of 1.01 (in
+binary), and an exponent of 0 (the decimal point doesn't need to be shifted).
+The number 5 has the same sign and mantissa, but the exponent is 2 because the
+mantissa is multiplied by 4 (2 to the power of the exponent 2); 1.25 \* 4 equals
+5.
+
+Modern systems usually provide floating-point support that conforms to a
+standard called IEEE 754.  C's :ctype:`double` type is usually implemented as a
+64-bit IEEE 754 number, which uses 52 bits of space for the mantissa.  This
+means that numbers can only be specified to 52 bits of precision.  If you're
+trying to represent numbers whose expansion repeats endlessly, the expansion is
+cut off after 52 bits. Unfortunately, most software needs to produce output in
+base 10, and common fractions in base 10 are often repeating decimals in binary.
+For example, 1.1 decimal is binary ``1.0001100110011 ...``; .1 = 1/16 + 1/32 +
+1/256 plus an infinite number of additional terms.  IEEE 754 has to chop off
+that infinitely repeated decimal after 52 digits, so the representation is
+slightly inaccurate.
+
+Sometimes you can see this inaccuracy when the number is printed::
+
+   >>> 1.1
+   1.1000000000000001
+
+The inaccuracy isn't always visible when you print the number because the FP-to-
+decimal-string conversion is provided by the C library, and most C libraries try
+to produce sensible output.  Even if it's not displayed, however, the inaccuracy
+is still there and subsequent operations can magnify the error.
+
+For many applications this doesn't matter.  If I'm plotting points and
+displaying them on my monitor, the difference between 1.1 and 1.1000000000000001
+is too small to be visible.  Reports often limit output to a certain number of
+decimal places, and if you round the number to two or three or even eight
+decimal places, the error is never apparent.  However, for applications where it
+does matter,  it's a lot of work to implement your own custom arithmetic
+routines.
+
+Hence, the :class:`Decimal` type was created.
+
+
+The :class:`Decimal` type
+-------------------------
+
+A new module, :mod:`decimal`, was added to Python's standard library.  It
+contains two classes, :class:`Decimal` and :class:`Context`.  :class:`Decimal`
+instances represent numbers, and :class:`Context` instances are used to wrap up
+various settings such as the precision and default rounding mode.
+
+:class:`Decimal` instances are immutable, like regular Python integers and FP
+numbers; once it's been created, you can't change the value an instance
+represents.  :class:`Decimal` instances can be created from integers or
+strings::
+
+   >>> import decimal
+   >>> decimal.Decimal(1972)
+   Decimal("1972")
+   >>> decimal.Decimal("1.1")
+   Decimal("1.1")
+
+You can also provide tuples containing the sign, the mantissa represented  as a
+tuple of decimal digits, and the exponent::
+
+   >>> decimal.Decimal((1, (1, 4, 7, 5), -2))
+   Decimal("-14.75")
+
+Cautionary note: the sign bit is a Boolean value, so 0 is positive and 1 is
+negative.
+
+Converting from floating-point numbers poses a bit of a problem: should the FP
+number representing 1.1 turn into the decimal number for exactly 1.1, or for 1.1
+plus whatever inaccuracies are introduced? The decision was to dodge the issue
+and leave such a conversion out of the API.  Instead, you should convert the
+floating-point number into a string using the desired precision and pass the
+string to the :class:`Decimal` constructor::
+
+   >>> f = 1.1
+   >>> decimal.Decimal(str(f))
+   Decimal("1.1")
+   >>> decimal.Decimal('%.12f' % f)
+   Decimal("1.100000000000")
+
+Once you have :class:`Decimal` instances, you can perform the usual mathematical
+operations on them.  One limitation: exponentiation requires an integer
+exponent::
+
+   >>> a = decimal.Decimal('35.72')
+   >>> b = decimal.Decimal('1.73')
+   >>> a+b
+   Decimal("37.45")
+   >>> a-b
+   Decimal("33.99")
+   >>> a*b
+   Decimal("61.7956")
+   >>> a/b
+   Decimal("20.64739884393063583815028902")
+   >>> a ** 2
+   Decimal("1275.9184")
+   >>> a**b
+   Traceback (most recent call last):
+     ...
+   decimal.InvalidOperation: x ** (non-integer)
+
+You can combine :class:`Decimal` instances with integers, but not with floating-
+point numbers::
+
+   >>> a + 4
+   Decimal("39.72")
+   >>> a + 4.5
+   Traceback (most recent call last):
+     ...
+   TypeError: You can interact Decimal only with int, long or Decimal data types.
+   >>>
+
+:class:`Decimal` numbers can be used with the :mod:`math` and :mod:`cmath`
+modules, but note that they'll be immediately converted to  floating-point
+numbers before the operation is performed, resulting in a possible loss of
+precision and accuracy.  You'll also get back a regular floating-point number
+and not a :class:`Decimal`.   ::
+
+   >>> import math, cmath
+   >>> d = decimal.Decimal('123456789012.345')
+   >>> math.sqrt(d)
+   351364.18288201344
+   >>> cmath.sqrt(-d)
+   351364.18288201344j
+
+:class:`Decimal` instances have a :meth:`sqrt` method that returns a
+:class:`Decimal`, but if you need other things such as trigonometric functions
+you'll have to implement them. ::
+
+   >>> d.sqrt()
+   Decimal("351364.1828820134592177245001")
+
+
+The :class:`Context` type
+-------------------------
+
+Instances of the :class:`Context` class encapsulate several settings for
+decimal operations:
+
+* :attr:`prec` is the precision, the number of decimal places.
+
+* :attr:`rounding` specifies the rounding mode.  The :mod:`decimal` module has
+  constants for the various possibilities: :const:`ROUND_DOWN`,
+  :const:`ROUND_CEILING`,  :const:`ROUND_HALF_EVEN`, and various others.
+
+* :attr:`traps` is a dictionary specifying what happens on encountering certain
+  error conditions: either  an exception is raised or  a value is returned.  Some
+  examples of error conditions are division by zero, loss of precision, and
+  overflow.
+
+There's a thread-local default context available by calling :func:`getcontext`;
+you can change the properties of this context to alter the default precision,
+rounding, or trap handling.  The following example shows the effect of changing
+the precision of the default context::
+
+   >>> decimal.getcontext().prec
+   28
+   >>> decimal.Decimal(1) / decimal.Decimal(7)
+   Decimal("0.1428571428571428571428571429")
+   >>> decimal.getcontext().prec = 9 
+   >>> decimal.Decimal(1) / decimal.Decimal(7)
+   Decimal("0.142857143")
+
+The default action for error conditions is selectable; the module can either
+return a special value such as infinity or not-a-number, or exceptions can be
+raised::
+
+   >>> decimal.Decimal(1) / decimal.Decimal(0)
+   Traceback (most recent call last):
+     ...
+   decimal.DivisionByZero: x / 0
+   >>> decimal.getcontext().traps[decimal.DivisionByZero] = False
+   >>> decimal.Decimal(1) / decimal.Decimal(0)
+   Decimal("Infinity")
+   >>> 
+
+The :class:`Context` instance also has various methods for formatting  numbers
+such as :meth:`to_eng_string` and :meth:`to_sci_string`.
+
+For more information, see the documentation for the :mod:`decimal` module, which
+includes a quick-start tutorial and a reference.
+
+
+.. seealso::
+
+   :pep:`327` - Decimal Data Type
+      Written by Facundo Batista and implemented by Facundo Batista, Eric Price,
+      Raymond Hettinger, Aahz, and Tim Peters.
+
+   http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html
+      A more detailed overview of the IEEE-754 representation.
+
+   http://www.lahey.com/float.htm
+      The article uses Fortran code to illustrate many of the problems that floating-
+      point inaccuracy can cause.
+
+   http://www2.hursley.ibm.com/decimal/
+      A description of a decimal-based representation.  This representation is being
+      proposed as a standard, and underlies the new Python decimal type.  Much of this
+      material was written by Mike Cowlishaw, designer of the Rexx language.
+
+.. % ======================================================================
+
+
+PEP 328: Multi-line Imports
+===========================
+
+One language change is a small syntactic tweak aimed at making it easier to
+import many names from a module.  In a ``from module import names`` statement,
+*names* is a sequence of names separated by commas.  If the sequence is  very
+long, you can either write multiple imports from the same module, or you can use
+backslashes to escape the line endings like this::
+
+   from SimpleXMLRPCServer import SimpleXMLRPCServer,\
+               SimpleXMLRPCRequestHandler,\
+               CGIXMLRPCRequestHandler,\
+               resolve_dotted_attribute
+
+The syntactic change in Python 2.4 simply allows putting the names within
+parentheses.  Python ignores newlines within a parenthesized expression, so the
+backslashes are no longer needed::
+
+   from SimpleXMLRPCServer import (SimpleXMLRPCServer,
+                                   SimpleXMLRPCRequestHandler,
+                                   CGIXMLRPCRequestHandler,
+                                   resolve_dotted_attribute)
+
+The PEP also proposes that all :keyword:`import` statements be absolute imports,
+with a leading ``.`` character to indicate a relative import.  This part of the
+PEP was not implemented for Python 2.4, but was completed for Python 2.5.
+
+
+.. seealso::
+
+   :pep:`328` - Imports: Multi-Line and Absolute/Relative
+      Written by Aahz.  Multi-line imports were implemented by Dima Dorfman.
+
+.. % ======================================================================
+
+
+PEP 331: Locale-Independent Float/String Conversions
+====================================================
+
+The :mod:`locale` modules lets Python software select various conversions and
+display conventions that are localized to a particular country or language.
+However, the module was careful to not change the numeric locale because various
+functions in Python's implementation required that the numeric locale remain set
+to the ``'C'`` locale.  Often this was because the code was using the C
+library's :cfunc:`atof` function.
+
+Not setting the numeric locale caused trouble for extensions that used third-
+party C libraries, however, because they wouldn't have the correct locale set.
+The motivating example was GTK+, whose user interface widgets weren't displaying
+numbers in the current locale.
+
+The solution described in the PEP is to add three new functions to the Python
+API that perform ASCII-only conversions, ignoring the locale setting:
+
+* :cfunc:`PyOS_ascii_strtod(str, ptr)`  and :cfunc:`PyOS_ascii_atof(str, ptr)`
+  both convert a string to a C :ctype:`double`.
+
+* :cfunc:`PyOS_ascii_formatd(buffer, buf_len, format, d)` converts a
+  :ctype:`double` to an ASCII string.
+
+The code for these functions came from the GLib library
+(http://developer.gnome.org/arch/gtk/glib.html), whose developers kindly
+relicensed the relevant functions and donated them to the Python Software
+Foundation.  The :mod:`locale` module  can now change the numeric locale,
+letting extensions such as GTK+  produce the correct results.
+
+
+.. seealso::
+
+   :pep:`331` - Locale-Independent Float/String Conversions
+      Written by Christian R. Reis, and implemented by Gustavo Carneiro.
+
+.. % ======================================================================
+
+
+Other Language Changes
+======================
+
+Here are all of the changes that Python 2.4 makes to the core Python language.
+
+* Decorators for functions and methods were added (:pep:`318`).
+
+* Built-in :func:`set` and :func:`frozenset` types were  added (:pep:`218`).
+  Other new built-ins include the :func:`reversed(seq)` function (:pep:`322`).
+
+* Generator expressions were added (:pep:`289`).
+
+* Certain numeric expressions no longer return values restricted to 32 or 64
+  bits (:pep:`237`).
+
+* You can now put parentheses around the list of names in a ``from module import
+  names`` statement (:pep:`328`).
+
+* The :meth:`dict.update` method now accepts the same argument forms as the
+  :class:`dict` constructor.  This includes any mapping, any iterable of key/value
+  pairs, and keyword arguments. (Contributed by Raymond Hettinger.)
+
+* The string methods :meth:`ljust`, :meth:`rjust`, and :meth:`center` now take
+  an optional argument for specifying a fill character other than a space.
+  (Contributed by Raymond Hettinger.)
+
+* Strings also gained an :meth:`rsplit` method that works like the :meth:`split`
+  method but splits from the end of the string.   (Contributed by Sean
+  Reifschneider.) ::
+
+     >>> 'www.python.org'.split('.', 1)
+     ['www', 'python.org']
+     'www.python.org'.rsplit('.', 1)
+     ['www.python', 'org']        
+
+* Three keyword parameters, *cmp*, *key*, and *reverse*, were added to the
+  :meth:`sort` method of lists. These parameters make some common usages of
+  :meth:`sort` simpler. All of these parameters are optional.
+
+  For the *cmp* parameter, the value should be a comparison function that takes
+  two parameters and returns -1, 0, or +1 depending on how the parameters compare.
+  This function will then be used to sort the list.  Previously this was the only
+  parameter that could be provided to :meth:`sort`.
+
+  *key* should be a single-parameter function that takes a list element and
+  returns a comparison key for the element.  The list is then sorted using the
+  comparison keys.  The following example sorts a list case-insensitively::
+
+     >>> L = ['A', 'b', 'c', 'D']
+     >>> L.sort()                 # Case-sensitive sort
+     >>> L
+     ['A', 'D', 'b', 'c']
+     >>> # Using 'key' parameter to sort list
+     >>> L.sort(key=lambda x: x.lower())
+     >>> L
+     ['A', 'b', 'c', 'D']
+     >>> # Old-fashioned way
+     >>> L.sort(cmp=lambda x,y: cmp(x.lower(), y.lower()))
+     >>> L
+     ['A', 'b', 'c', 'D']
+
+  The last example, which uses the *cmp* parameter, is the old way to perform a
+  case-insensitive sort.  It works but is slower than using a *key* parameter.
+  Using *key* calls :meth:`lower` method once for each element in the list while
+  using *cmp* will call it twice for each comparison, so using *key* saves on
+  invocations of the :meth:`lower` method.
+
+  For simple key functions and comparison functions, it is often possible to avoid
+  a :keyword:`lambda` expression by using an unbound method instead.  For example,
+  the above case-insensitive sort is best written as::
+
+     >>> L.sort(key=str.lower)
+     >>> L
+     ['A', 'b', 'c', 'D']
+
+  Finally, the *reverse* parameter takes a Boolean value.  If the value is true,
+  the list will be sorted into reverse order. Instead of ``L.sort() ;
+  L.reverse()``, you can now write ``L.sort(reverse=True)``.
+
+  The results of sorting are now guaranteed to be stable.  This means that two
+  entries with equal keys will be returned in the same order as they were input.
+  For example, you can sort a list of people by name, and then sort the list by
+  age, resulting in a list sorted by age where people with the same age are in
+  name-sorted order.
+
+  (All changes to :meth:`sort` contributed by Raymond Hettinger.)
+
+* There is a new built-in function :func:`sorted(iterable)` that works like the
+  in-place :meth:`list.sort` method but can be used in expressions.  The
+  differences are:
+
+* the input may be any iterable;
+
+* a newly formed copy is sorted, leaving the original intact; and
+
+* the expression returns the new sorted copy
+
+  ::
+
+     >>> L = [9,7,8,3,2,4,1,6,5]
+     >>> [10+i for i in sorted(L)]       # usable in a list comprehension
+     [11, 12, 13, 14, 15, 16, 17, 18, 19]
+     >>> L                               # original is left unchanged
+     [9,7,8,3,2,4,1,6,5]
+     >>> sorted('Monty Python')          # any iterable may be an input
+     [' ', 'M', 'P', 'h', 'n', 'n', 'o', 'o', 't', 't', 'y', 'y']
+
+     >>> # List the contents of a dict sorted by key values
+     >>> colormap = dict(red=1, blue=2, green=3, black=4, yellow=5)
+     >>> for k, v in sorted(colormap.iteritems()):
+     ...     print k, v
+     ...
+     black 4
+     blue 2
+     green 3
+     red 1
+     yellow 5
+
+  (Contributed by Raymond Hettinger.)
+
+* Integer operations will no longer trigger an :exc:`OverflowWarning`. The
+  :exc:`OverflowWarning` warning will disappear in Python 2.5.
+
+* The interpreter gained a new switch, :option:`-m`, that takes a name, searches
+  for the corresponding  module on ``sys.path``, and runs the module as a script.
+  For example,  you can now run the Python profiler with ``python -m profile``.
+  (Contributed by Nick Coghlan.)
+
+* The :func:`eval(expr, globals, locals)` and :func:`execfile(filename, globals,
+  locals)` functions and the :keyword:`exec` statement now accept any mapping type
+  for the *locals* parameter.  Previously this had to be a regular Python
+  dictionary.  (Contributed by Raymond Hettinger.)
+
+* The :func:`zip` built-in function and :func:`itertools.izip` now return an
+  empty list if called with no arguments. Previously they raised a
+  :exc:`TypeError` exception.  This makes them more suitable for use with variable
+  length argument lists::
+
+     >>> def transpose(array):
+     ...    return zip(*array)
+     ...
+     >>> transpose([(1,2,3), (4,5,6)])
+     [(1, 4), (2, 5), (3, 6)]
+     >>> transpose([])
+     []
+
+  (Contributed by Raymond Hettinger.)
+
+* Encountering a failure while importing a module no longer leaves a partially-
+  initialized module object in ``sys.modules``.  The incomplete module object left
+  behind would fool further imports of the same module into succeeding, leading to
+  confusing errors.   (Fixed by Tim Peters.)
+
+* :const:`None` is now a constant; code that binds a new value to  the name
+  ``None`` is now a syntax error. (Contributed by Raymond Hettinger.)
+
+.. % ======================================================================
+
+
+Optimizations
+-------------
+
+* The inner loops for list and tuple slicing were optimized and now run about
+  one-third faster.  The inner loops for dictionaries were also optimized,
+  resulting in performance boosts for :meth:`keys`, :meth:`values`, :meth:`items`,
+  :meth:`iterkeys`, :meth:`itervalues`, and :meth:`iteritems`. (Contributed by
+  Raymond Hettinger.)
+
+* The machinery for growing and shrinking lists was optimized for speed and for
+  space efficiency.  Appending and popping from lists now runs faster due to more
+  efficient code paths and less frequent use of the underlying system
+  :cfunc:`realloc`.  List comprehensions also benefit.   :meth:`list.extend` was
+  also optimized and no longer converts its argument into a temporary list before
+  extending the base list.  (Contributed by Raymond Hettinger.)
+
+* :func:`list`, :func:`tuple`, :func:`map`, :func:`filter`, and :func:`zip` now
+  run several times faster with non-sequence arguments that supply a
+  :meth:`__len__` method.  (Contributed by Raymond Hettinger.)
+
+* The methods :meth:`list.__getitem__`, :meth:`dict.__getitem__`, and
+  :meth:`dict.__contains__` are are now implemented as :class:`method_descriptor`
+  objects rather than :class:`wrapper_descriptor` objects.  This form of  access
+  doubles their performance and makes them more suitable for use as arguments to
+  functionals: ``map(mydict.__getitem__, keylist)``. (Contributed by Raymond
+  Hettinger.)
+
+* Added a new opcode, ``LIST_APPEND``, that simplifies the generated bytecode
+  for list comprehensions and speeds them up by about a third.  (Contributed by
+  Raymond Hettinger.)
+
+* The peephole bytecode optimizer has been improved to  produce shorter, faster
+  bytecode; remarkably, the resulting bytecode is  more readable.  (Enhanced by
+  Raymond Hettinger.)
+
+* String concatenations in statements of the form ``s = s + "abc"`` and ``s +=
+  "abc"`` are now performed more efficiently in certain circumstances.  This
+  optimization won't be present in other Python implementations such as Jython, so
+  you shouldn't rely on it; using the :meth:`join` method of strings is still
+  recommended when you want to efficiently glue a large number of strings
+  together. (Contributed by Armin Rigo.)
+
+The net result of the 2.4 optimizations is that Python 2.4 runs the pystone
+benchmark around 5% faster than Python 2.3 and 35% faster than Python 2.2.
+(pystone is not a particularly good benchmark, but it's the most commonly used
+measurement of Python's performance.  Your own applications may show greater or
+smaller benefits from Python 2.4.)
+
+.. % pystone is almost useless for comparing different versions of Python;
+.. % instead, it excels at predicting relative Python performance on
+.. % different machines.
+.. % So, this section would be more informative if it used other tools
+.. % such as pybench and parrotbench.  For a more application oriented
+.. % benchmark, try comparing the timings of test_decimal.py under 2.3
+.. % and 2.4.
+
+.. % ======================================================================
+
+
+New, Improved, and Deprecated Modules
+=====================================
+
+As usual, Python's standard library received a number of enhancements and bug
+fixes.  Here's a partial list of the most notable changes, sorted alphabetically
+by module name. Consult the :file:`Misc/NEWS` file in the source tree for a more
+complete list of changes, or look through the CVS logs for all the details.
+
+* The :mod:`asyncore` module's :func:`loop` function now has a *count* parameter
+  that lets you perform a limited number of passes through the polling loop.  The
+  default is still to loop forever.
+
+* The :mod:`base64` module now has more complete RFC 3548 support for Base64,
+  Base32, and Base16 encoding and decoding, including optional case folding and
+  optional alternative alphabets. (Contributed by Barry Warsaw.)
+
+* The :mod:`bisect` module now has an underlying C implementation for improved
+  performance. (Contributed by Dmitry Vasiliev.)
+
+* The CJKCodecs collections of East Asian codecs, maintained by Hye-Shik Chang,
+  was integrated into 2.4.   The new encodings are:
+
+* Chinese (PRC): gb2312, gbk, gb18030, big5hkscs, hz
+
+* Chinese (ROC): big5, cp950
+
+* Japanese: cp932, euc-jis-2004, euc-jp, euc-jisx0213, iso-2022-jp,
+    iso-2022-jp-1, iso-2022-jp-2, iso-2022-jp-3, iso-2022-jp-ext, iso-2022-jp-2004,
+    shift-jis, shift-jisx0213, shift-jis-2004
+
+* Korean: cp949, euc-kr, johab, iso-2022-kr
+
+* Some other new encodings were added: HP Roman8,  ISO_8859-11, ISO_8859-16,
+  PCTP-154, and TIS-620.
+
+* The UTF-8 and UTF-16 codecs now cope better with receiving partial input.
+  Previously the :class:`StreamReader` class would try to read more data, making
+  it impossible to resume decoding from the stream.  The :meth:`read` method will
+  now return as much data as it can and future calls will resume decoding where
+  previous ones left off.  (Implemented by Walter Dörwald.)
+
+* There is a new :mod:`collections` module for  various specialized collection
+  datatypes.   Currently it contains just one type, :class:`deque`,  a double-
+  ended queue that supports efficiently adding and removing elements from either
+  end::
+
+     >>> from collections import deque
+     >>> d = deque('ghi')        # make a new deque with three items
+     >>> d.append('j')           # add a new entry to the right side
+     >>> d.appendleft('f')       # add a new entry to the left side
+     >>> d                       # show the representation of the deque
+     deque(['f', 'g', 'h', 'i', 'j'])
+     >>> d.pop()                 # return and remove the rightmost item
+     'j'
+     >>> d.popleft()             # return and remove the leftmost item
+     'f'
+     >>> list(d)                 # list the contents of the deque
+     ['g', 'h', 'i']
+     >>> 'h' in d                # search the deque
+     True  
+
+  Several modules, such as the :mod:`Queue` and :mod:`threading` modules, now take
+  advantage of :class:`collections.deque` for improved performance.  (Contributed
+  by Raymond Hettinger.)
+
+* The :mod:`ConfigParser` classes have been enhanced slightly. The :meth:`read`
+  method now returns a list of the files that were successfully parsed, and the
+  :meth:`set` method raises :exc:`TypeError` if passed a *value* argument that
+  isn't a string.   (Contributed by John Belmonte and David Goodger.)
+
+* The :mod:`curses` module now supports the ncurses extension
+  :func:`use_default_colors`.  On platforms where the terminal supports
+  transparency, this makes it possible to use a transparent background.
+  (Contributed by Jörg Lehmann.)
+
+* The :mod:`difflib` module now includes an :class:`HtmlDiff` class that creates
+  an HTML table showing a side by side comparison of two versions of a text.
+  (Contributed by Dan Gass.)
+
+* The :mod:`email` package was updated to version 3.0,  which dropped various
+  deprecated APIs and removes support for Python versions earlier than 2.3.  The
+  3.0 version of the package uses a new incremental parser for MIME messages,
+  available in the :mod:`email.FeedParser` module.  The new parser doesn't require
+  reading the entire message into memory, and doesn't throw exceptions if a
+  message is malformed; instead it records any problems in the  :attr:`defect`
+  attribute of the message.  (Developed by Anthony Baxter, Barry Warsaw, Thomas
+  Wouters, and others.)
+
+* The :mod:`heapq` module has been converted to C.  The resulting tenfold
+  improvement in speed makes the module suitable for handling high volumes of
+  data.  In addition, the module has two new functions :func:`nlargest` and
+  :func:`nsmallest` that use heaps to find the N largest or smallest values in a
+  dataset without the expense of a full sort.  (Contributed by Raymond Hettinger.)
+
+* The :mod:`httplib` module now contains constants for HTTP status codes defined
+  in various HTTP-related RFC documents.  Constants have names such as
+  :const:`OK`, :const:`CREATED`, :const:`CONTINUE`, and
+  :const:`MOVED_PERMANENTLY`; use pydoc to get a full list.  (Contributed by
+  Andrew Eland.)
+
+* The :mod:`imaplib` module now supports IMAP's THREAD command (contributed by
+  Yves Dionne) and new :meth:`deleteacl` and :meth:`myrights` methods (contributed
+  by Arnaud Mazin).
+
+* The :mod:`itertools` module gained a :func:`groupby(iterable[, *func*])`
+  function. *iterable* is something that can be iterated over to return a stream
+  of elements, and the optional *func* parameter is a function that takes an
+  element and returns a key value; if omitted, the key is simply the element
+  itself.  :func:`groupby` then groups the elements into subsequences which have
+  matching values of the key, and returns a series of 2-tuples containing the key
+  value and an iterator over the subsequence.
+
+  Here's an example to make this clearer.  The *key* function simply returns
+  whether a number is even or odd, so the result of :func:`groupby` is to return
+  consecutive runs of odd or even numbers. ::
+
+     >>> import itertools
+     >>> L = [2, 4, 6, 7, 8, 9, 11, 12, 14]
+     >>> for key_val, it in itertools.groupby(L, lambda x: x % 2):
+     ...    print key_val, list(it)
+     ... 
+     0 [2, 4, 6]
+     1 [7]
+     0 [8]
+     1 [9, 11]
+     0 [12, 14]
+     >>> 
+
+  :func:`groupby` is typically used with sorted input.  The logic for
+  :func:`groupby` is similar to the Unix ``uniq`` filter which makes it handy for
+  eliminating, counting, or identifying duplicate elements::
+
+     >>> word = 'abracadabra'
+     >>> letters = sorted(word)   # Turn string into a sorted list of letters
+     >>> letters 
+     ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'r', 'r']
+     >>> for k, g in itertools.groupby(letters):
+     ...    print k, list(g)
+     ... 
+     a ['a', 'a', 'a', 'a', 'a']
+     b ['b', 'b']
+     c ['c']
+     d ['d']
+     r ['r', 'r']
+     >>> # List unique letters
+     >>> [k for k, g in groupby(letters)]                     
+     ['a', 'b', 'c', 'd', 'r']
+     >>> # Count letter occurrences
+     >>> [(k, len(list(g))) for k, g in groupby(letters)]     
+     [('a', 5), ('b', 2), ('c', 1), ('d', 1), ('r', 2)]
+
+  (Contributed by Hye-Shik Chang.)
+
+* :mod:`itertools` also gained a function named :func:`tee(iterator, N)` that
+  returns *N* independent iterators that replicate *iterator*.  If *N* is omitted,
+  the default is 2. ::
+
+     >>> L = [1,2,3]
+     >>> i1, i2 = itertools.tee(L)
+     >>> i1,i2
+     (<itertools.tee object at 0x402c2080>, <itertools.tee object at 0x402c2090>)
+     >>> list(i1)               # Run the first iterator to exhaustion
+     [1, 2, 3]
+     >>> list(i2)               # Run the second iterator to exhaustion
+     [1, 2, 3]
+
+  Note that :func:`tee` has to keep copies of the values returned  by the
+  iterator; in the worst case, it may need to keep all of them.   This should
+  therefore be used carefully if the leading iterator can run far ahead of the
+  trailing iterator in a long stream of inputs. If the separation is large, then
+  you might as well use  :func:`list` instead.  When the iterators track closely
+  with one another, :func:`tee` is ideal.  Possible applications include
+  bookmarking, windowing, or lookahead iterators. (Contributed by Raymond
+  Hettinger.)
+
+* A number of functions were added to the :mod:`locale`  module, such as
+  :func:`bind_textdomain_codeset` to specify a particular encoding and a family of
+  :func:`l\*gettext` functions that return messages in the chosen encoding.
+  (Contributed by Gustavo Niemeyer.)
+
+* Some keyword arguments were added to the :mod:`logging` package's
+  :func:`basicConfig` function to simplify log configuration.  The default
+  behavior is to log messages to standard error, but various keyword arguments can
+  be specified to log to a particular file, change the logging format, or set the
+  logging level. For example::
+
+     import logging
+     logging.basicConfig(filename='/var/log/application.log',
+         level=0,  # Log all messages
+         format='%(levelname):%(process):%(thread):%(message)')	            
+
+  Other additions to the :mod:`logging` package include a :meth:`log(level, msg)`
+  convenience method, as well as a :class:`TimedRotatingFileHandler` class that
+  rotates its log files at a timed interval.  The module already had
+  :class:`RotatingFileHandler`, which rotated logs once the file exceeded a
+  certain size.  Both classes derive from a new :class:`BaseRotatingHandler` class
+  that can be used to implement other rotating handlers.
+
+  (Changes implemented by Vinay Sajip.)
+
+* The :mod:`marshal` module now shares interned strings on unpacking a  data
+  structure.  This may shrink the size of certain pickle strings, but the primary
+  effect is to make :file:`.pyc` files significantly smaller. (Contributed by
+  Martin von Löwis.)
+
+* The :mod:`nntplib` module's :class:`NNTP` class gained :meth:`description` and
+  :meth:`descriptions` methods to retrieve  newsgroup descriptions for a single
+  group or for a range of groups. (Contributed by Jürgen A. Erhard.)
+
+* Two new functions were added to the :mod:`operator` module,
+  :func:`attrgetter(attr)` and :func:`itemgetter(index)`. Both functions return
+  callables that take a single argument and return the corresponding attribute or
+  item; these callables make excellent data extractors when used with :func:`map`
+  or :func:`sorted`.  For example::
+
+     >>> L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)]
+     >>> map(operator.itemgetter(0), L)
+     ['c', 'd', 'a', 'b']
+     >>> map(operator.itemgetter(1), L)
+     [2, 1, 4, 3]
+     >>> sorted(L, key=operator.itemgetter(1)) # Sort list by second tuple item
+     [('d', 1), ('c', 2), ('b', 3), ('a', 4)]
+
+  (Contributed by Raymond Hettinger.)
+
+* The :mod:`optparse` module was updated in various ways.  The module now passes
+  its messages through :func:`gettext.gettext`, making it possible to
+  internationalize Optik's help and error messages.  Help messages for options can
+  now include the string ``'%default'``, which will be replaced by the option's
+  default value.  (Contributed by Greg Ward.)
+
+* The long-term plan is to deprecate the :mod:`rfc822` module in some future
+  Python release in favor of the :mod:`email` package. To this end, the
+  :func:`email.Utils.formatdate` function has been changed to make it usable as a
+  replacement for :func:`rfc822.formatdate`.  You may want to write new e-mail
+  processing code with this in mind.  (Change implemented by Anthony Baxter.)
+
+* A new :func:`urandom(n)` function was added to the :mod:`os` module, returning
+  a string containing *n* bytes of random data.  This function provides access to
+  platform-specific sources of randomness such as :file:`/dev/urandom` on Linux or
+  the Windows CryptoAPI.  (Contributed by Trevor Perrin.)
+
+* Another new function: :func:`os.path.lexists(path)`  returns true if the file
+  specified by *path* exists, whether or not it's a symbolic link.  This differs
+  from the existing :func:`os.path.exists(path)` function, which returns false if
+  *path* is a symlink that points to a destination that doesn't exist.
+  (Contributed by Beni Cherniavsky.)
+
+* A new :func:`getsid` function was added to the :mod:`posix` module that
+  underlies the :mod:`os` module. (Contributed by J. Raynor.)
+
+* The :mod:`poplib` module now supports POP over SSL.  (Contributed by Hector
+  Urtubia.)
+
+* The :mod:`profile` module can now profile C extension functions. (Contributed
+  by Nick Bastin.)
+
+* The :mod:`random` module has a new method called :meth:`getrandbits(N)` that
+  returns a long integer *N* bits in length.  The existing :meth:`randrange`
+  method now uses :meth:`getrandbits` where appropriate, making generation of
+  arbitrarily large random numbers more efficient.  (Contributed by Raymond
+  Hettinger.)
+
+* The regular expression language accepted by the :mod:`re` module was extended
+  with simple conditional expressions, written as ``(?(group)A|B)``.  *group* is
+  either a numeric group ID or a group name defined with ``(?P<group>...)``
+  earlier in the expression.  If the specified group matched, the regular
+  expression pattern *A* will be tested against the string; if the group didn't
+  match, the pattern *B* will be used instead. (Contributed by Gustavo Niemeyer.)
+
+* The :mod:`re` module is also no longer recursive, thanks to a massive amount
+  of work by Gustavo Niemeyer.  In a recursive regular expression engine, certain
+  patterns result in a large amount of C stack space being consumed, and it was
+  possible to overflow the stack. For example, if you matched a 30000-byte string
+  of ``a`` characters against the expression ``(a|b)+``, one stack frame was
+  consumed per character.  Python 2.3 tried to check for stack overflow and raise
+  a :exc:`RuntimeError` exception, but certain patterns could sidestep the
+  checking and if you were unlucky Python could segfault. Python 2.4's regular
+  expression engine can match this pattern without problems.
+
+* The :mod:`signal` module now performs tighter error-checking on the parameters
+  to the :func:`signal.signal` function.  For example, you can't set a handler on
+  the :const:`SIGKILL` signal; previous versions of Python would quietly accept
+  this, but 2.4 will raise a :exc:`RuntimeError` exception.
+
+* Two new functions were added to the :mod:`socket` module. :func:`socketpair`
+  returns a pair of connected sockets and :func:`getservbyport(port)` looks up the
+  service name for a given port number. (Contributed by Dave Cole and Barry
+  Warsaw.)
+
+* The :func:`sys.exitfunc` function has been deprecated.  Code should be using
+  the existing :mod:`atexit` module, which correctly handles calling multiple exit
+  functions.  Eventually :func:`sys.exitfunc` will become a purely internal
+  interface, accessed only by :mod:`atexit`.
+
+* The :mod:`tarfile` module now generates GNU-format tar files by default.
+  (Contributed by Lars Gustaebel.)
+
+* The :mod:`threading` module now has an elegantly simple way to support
+  thread-local data.  The module contains a :class:`local` class whose attribute
+  values are local to different threads. ::
+
+     import threading
+
+     data = threading.local()
+     data.number = 42
+     data.url = ('www.python.org', 80)
+
+  Other threads can assign and retrieve their own values for the :attr:`number`
+  and :attr:`url` attributes.  You can subclass :class:`local` to initialize
+  attributes or to add methods. (Contributed by Jim Fulton.)
+
+* The :mod:`timeit` module now automatically disables periodic garbage
+  collection during the timing loop.  This change makes consecutive timings more
+  comparable.  (Contributed by Raymond Hettinger.)
+
+* The :mod:`weakref` module now supports a wider variety of objects including
+  Python functions, class instances, sets, frozensets, deques, arrays, files,
+  sockets, and regular expression pattern objects. (Contributed by Raymond
+  Hettinger.)
+
+* The :mod:`xmlrpclib` module now supports a multi-call extension for
+  transmitting multiple XML-RPC calls in a single HTTP operation. (Contributed by
+  Brian Quinlan.)
+
+* The :mod:`mpz`, :mod:`rotor`, and :mod:`xreadlines` modules have  been
+  removed.
+
+.. % ======================================================================
+.. % whole new modules get described in subsections here
+.. % =====================
+
+
+cookielib
+---------
+
+The :mod:`cookielib` library supports client-side handling for HTTP cookies,
+mirroring the :mod:`Cookie` module's server-side cookie support. Cookies are
+stored in cookie jars; the library transparently stores cookies offered by the
+web server in the cookie jar, and fetches the cookie from the jar when
+connecting to the server. As in web browsers, policy objects control whether
+cookies are accepted or not.
+
+In order to store cookies across sessions, two implementations of cookie jars
+are provided: one that stores cookies in the Netscape format so applications can
+use the Mozilla or Lynx cookie files, and one that stores cookies in the same
+format as the Perl libwww library.
+
+:mod:`urllib2` has been changed to interact with :mod:`cookielib`:
+:class:`HTTPCookieProcessor` manages a cookie jar that is used when accessing
+URLs.
+
+This module was contributed by John J. Lee.
+
+.. % ==================
+
+
+doctest
+-------
+
+The :mod:`doctest` module underwent considerable refactoring thanks to Edward
+Loper and Tim Peters.  Testing can still be as simple as running
+:func:`doctest.testmod`, but the refactorings allow customizing the module's
+operation in various ways
+
+The new :class:`DocTestFinder` class extracts the tests from a given  object's
+docstrings::
+
+   def f (x, y):
+       """>>> f(2,2)
+   4
+   >>> f(3,2)
+   6
+       """
+       return x*y
+
+   finder = doctest.DocTestFinder()
+
+   # Get list of DocTest instances
+   tests = finder.find(f)
+
+The new :class:`DocTestRunner` class then runs individual tests and can produce
+a summary of the results::
+
+   runner = doctest.DocTestRunner()
+   for t in tests:
+       tried, failed = runner.run(t)
+
+   runner.summarize(verbose=1)
+
+The above example produces the following output::
+
+   1 items passed all tests:
+      2 tests in f
+   2 tests in 1 items.
+   2 passed and 0 failed.
+   Test passed.
+
+:class:`DocTestRunner` uses an instance of the :class:`OutputChecker` class to
+compare the expected output with the actual output.  This class takes a number
+of different flags that customize its behaviour; ambitious users can also write
+a completely new subclass of :class:`OutputChecker`.
+
+The default output checker provides a number of handy features. For example,
+with the :const:`doctest.ELLIPSIS` option flag, an ellipsis (``...``) in the
+expected output matches any substring,  making it easier to accommodate outputs
+that vary in minor ways::
+
+   def o (n):
+       """>>> o(1)
+   <__main__.C instance at 0x...>
+   >>>
+   """
+
+Another special string, ``<BLANKLINE>``, matches a blank line::
+
+   def p (n):
+       """>>> p(1)
+   <BLANKLINE>
+   >>>
+   """
+
+Another new capability is producing a diff-style display of the output by
+specifying the :const:`doctest.REPORT_UDIFF` (unified diffs),
+:const:`doctest.REPORT_CDIFF` (context diffs), or :const:`doctest.REPORT_NDIFF`
+(delta-style) option flags.  For example::
+
+   def g (n):
+       """>>> g(4)
+   here
+   is
+   a
+   lengthy
+   >>>"""
+       L = 'here is a rather lengthy list of words'.split()
+       for word in L[:n]:
+           print word
+
+Running the above function's tests with :const:`doctest.REPORT_UDIFF` specified,
+you get the following output::
+
+   **********************************************************************
+   File ``t.py'', line 15, in g
+   Failed example:
+       g(4)
+   Differences (unified diff with -expected +actual):
+       @@ -2,3 +2,3 @@
+        is
+        a
+       -lengthy
+       +rather
+   **********************************************************************
+
+.. % ======================================================================
+
+
+Build and C API Changes
+=======================
+
+Some of the changes to Python's build process and to the C API are:
+
+* Three new convenience macros were added for common return values from
+  extension functions: :cmacro:`Py_RETURN_NONE`, :cmacro:`Py_RETURN_TRUE`, and
+  :cmacro:`Py_RETURN_FALSE`. (Contributed by Brett Cannon.)
+
+* Another new macro, :cmacro:`Py_CLEAR(obj)`,  decreases the reference count of
+  *obj* and sets *obj* to the null pointer.  (Contributed by Jim Fulton.)
+
+* A new function, :cfunc:`PyTuple_Pack(N, obj1, obj2, ..., objN)`, constructs
+  tuples from a variable length argument list of Python objects.  (Contributed by
+  Raymond Hettinger.)
+
+* A new function, :cfunc:`PyDict_Contains(d, k)`, implements fast dictionary
+  lookups without masking exceptions raised during the look-up process.
+  (Contributed by Raymond Hettinger.)
+
+* The :cmacro:`Py_IS_NAN(X)` macro returns 1 if  its float or double argument
+  *X* is a NaN.   (Contributed by Tim Peters.)
+
+* C code can avoid unnecessary locking by using the new
+  :cfunc:`PyEval_ThreadsInitialized` function to tell  if any thread operations
+  have been performed.  If this function  returns false, no lock operations are
+  needed. (Contributed by Nick Coghlan.)
+
+* A new function, :cfunc:`PyArg_VaParseTupleAndKeywords`, is the same as
+  :cfunc:`PyArg_ParseTupleAndKeywords` but takes a  :ctype:`va_list` instead of a
+  number of arguments. (Contributed by Greg Chapman.)
+
+* A new method flag, :const:`METH_COEXISTS`, allows a function defined in slots
+  to co-exist with a :ctype:`PyCFunction` having the same name.  This can halve
+  the access time for a method such as :meth:`set.__contains__`.  (Contributed by
+  Raymond Hettinger.)
+
+* Python can now be built with additional profiling for the interpreter itself,
+  intended as an aid to people developing the Python core.  Providing
+  :option:`----enable-profiling` to the :program:`configure` script will let you
+  profile the interpreter with :program:`gprof`, and providing the
+  :option:`----with-tsc` switch enables profiling using the Pentium's Time-Stamp-
+  Counter register.  Note that the :option:`----with-tsc` switch is slightly
+  misnamed, because the profiling feature also works on the PowerPC platform,
+  though that processor architecture doesn't call that register "the TSC
+  register".  (Contributed by Jeremy Hylton.)
+
+* The :ctype:`tracebackobject` type has been renamed to
+  :ctype:`PyTracebackObject`.
+
+.. % ======================================================================
+
+
+Port-Specific Changes
+---------------------
+
+* The Windows port now builds under MSVC++ 7.1 as well as version 6.
+  (Contributed by Martin von Löwis.)
+
+.. % ======================================================================
+
+
+Porting to Python 2.4
+=====================
+
+This section lists previously described changes that may require changes to your
+code:
+
+* Left shifts and hexadecimal/octal constants that are too  large no longer
+  trigger a :exc:`FutureWarning` and return  a value limited to 32 or 64 bits;
+  instead they return a long integer.
+
+* Integer operations will no longer trigger an :exc:`OverflowWarning`. The
+  :exc:`OverflowWarning` warning will disappear in Python 2.5.
+
+* The :func:`zip` built-in function and :func:`itertools.izip` now return  an
+  empty list instead of raising a :exc:`TypeError` exception if called with no
+  arguments.
+
+* You can no longer compare the :class:`date` and :class:`datetime` instances
+  provided by the :mod:`datetime` module.  Two  instances of different classes
+  will now always be unequal, and  relative comparisons (``<``, ``>``) will raise
+  a :exc:`TypeError`.
+
+* :func:`dircache.listdir` now passes exceptions to the caller instead of
+  returning empty lists.
+
+* :func:`LexicalHandler.startDTD` used to receive the public and system IDs in
+  the wrong order.  This has been corrected; applications relying on the wrong
+  order need to be fixed.
+
+* :func:`fcntl.ioctl` now warns if the *mutate*  argument is omitted and
+  relevant.
+
+* The :mod:`tarfile` module now generates GNU-format tar files by default.
+
+* Encountering a failure while importing a module no longer leaves a partially-
+  initialized module object in ``sys.modules``.
+
+* :const:`None` is now a constant; code that binds a new value to  the name
+  ``None`` is now a syntax error.
+
+* The :func:`signals.signal` function now raises a :exc:`RuntimeError` exception
+  for certain illegal values; previously these errors would pass silently.  For
+  example, you can no longer set a handler on the :const:`SIGKILL` signal.
+
+.. % ======================================================================
+
+
+.. _acks:
+
+Acknowledgements
+================
+
+The author would like to thank the following people for offering suggestions,
+corrections and assistance with various drafts of this article: Koray Can, Hye-
+Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson, Fredrik
+Lundh, Sean Reifschneider, Sadruddin Rejeb.
+
diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst
new file mode 100644
index 0000000..f0429ec
--- /dev/null
+++ b/Doc/whatsnew/2.5.rst
@@ -0,0 +1,2286 @@
+****************************
+  What's New in Python 2.5  
+****************************
+
+:Author: A.M. Kuchling
+
+.. |release| replace:: 1.01
+
+.. % $Id: whatsnew25.tex 56611 2007-07-29 08:26:10Z georg.brandl $
+.. % Fix XXX comments
+
+This article explains the new features in Python 2.5.  The final release of
+Python 2.5 is scheduled for August 2006; :pep:`356` describes the planned
+release schedule.
+
+The changes in Python 2.5 are an interesting mix of language and library
+improvements. The library enhancements will be more important to Python's user
+community, I think, because several widely-useful packages were added.  New
+modules include ElementTree for XML processing (section :ref:`module-etree`),
+the SQLite database module (section :ref:`module-sqlite`), and the :mod:`ctypes`
+module for calling C functions (section :ref:`module-ctypes`).
+
+The language changes are of middling significance.  Some pleasant new features
+were added, but most of them aren't features that you'll use every day.
+Conditional expressions were finally added to the language using a novel syntax;
+see section :ref:`pep-308`.  The new ':keyword:`with`' statement will make
+writing cleanup code easier (section :ref:`pep-343`).  Values can now be passed
+into generators (section :ref:`pep-342`).  Imports are now visible as either
+absolute or relative (section :ref:`pep-328`).  Some corner cases of exception
+handling are handled better (section :ref:`pep-341`).  All these improvements
+are worthwhile, but they're improvements to one specific language feature or
+another; none of them are broad modifications to Python's semantics.
+
+As well as the language and library additions, other improvements and bugfixes
+were made throughout the source tree.  A search through the SVN change logs
+finds there were 353 patches applied and 458 bugs fixed between Python 2.4 and
+2.5.  (Both figures are likely to be underestimates.)
+
+This article doesn't try to be a complete specification of the new features;
+instead changes are briefly introduced using helpful examples.  For full
+details, you should always refer to the documentation for Python 2.5 at
+http://docs.python.org. If you want to understand the complete implementation
+and design rationale, refer to the PEP for a particular new feature.
+
+Comments, suggestions, and error reports for this document are welcome; please
+e-mail them to the author or open a bug in the Python bug tracker.
+
+.. % ======================================================================
+
+
+.. _pep-308:
+
+PEP 308: Conditional Expressions
+================================
+
+For a long time, people have been requesting a way to write conditional
+expressions, which are expressions that return value A or value B depending on
+whether a Boolean value is true or false.  A conditional expression lets you
+write a single assignment statement that has the same effect as the following::
+
+   if condition:
+       x = true_value
+   else:
+       x = false_value
+
+There have been endless tedious discussions of syntax on both python-dev and
+comp.lang.python.  A vote was even held that found the majority of voters wanted
+conditional expressions in some form, but there was no syntax that was preferred
+by a clear majority. Candidates included C's ``cond ? true_v : false_v``, ``if
+cond then true_v else false_v``, and 16 other variations.
+
+Guido van Rossum eventually chose a surprising syntax::
+
+   x = true_value if condition else false_value
+
+Evaluation is still lazy as in existing Boolean expressions, so the order of
+evaluation jumps around a bit.  The *condition* expression in the middle is
+evaluated first, and the *true_value* expression is evaluated only if the
+condition was true.  Similarly, the *false_value* expression is only evaluated
+when the condition is false.
+
+This syntax may seem strange and backwards; why does the condition go in the
+*middle* of the expression, and not in the front as in C's ``c ? x : y``?  The
+decision was checked by applying the new syntax to the modules in the standard
+library and seeing how the resulting code read.  In many cases where a
+conditional expression is used, one value seems to be the 'common case' and one
+value is an 'exceptional case', used only on rarer occasions when the condition
+isn't met.  The conditional syntax makes this pattern a bit more obvious::
+
+   contents = ((doc + '\n') if doc else '')
+
+I read the above statement as meaning "here *contents* is  usually assigned a
+value of ``doc+'\n'``; sometimes  *doc* is empty, in which special case an empty
+string is returned."   I doubt I will use conditional expressions very often
+where there  isn't a clear common and uncommon case.
+
+There was some discussion of whether the language should require surrounding
+conditional expressions with parentheses.  The decision was made to *not*
+require parentheses in the Python language's grammar, but as a matter of style I
+think you should always use them. Consider these two statements::
+
+   # First version -- no parens
+   level = 1 if logging else 0
+
+   # Second version -- with parens
+   level = (1 if logging else 0)
+
+In the first version, I think a reader's eye might group the statement into
+'level = 1', 'if logging', 'else 0', and think that the condition decides
+whether the assignment to *level* is performed.  The second version reads
+better, in my opinion, because it makes it clear that the assignment is always
+performed and the choice is being made between two values.
+
+Another reason for including the brackets: a few odd combinations of list
+comprehensions and lambdas could look like incorrect conditional expressions.
+See :pep:`308` for some examples.  If you put parentheses around your
+conditional expressions, you won't run into this case.
+
+
+.. seealso::
+
+   :pep:`308` - Conditional Expressions
+      PEP written by Guido van Rossum and Raymond D. Hettinger; implemented by Thomas
+      Wouters.
+
+.. % ======================================================================
+
+
+.. _pep-309:
+
+PEP 309: Partial Function Application
+=====================================
+
+The :mod:`functools` module is intended to contain tools for functional-style
+programming.
+
+One useful tool in this module is the :func:`partial` function. For programs
+written in a functional style, you'll sometimes want to construct variants of
+existing functions that have some of the parameters filled in.  Consider a
+Python function ``f(a, b, c)``; you could create a new function ``g(b, c)`` that
+was equivalent to ``f(1, b, c)``.  This is called "partial function
+application".
+
+:func:`partial` takes the arguments ``(function, arg1, arg2, ... kwarg1=value1,
+kwarg2=value2)``.  The resulting object is callable, so you can just call it to
+invoke *function* with the filled-in arguments.
+
+Here's a small but realistic example::
+
+   import functools
+
+   def log (message, subsystem):
+       "Write the contents of 'message' to the specified subsystem."
+       print '%s: %s' % (subsystem, message)
+       ...
+
+   server_log = functools.partial(log, subsystem='server')
+   server_log('Unable to open socket')
+
+Here's another example, from a program that uses PyGTK.  Here a context-
+sensitive pop-up menu is being constructed dynamically.  The callback provided
+for the menu option is a partially applied version of the :meth:`open_item`
+method, where the first argument has been provided. ::
+
+   ...
+   class Application:
+       def open_item(self, path):
+          ...
+       def init (self):
+           open_func = functools.partial(self.open_item, item_path)
+           popup_menu.append( ("Open", open_func, 1) )
+
+Another function in the :mod:`functools` module is the
+:func:`update_wrapper(wrapper, wrapped)` function that helps you write well-
+behaved decorators.  :func:`update_wrapper` copies the name, module, and
+docstring attribute to a wrapper function so that tracebacks inside the wrapped
+function are easier to understand.  For example, you might write::
+
+   def my_decorator(f):
+       def wrapper(*args, **kwds):
+           print 'Calling decorated function'
+           return f(*args, **kwds)
+       functools.update_wrapper(wrapper, f)
+       return wrapper
+
+:func:`wraps` is a decorator that can be used inside your own decorators to copy
+the wrapped function's information.  An alternate  version of the previous
+example would be::
+
+   def my_decorator(f):
+       @functools.wraps(f)
+       def wrapper(*args, **kwds):
+           print 'Calling decorated function'
+           return f(*args, **kwds)
+       return wrapper
+
+
+.. seealso::
+
+   :pep:`309` - Partial Function Application
+      PEP proposed and written by Peter Harris; implemented by Hye-Shik Chang and Nick
+      Coghlan, with adaptations by Raymond Hettinger.
+
+.. % ======================================================================
+
+
+.. _pep-314:
+
+PEP 314: Metadata for Python Software Packages v1.1
+===================================================
+
+Some simple dependency support was added to Distutils.  The :func:`setup`
+function now has ``requires``, ``provides``, and ``obsoletes`` keyword
+parameters.  When you build a source distribution using the ``sdist`` command,
+the dependency information will be recorded in the :file:`PKG-INFO` file.
+
+Another new keyword parameter is ``download_url``, which should be set to a URL
+for the package's source code.  This means it's now possible to look up an entry
+in the package index, determine the dependencies for a package, and download the
+required packages. ::
+
+   VERSION = '1.0'
+   setup(name='PyPackage', 
+         version=VERSION,
+         requires=['numarray', 'zlib (>=1.1.4)'],
+         obsoletes=['OldPackage']
+         download_url=('http://www.example.com/pypackage/dist/pkg-%s.tar.gz'
+                       % VERSION),
+        )
+
+Another new enhancement to the Python package index at
+http://cheeseshop.python.org is storing source and binary archives for a
+package.  The new :command:`upload` Distutils command will upload a package to
+the repository.
+
+Before a package can be uploaded, you must be able to build a distribution using
+the :command:`sdist` Distutils command.  Once that works, you can run ``python
+setup.py upload`` to add your package to the PyPI archive.  Optionally you can
+GPG-sign the package by supplying the :option:`--sign` and :option:`--identity`
+options.
+
+Package uploading was implemented by Martin von Löwis and Richard Jones.
+
+
+.. seealso::
+
+   :pep:`314` - Metadata for Python Software Packages v1.1
+      PEP proposed and written by A.M. Kuchling, Richard Jones, and Fred Drake;
+      implemented by Richard Jones and Fred Drake.
+
+.. % ======================================================================
+
+
+.. _pep-328:
+
+PEP 328: Absolute and Relative Imports
+======================================
+
+The simpler part of PEP 328 was implemented in Python 2.4: parentheses could now
+be used to enclose the names imported from a module using the ``from ... import
+...`` statement, making it easier to import many different names.
+
+The more complicated part has been implemented in Python 2.5: importing a module
+can be specified to use absolute or package-relative imports.  The plan is to
+move toward making absolute imports the default in future versions of Python.
+
+Let's say you have a package directory like this::
+
+   pkg/
+   pkg/__init__.py
+   pkg/main.py
+   pkg/string.py
+
+This defines a package named :mod:`pkg` containing the :mod:`pkg.main` and
+:mod:`pkg.string` submodules.
+
+Consider the code in the :file:`main.py` module.  What happens if it executes
+the statement ``import string``?  In Python 2.4 and earlier, it will first look
+in the package's directory to perform a relative import, finds
+:file:`pkg/string.py`, imports the contents of that file as the
+:mod:`pkg.string` module, and that module is bound to the name ``string`` in the
+:mod:`pkg.main` module's namespace.
+
+That's fine if :mod:`pkg.string` was what you wanted.  But what if you wanted
+Python's standard :mod:`string` module?  There's no clean way to ignore
+:mod:`pkg.string` and look for the standard module; generally you had to look at
+the contents of ``sys.modules``, which is slightly unclean.    Holger Krekel's
+:mod:`py.std` package provides a tidier way to perform imports from the standard
+library, ``import py ; py.std.string.join()``, but that package isn't available
+on all Python installations.
+
+Reading code which relies on relative imports is also less clear, because a
+reader may be confused about which module, :mod:`string` or :mod:`pkg.string`,
+is intended to be used.  Python users soon learned not to duplicate the names of
+standard library modules in the names of their packages' submodules, but you
+can't protect against having your submodule's name being used for a new module
+added in a future version of Python.
+
+In Python 2.5, you can switch :keyword:`import`'s behaviour to  absolute imports
+using a ``from __future__ import absolute_import`` directive.  This absolute-
+import behaviour will become the default in a future version (probably Python
+2.7).  Once absolute imports  are the default, ``import string`` will always
+find the standard library's version. It's suggested that users should begin
+using absolute imports as much as possible, so it's preferable to begin writing
+``from pkg import string`` in your code.
+
+Relative imports are still possible by adding a leading period  to the module
+name when using the ``from ... import`` form::
+
+   # Import names from pkg.string
+   from .string import name1, name2
+   # Import pkg.string
+   from . import string
+
+This imports the :mod:`string` module relative to the current package, so in
+:mod:`pkg.main` this will import *name1* and *name2* from :mod:`pkg.string`.
+Additional leading periods perform the relative import starting from the parent
+of the current package.  For example, code in the :mod:`A.B.C` module can do::
+
+   from . import D                 # Imports A.B.D
+   from .. import E                # Imports A.E
+   from ..F import G               # Imports A.F.G
+
+Leading periods cannot be used with the ``import modname``  form of the import
+statement, only the ``from ... import`` form.
+
+
+.. seealso::
+
+   :pep:`328` - Imports: Multi-Line and Absolute/Relative
+      PEP written by Aahz; implemented by Thomas Wouters.
+
+   http://codespeak.net/py/current/doc/index.html
+      The py library by Holger Krekel, which contains the :mod:`py.std` package.
+
+.. % ======================================================================
+
+
+.. _pep-338:
+
+PEP 338: Executing Modules as Scripts
+=====================================
+
+The :option:`-m` switch added in Python 2.4 to execute a module as a script
+gained a few more abilities.  Instead of being implemented in C code inside the
+Python interpreter, the switch now uses an implementation in a new module,
+:mod:`runpy`.
+
+The :mod:`runpy` module implements a more sophisticated import mechanism so that
+it's now possible to run modules in a package such as :mod:`pychecker.checker`.
+The module also supports alternative import mechanisms such as the
+:mod:`zipimport` module.  This means you can add a .zip archive's path to
+``sys.path`` and then use the :option:`-m` switch to execute code from the
+archive.
+
+
+.. seealso::
+
+   :pep:`338` - Executing modules as scripts
+      PEP written and  implemented by Nick Coghlan.
+
+.. % ======================================================================
+
+
+.. _pep-341:
+
+PEP 341: Unified try/except/finally
+===================================
+
+Until Python 2.5, the :keyword:`try` statement came in two flavours. You could
+use a :keyword:`finally` block to ensure that code is always executed, or one or
+more :keyword:`except` blocks to catch  specific exceptions.  You couldn't
+combine both :keyword:`except` blocks and a :keyword:`finally` block, because
+generating the right bytecode for the combined version was complicated and it
+wasn't clear what the semantics of the combined statement should be.
+
+Guido van Rossum spent some time working with Java, which does support the
+equivalent of combining :keyword:`except` blocks and a :keyword:`finally` block,
+and this clarified what the statement should mean.  In Python 2.5, you can now
+write::
+
+   try:
+       block-1 ...
+   except Exception1:
+       handler-1 ...
+   except Exception2:
+       handler-2 ...
+   else:
+       else-block
+   finally:
+       final-block 
+
+The code in *block-1* is executed.  If the code raises an exception, the various
+:keyword:`except` blocks are tested: if the exception is of class
+:class:`Exception1`, *handler-1* is executed; otherwise if it's of class
+:class:`Exception2`, *handler-2* is executed, and so forth.  If no exception is
+raised, the *else-block* is executed.
+
+No matter what happened previously, the *final-block* is executed once the code
+block is complete and any raised exceptions handled. Even if there's an error in
+an exception handler or the *else-block* and a new exception is raised, the code
+in the *final-block* is still run.
+
+
+.. seealso::
+
+   :pep:`341` - Unifying try-except and try-finally
+      PEP written by Georg Brandl;  implementation by Thomas Lee.
+
+.. % ======================================================================
+
+
+.. _pep-342:
+
+PEP 342: New Generator Features
+===============================
+
+Python 2.5 adds a simple way to pass values *into* a generator. As introduced in
+Python 2.3, generators only produce output; once a generator's code was invoked
+to create an iterator, there was no way to pass any new information into the
+function when its execution is resumed.  Sometimes the ability to pass in some
+information would be useful.  Hackish solutions to this include making the
+generator's code look at a global variable and then changing the global
+variable's value, or passing in some mutable object that callers then modify.
+
+To refresh your memory of basic generators, here's a simple example::
+
+   def counter (maximum):
+       i = 0
+       while i < maximum:
+           yield i
+           i += 1
+
+When you call ``counter(10)``, the result is an iterator that returns the values
+from 0 up to 9.  On encountering the :keyword:`yield` statement, the iterator
+returns the provided value and suspends the function's execution, preserving the
+local variables. Execution resumes on the following call to the iterator's
+:meth:`next` method, picking up after the :keyword:`yield` statement.
+
+In Python 2.3, :keyword:`yield` was a statement; it didn't return any value.  In
+2.5, :keyword:`yield` is now an expression, returning a value that can be
+assigned to a variable or otherwise operated on::
+
+   val = (yield i)
+
+I recommend that you always put parentheses around a :keyword:`yield` expression
+when you're doing something with the returned value, as in the above example.
+The parentheses aren't always necessary, but it's easier to always add them
+instead of having to remember when they're needed.
+
+(:pep:`342` explains the exact rules, which are that a :keyword:`yield`\
+-expression must always be parenthesized except when it occurs at the top-level
+expression on the right-hand side of an assignment.  This means you can write
+``val = yield i`` but have to use parentheses when there's an operation, as in
+``val = (yield i) + 12``.)
+
+Values are sent into a generator by calling its :meth:`send(value)` method.  The
+generator's code is then resumed and the :keyword:`yield` expression returns the
+specified *value*.  If the regular :meth:`next` method is called, the
+:keyword:`yield` returns :const:`None`.
+
+Here's the previous example, modified to allow changing the value of the
+internal counter. ::
+
+   def counter (maximum):
+       i = 0
+       while i < maximum:
+           val = (yield i)
+           # If value provided, change counter
+           if val is not None:
+               i = val
+           else:
+               i += 1
+
+And here's an example of changing the counter::
+
+   >>> it = counter(10)
+   >>> print it.next()
+   0
+   >>> print it.next()
+   1
+   >>> print it.send(8)
+   8
+   >>> print it.next()
+   9
+   >>> print it.next()
+   Traceback (most recent call last):
+     File ``t.py'', line 15, in ?
+       print it.next()
+   StopIteration
+
+:keyword:`yield` will usually return :const:`None`, so you should always check
+for this case.  Don't just use its value in expressions unless you're sure that
+the :meth:`send` method will be the only method used to resume your generator
+function.
+
+In addition to :meth:`send`, there are two other new methods on generators:
+
+* :meth:`throw(type, value=None, traceback=None)` is used to raise an exception
+  inside the generator; the exception is raised by the :keyword:`yield` expression
+  where the generator's execution is paused.
+
+* :meth:`close` raises a new :exc:`GeneratorExit` exception inside the generator
+  to terminate the iteration.  On receiving this exception, the generator's code
+  must either raise :exc:`GeneratorExit` or :exc:`StopIteration`.  Catching the
+  :exc:`GeneratorExit` exception and returning a value is illegal and will trigger
+  a :exc:`RuntimeError`; if the function raises some other exception, that
+  exception is propagated to the caller.  :meth:`close` will also be called by
+  Python's garbage collector when the generator is garbage-collected.
+
+  If you need to run cleanup code when a :exc:`GeneratorExit` occurs, I suggest
+  using a ``try: ... finally:`` suite instead of  catching :exc:`GeneratorExit`.
+
+The cumulative effect of these changes is to turn generators from one-way
+producers of information into both producers and consumers.
+
+Generators also become *coroutines*, a more generalized form of subroutines.
+Subroutines are entered at one point and exited at another point (the top of the
+function, and a :keyword:`return` statement), but coroutines can be entered,
+exited, and resumed at many different points (the :keyword:`yield` statements).
+We'll have to figure out patterns for using coroutines effectively in Python.
+
+The addition of the :meth:`close` method has one side effect that isn't obvious.
+:meth:`close` is called when a generator is garbage-collected, so this means the
+generator's code gets one last chance to run before the generator is destroyed.
+This last chance means that ``try...finally`` statements in generators can now
+be guaranteed to work; the :keyword:`finally` clause will now always get a
+chance to run.  The syntactic restriction that you couldn't mix :keyword:`yield`
+statements with a ``try...finally`` suite has therefore been removed.  This
+seems like a minor bit of language trivia, but using generators and
+``try...finally`` is actually necessary in order to implement the
+:keyword:`with` statement described by PEP 343.  I'll look at this new statement
+in the following  section.
+
+Another even more esoteric effect of this change: previously, the
+:attr:`gi_frame` attribute of a generator was always a frame object. It's now
+possible for :attr:`gi_frame` to be ``None`` once the generator has been
+exhausted.
+
+
+.. seealso::
+
+   :pep:`342` - Coroutines via Enhanced Generators
+      PEP written by  Guido van Rossum and Phillip J. Eby; implemented by Phillip J.
+      Eby.  Includes examples of  some fancier uses of generators as coroutines.
+
+      Earlier versions of these features were proposed in  :pep:`288` by Raymond
+      Hettinger and :pep:`325` by Samuele Pedroni.
+
+   http://en.wikipedia.org/wiki/Coroutine
+      The Wikipedia entry for  coroutines.
+
+   http://www.sidhe.org/~dan/blog/archives/000178.html
+      An explanation of coroutines from a Perl point of view, written by Dan Sugalski.
+
+.. % ======================================================================
+
+
+.. _pep-343:
+
+PEP 343: The 'with' statement
+=============================
+
+The ':keyword:`with`' statement clarifies code that previously would use
+``try...finally`` blocks to ensure that clean-up code is executed.  In this
+section, I'll discuss the statement as it will commonly be used.  In the next
+section, I'll examine the implementation details and show how to write objects
+for use with this statement.
+
+The ':keyword:`with`' statement is a new control-flow structure whose basic
+structure is::
+
+   with expression [as variable]:
+       with-block
+
+The expression is evaluated, and it should result in an object that supports the
+context management protocol (that is, has :meth:`__enter__` and :meth:`__exit__`
+methods.
+
+The object's :meth:`__enter__` is called before *with-block* is executed and
+therefore can run set-up code. It also may return a value that is bound to the
+name *variable*, if given.  (Note carefully that *variable* is *not* assigned
+the result of *expression*.)
+
+After execution of the *with-block* is finished, the object's :meth:`__exit__`
+method is called, even if the block raised an exception, and can therefore run
+clean-up code.
+
+To enable the statement in Python 2.5, you need to add the following directive
+to your module::
+
+   from __future__ import with_statement
+
+The statement will always be enabled in Python 2.6.
+
+Some standard Python objects now support the context management protocol and can
+be used with the ':keyword:`with`' statement. File objects are one example::
+
+   with open('/etc/passwd', 'r') as f:
+       for line in f:
+           print line
+           ... more processing code ...
+
+After this statement has executed, the file object in *f* will have been
+automatically closed, even if the :keyword:`for` loop raised an exception part-
+way through the block.
+
+.. note::
+
+   In this case, *f* is the same object created by :func:`open`, because
+   :meth:`file.__enter__` returns *self*.
+
+The :mod:`threading` module's locks and condition variables  also support the
+':keyword:`with`' statement::
+
+   lock = threading.Lock()
+   with lock:
+       # Critical section of code
+       ...
+
+The lock is acquired before the block is executed and always released once  the
+block is complete.
+
+The new :func:`localcontext` function in the :mod:`decimal` module makes it easy
+to save and restore the current decimal context, which encapsulates the desired
+precision and rounding characteristics for computations::
+
+   from decimal import Decimal, Context, localcontext
+
+   # Displays with default precision of 28 digits
+   v = Decimal('578')
+   print v.sqrt()
+
+   with localcontext(Context(prec=16)):
+       # All code in this block uses a precision of 16 digits.
+       # The original context is restored on exiting the block.
+       print v.sqrt()
+
+
+.. _context-managers:
+
+Writing Context Managers
+------------------------
+
+Under the hood, the ':keyword:`with`' statement is fairly complicated. Most
+people will only use ':keyword:`with`' in company with existing objects and
+don't need to know these details, so you can skip the rest of this section if
+you like.  Authors of new objects will need to understand the details of the
+underlying implementation and should keep reading.
+
+A high-level explanation of the context management protocol is:
+
+* The expression is evaluated and should result in an object called a "context
+  manager".  The context manager must have :meth:`__enter__` and :meth:`__exit__`
+  methods.
+
+* The context manager's :meth:`__enter__` method is called.  The value returned
+  is assigned to *VAR*.  If no ``'as VAR'`` clause is present, the value is simply
+  discarded.
+
+* The code in *BLOCK* is executed.
+
+* If *BLOCK* raises an exception, the :meth:`__exit__(type, value, traceback)`
+  is called with the exception details, the same values returned by
+  :func:`sys.exc_info`.  The method's return value controls whether the exception
+  is re-raised: any false value re-raises the exception, and ``True`` will result
+  in suppressing it.  You'll only rarely want to suppress the exception, because
+  if you do the author of the code containing the ':keyword:`with`' statement will
+  never realize anything went wrong.
+
+* If *BLOCK* didn't raise an exception,  the :meth:`__exit__` method is still
+  called, but *type*, *value*, and *traceback* are all ``None``.
+
+Let's think through an example.  I won't present detailed code but will only
+sketch the methods necessary for a database that supports transactions.
+
+(For people unfamiliar with database terminology: a set of changes to the
+database are grouped into a transaction.  Transactions can be either committed,
+meaning that all the changes are written into the database, or rolled back,
+meaning that the changes are all discarded and the database is unchanged.  See
+any database textbook for more information.)
+
+Let's assume there's an object representing a database connection. Our goal will
+be to let the user write code like this::
+
+   db_connection = DatabaseConnection()
+   with db_connection as cursor:
+       cursor.execute('insert into ...')
+       cursor.execute('delete from ...')
+       # ... more operations ...
+
+The transaction should be committed if the code in the block runs flawlessly or
+rolled back if there's an exception. Here's the basic interface for
+:class:`DatabaseConnection` that I'll assume::
+
+   class DatabaseConnection:
+       # Database interface
+       def cursor (self):
+           "Returns a cursor object and starts a new transaction"
+       def commit (self):
+           "Commits current transaction"
+       def rollback (self):
+           "Rolls back current transaction"
+
+The :meth:`__enter__` method is pretty easy, having only to start a new
+transaction.  For this application the resulting cursor object would be a useful
+result, so the method will return it.  The user can then add ``as cursor`` to
+their ':keyword:`with`' statement to bind the cursor to a variable name. ::
+
+   class DatabaseConnection:
+       ...
+       def __enter__ (self):
+           # Code to start a new transaction
+           cursor = self.cursor()
+           return cursor
+
+The :meth:`__exit__` method is the most complicated because it's where most of
+the work has to be done.  The method has to check if an exception occurred.  If
+there was no exception, the transaction is committed.  The transaction is rolled
+back if there was an exception.
+
+In the code below, execution will just fall off the end of the function,
+returning the default value of ``None``.  ``None`` is false, so the exception
+will be re-raised automatically.  If you wished, you could be more explicit and
+add a :keyword:`return` statement at the marked location. ::
+
+   class DatabaseConnection:
+       ...
+       def __exit__ (self, type, value, tb):
+           if tb is None:
+               # No exception, so commit
+               self.commit()
+           else:
+               # Exception occurred, so rollback.
+               self.rollback()
+               # return False
+
+
+.. _module-contextlib:
+
+The contextlib module
+---------------------
+
+The new :mod:`contextlib` module provides some functions and a decorator that
+are useful for writing objects for use with the ':keyword:`with`' statement.
+
+The decorator is called :func:`contextmanager`, and lets you write a single
+generator function instead of defining a new class.  The generator should yield
+exactly one value.  The code up to the :keyword:`yield` will be executed as the
+:meth:`__enter__` method, and the value yielded will be the method's return
+value that will get bound to the variable in the ':keyword:`with`' statement's
+:keyword:`as` clause, if any.  The code after the :keyword:`yield` will be
+executed in the :meth:`__exit__` method.  Any exception raised in the block will
+be raised by the :keyword:`yield` statement.
+
+Our database example from the previous section could be written  using this
+decorator as::
+
+   from contextlib import contextmanager
+
+   @contextmanager
+   def db_transaction (connection):
+       cursor = connection.cursor()
+       try:
+           yield cursor
+       except:
+           connection.rollback()
+           raise
+       else:
+           connection.commit()
+
+   db = DatabaseConnection()
+   with db_transaction(db) as cursor:
+       ...
+
+The :mod:`contextlib` module also has a :func:`nested(mgr1, mgr2, ...)` function
+that combines a number of context managers so you don't need to write nested
+':keyword:`with`' statements.  In this example, the single ':keyword:`with`'
+statement both starts a database transaction and acquires a thread lock::
+
+   lock = threading.Lock()
+   with nested (db_transaction(db), lock) as (cursor, locked):
+       ...
+
+Finally, the :func:`closing(object)` function returns *object* so that it can be
+bound to a variable, and calls ``object.close`` at the end of the block. ::
+
+   import urllib, sys
+   from contextlib import closing
+
+   with closing(urllib.urlopen('http://www.yahoo.com')) as f:
+       for line in f:
+           sys.stdout.write(line)
+
+
+.. seealso::
+
+   :pep:`343` - The "with" statement
+      PEP written by Guido van Rossum and Nick Coghlan; implemented by Mike Bland,
+      Guido van Rossum, and Neal Norwitz.  The PEP shows the code generated for a
+      ':keyword:`with`' statement, which can be helpful in learning how the statement
+      works.
+
+   The documentation  for the :mod:`contextlib` module.
+
+.. % ======================================================================
+
+
+.. _pep-352:
+
+PEP 352: Exceptions as New-Style Classes
+========================================
+
+Exception classes can now be new-style classes, not just classic classes, and
+the built-in :exc:`Exception` class and all the standard built-in exceptions
+(:exc:`NameError`, :exc:`ValueError`, etc.) are now new-style classes.
+
+The inheritance hierarchy for exceptions has been rearranged a bit. In 2.5, the
+inheritance relationships are::
+
+   BaseException       # New in Python 2.5
+   |- KeyboardInterrupt
+   |- SystemExit
+   |- Exception
+      |- (all other current built-in exceptions)
+
+This rearrangement was done because people often want to catch all exceptions
+that indicate program errors.  :exc:`KeyboardInterrupt` and :exc:`SystemExit`
+aren't errors, though, and usually represent an explicit action such as the user
+hitting Control-C or code calling :func:`sys.exit`.  A bare ``except:`` will
+catch all exceptions, so you commonly need to list :exc:`KeyboardInterrupt` and
+:exc:`SystemExit` in order to re-raise them.  The usual pattern is::
+
+   try:
+       ...
+   except (KeyboardInterrupt, SystemExit):
+       raise
+   except: 
+       # Log error...  
+       # Continue running program...
+
+In Python 2.5, you can now write ``except Exception`` to achieve the same
+result, catching all the exceptions that usually indicate errors  but leaving
+:exc:`KeyboardInterrupt` and :exc:`SystemExit` alone.  As in previous versions,
+a bare ``except:`` still catches all exceptions.
+
+The goal for Python 3.0 is to require any class raised as an exception to derive
+from :exc:`BaseException` or some descendant of :exc:`BaseException`, and future
+releases in the Python 2.x series may begin to enforce this constraint.
+Therefore, I suggest you begin making all your exception classes derive from
+:exc:`Exception` now.  It's been suggested that the bare ``except:`` form should
+be removed in Python 3.0, but Guido van Rossum hasn't decided whether to do this
+or not.
+
+Raising of strings as exceptions, as in the statement ``raise "Error
+occurred"``, is deprecated in Python 2.5 and will trigger a warning.  The aim is
+to be able to remove the string-exception feature in a few releases.
+
+
+.. seealso::
+
+   :pep:`352` - Required Superclass for Exceptions
+      PEP written by  Brett Cannon and Guido van Rossum; implemented by Brett Cannon.
+
+.. % ======================================================================
+
+
+.. _pep-353:
+
+PEP 353: Using ssize_t as the index type
+========================================
+
+A wide-ranging change to Python's C API, using a new  :ctype:`Py_ssize_t` type
+definition instead of :ctype:`int`,  will permit the interpreter to handle more
+data on 64-bit platforms. This change doesn't affect Python's capacity on 32-bit
+platforms.
+
+Various pieces of the Python interpreter used C's :ctype:`int` type to store
+sizes or counts; for example, the number of items in a list or tuple were stored
+in an :ctype:`int`.  The C compilers for most 64-bit platforms still define
+:ctype:`int` as a 32-bit type, so that meant that lists could only hold up to
+``2**31 - 1`` = 2147483647 items. (There are actually a few different
+programming models that 64-bit C compilers can use -- see
+http://www.unix.org/version2/whatsnew/lp64_wp.html for a discussion -- but the
+most commonly available model leaves :ctype:`int` as 32 bits.)
+
+A limit of 2147483647 items doesn't really matter on a 32-bit platform because
+you'll run out of memory before hitting the length limit. Each list item
+requires space for a pointer, which is 4 bytes, plus space for a
+:ctype:`PyObject` representing the item.  2147483647\*4 is already more bytes
+than a 32-bit address space can contain.
+
+It's possible to address that much memory on a 64-bit platform, however.  The
+pointers for a list that size would only require 16 GiB of space, so it's not
+unreasonable that Python programmers might construct lists that large.
+Therefore, the Python interpreter had to be changed to use some type other than
+:ctype:`int`, and this will be a 64-bit type on 64-bit platforms.  The change
+will cause incompatibilities on 64-bit machines, so it was deemed worth making
+the transition now, while the number of 64-bit users is still relatively small.
+(In 5 or 10 years, we may *all* be on 64-bit machines, and the transition would
+be more painful then.)
+
+This change most strongly affects authors of C extension modules.   Python
+strings and container types such as lists and tuples  now use
+:ctype:`Py_ssize_t` to store their size.   Functions such as
+:cfunc:`PyList_Size`  now return :ctype:`Py_ssize_t`.  Code in extension modules
+may therefore need to have some variables changed to :ctype:`Py_ssize_t`.
+
+The :cfunc:`PyArg_ParseTuple` and :cfunc:`Py_BuildValue` functions have a new
+conversion code, ``n``, for :ctype:`Py_ssize_t`.   :cfunc:`PyArg_ParseTuple`'s
+``s#`` and ``t#`` still output :ctype:`int` by default, but you can define the
+macro  :cmacro:`PY_SSIZE_T_CLEAN` before including :file:`Python.h`  to make
+them return :ctype:`Py_ssize_t`.
+
+:pep:`353` has a section on conversion guidelines that  extension authors should
+read to learn about supporting 64-bit platforms.
+
+
+.. seealso::
+
+   :pep:`353` - Using ssize_t as the index type
+      PEP written and implemented by Martin von Löwis.
+
+.. % ======================================================================
+
+
+.. _pep-357:
+
+PEP 357: The '__index__' method
+===============================
+
+The NumPy developers had a problem that could only be solved by adding a new
+special method, :meth:`__index__`.  When using slice notation, as in
+``[start:stop:step]``, the values of the *start*, *stop*, and *step* indexes
+must all be either integers or long integers.  NumPy defines a variety of
+specialized integer types corresponding to unsigned and signed integers of 8,
+16, 32, and 64 bits, but there was no way to signal that these types could be
+used as slice indexes.
+
+Slicing can't just use the existing :meth:`__int__` method because that method
+is also used to implement coercion to integers.  If slicing used
+:meth:`__int__`, floating-point numbers would also become legal slice indexes
+and that's clearly an undesirable behaviour.
+
+Instead, a new special method called :meth:`__index__` was added.  It takes no
+arguments and returns an integer giving the slice index to use.  For example::
+
+   class C:
+       def __index__ (self):
+           return self.value  
+
+The return value must be either a Python integer or long integer. The
+interpreter will check that the type returned is correct, and raises a
+:exc:`TypeError` if this requirement isn't met.
+
+A corresponding :attr:`nb_index` slot was added to the C-level
+:ctype:`PyNumberMethods` structure to let C extensions implement this protocol.
+:cfunc:`PyNumber_Index(obj)` can be used in extension code to call the
+:meth:`__index__` function and retrieve its result.
+
+
+.. seealso::
+
+   :pep:`357` - Allowing Any Object to be Used for Slicing
+      PEP written  and implemented by Travis Oliphant.
+
+.. % ======================================================================
+
+
+.. _other-lang:
+
+Other Language Changes
+======================
+
+Here are all of the changes that Python 2.5 makes to the core Python language.
+
+* The :class:`dict` type has a new hook for letting subclasses provide a default
+  value when a key isn't contained in the dictionary. When a key isn't found, the
+  dictionary's :meth:`__missing__(key)` method will be called.  This hook is used
+  to implement the new :class:`defaultdict` class in the :mod:`collections`
+  module.  The following example defines a dictionary  that returns zero for any
+  missing key::
+
+     class zerodict (dict):
+         def __missing__ (self, key):
+             return 0
+
+     d = zerodict({1:1, 2:2})
+     print d[1], d[2]   # Prints 1, 2
+     print d[3], d[4]   # Prints 0, 0
+
+* Both 8-bit and Unicode strings have new :meth:`partition(sep)`  and
+  :meth:`rpartition(sep)` methods that simplify a common use case.
+
+  The :meth:`find(S)` method is often used to get an index which is then used to
+  slice the string and obtain the pieces that are before and after the separator.
+  :meth:`partition(sep)` condenses this pattern into a single method call that
+  returns a 3-tuple containing the substring before the separator, the separator
+  itself, and the substring after the separator.  If the separator isn't found,
+  the first element of the tuple is the entire string and the other two elements
+  are empty.  :meth:`rpartition(sep)` also returns a 3-tuple but starts searching
+  from the end of the string; the ``r`` stands for 'reverse'.
+
+  Some examples::
+
+     >>> ('http://www.python.org').partition('://')
+     ('http', '://', 'www.python.org')
+     >>> ('file:/usr/share/doc/index.html').partition('://')
+     ('file:/usr/share/doc/index.html', '', '')
+     >>> (u'Subject: a quick question').partition(':')
+     (u'Subject', u':', u' a quick question')
+     >>> 'www.python.org'.rpartition('.')
+     ('www.python', '.', 'org')
+     >>> 'www.python.org'.rpartition(':')
+     ('', '', 'www.python.org')
+
+  (Implemented by Fredrik Lundh following a suggestion by Raymond Hettinger.)
+
+* The :meth:`startswith` and :meth:`endswith` methods of string types now accept
+  tuples of strings to check for. ::
+
+     def is_image_file (filename):
+         return filename.endswith(('.gif', '.jpg', '.tiff'))
+
+  (Implemented by Georg Brandl following a suggestion by Tom Lynn.)
+
+  .. % RFE #1491485
+
+* The :func:`min` and :func:`max` built-in functions gained a ``key`` keyword
+  parameter analogous to the ``key`` argument for :meth:`sort`.  This parameter
+  supplies a function that takes a single argument and is called for every value
+  in the list; :func:`min`/:func:`max` will return the element with the
+  smallest/largest return value from this function. For example, to find the
+  longest string in a list, you can do::
+
+     L = ['medium', 'longest', 'short']
+     # Prints 'longest'
+     print max(L, key=len)              
+     # Prints 'short', because lexicographically 'short' has the largest value
+     print max(L)         
+
+  (Contributed by Steven Bethard and Raymond Hettinger.)
+
+* Two new built-in functions, :func:`any` and :func:`all`, evaluate whether an
+  iterator contains any true or false values.  :func:`any` returns :const:`True`
+  if any value returned by the iterator is true; otherwise it will return
+  :const:`False`.  :func:`all` returns :const:`True` only if all of the values
+  returned by the iterator evaluate as true. (Suggested by Guido van Rossum, and
+  implemented by Raymond Hettinger.)
+
+* The result of a class's :meth:`__hash__` method can now be either a long
+  integer or a regular integer.  If a long integer is returned, the hash of that
+  value is taken.  In earlier versions the hash value was required to be a
+  regular integer, but in 2.5 the :func:`id` built-in was changed to always
+  return non-negative numbers, and users often seem to use ``id(self)`` in
+  :meth:`__hash__` methods (though this is discouraged).
+
+  .. % Bug #1536021
+
+* ASCII is now the default encoding for modules.  It's now  a syntax error if a
+  module contains string literals with 8-bit characters but doesn't have an
+  encoding declaration.  In Python 2.4 this triggered a warning, not a syntax
+  error.  See :pep:`263`  for how to declare a module's encoding; for example, you
+  might add  a line like this near the top of the source file::
+
+     # -*- coding: latin1 -*-
+
+* A new warning, :class:`UnicodeWarning`, is triggered when  you attempt to
+  compare a Unicode string and an 8-bit string  that can't be converted to Unicode
+  using the default ASCII encoding.   The result of the comparison is false::
+
+     >>> chr(128) == unichr(128)   # Can't convert chr(128) to Unicode
+     __main__:1: UnicodeWarning: Unicode equal comparison failed 
+       to convert both arguments to Unicode - interpreting them 
+       as being unequal
+     False
+     >>> chr(127) == unichr(127)   # chr(127) can be converted
+     True
+
+  Previously this would raise a :class:`UnicodeDecodeError` exception, but in 2.5
+  this could result in puzzling problems when accessing a dictionary.  If you
+  looked up ``unichr(128)`` and ``chr(128)`` was being used as a key, you'd get a
+  :class:`UnicodeDecodeError` exception.  Other changes in 2.5 resulted in this
+  exception being raised instead of suppressed by the code in :file:`dictobject.c`
+  that implements dictionaries.
+
+  Raising an exception for such a comparison is strictly correct, but the change
+  might have broken code, so instead  :class:`UnicodeWarning` was introduced.
+
+  (Implemented by Marc-André Lemburg.)
+
+* One error that Python programmers sometimes make is forgetting to include an
+  :file:`__init__.py` module in a package directory. Debugging this mistake can be
+  confusing, and usually requires running Python with the :option:`-v` switch to
+  log all the paths searched. In Python 2.5, a new :exc:`ImportWarning` warning is
+  triggered when an import would have picked up a directory as a package but no
+  :file:`__init__.py` was found.  This warning is silently ignored by default;
+  provide the :option:`-Wd` option when running the Python executable to display
+  the warning message. (Implemented by Thomas Wouters.)
+
+* The list of base classes in a class definition can now be empty.   As an
+  example, this is now legal::
+
+     class C():
+         pass
+
+  (Implemented by Brett Cannon.)
+
+.. % ======================================================================
+
+
+.. _interactive:
+
+Interactive Interpreter Changes
+-------------------------------
+
+In the interactive interpreter, ``quit`` and ``exit``  have long been strings so
+that new users get a somewhat helpful message when they try to quit::
+
+   >>> quit
+   'Use Ctrl-D (i.e. EOF) to exit.'
+
+In Python 2.5, ``quit`` and ``exit`` are now objects that still produce string
+representations of themselves, but are also callable. Newbies who try ``quit()``
+or ``exit()`` will now exit the interpreter as they expect.  (Implemented by
+Georg Brandl.)
+
+The Python executable now accepts the standard long options  :option:`--help`
+and :option:`--version`; on Windows,  it also accepts the :option:`/?` option
+for displaying a help message. (Implemented by Georg Brandl.)
+
+.. % ======================================================================
+
+
+.. _opts:
+
+Optimizations
+-------------
+
+Several of the optimizations were developed at the NeedForSpeed sprint, an event
+held in Reykjavik, Iceland, from May 21--28 2006. The sprint focused on speed
+enhancements to the CPython implementation and was funded by EWT LLC with local
+support from CCP Games.  Those optimizations added at this sprint are specially
+marked in the following list.
+
+* When they were introduced  in Python 2.4, the built-in :class:`set` and
+  :class:`frozenset` types were built on top of Python's dictionary type.   In 2.5
+  the internal data structure has been customized for implementing sets, and as a
+  result sets will use a third less memory and are somewhat faster. (Implemented
+  by Raymond Hettinger.)
+
+* The speed of some Unicode operations, such as finding substrings, string
+  splitting, and character map encoding and decoding, has been improved.
+  (Substring search and splitting improvements were added by Fredrik Lundh and
+  Andrew Dalke at the NeedForSpeed sprint. Character maps were improved by Walter
+  Dörwald and Martin von Löwis.)
+
+  .. % Patch 1313939, 1359618
+
+* The :func:`long(str, base)` function is now faster on long digit strings
+  because fewer intermediate results are calculated.  The peak is for strings of
+  around 800--1000 digits where  the function is 6 times faster. (Contributed by
+  Alan McIntyre and committed at the NeedForSpeed sprint.)
+
+  .. % Patch 1442927
+
+* It's now illegal to mix iterating over a file  with ``for line in file`` and
+  calling  the file object's :meth:`read`/:meth:`readline`/:meth:`readlines`
+  methods.  Iteration uses an internal buffer and the  :meth:`read\*` methods
+  don't use that buffer.   Instead they would return the data following the
+  buffer, causing the data to appear out of order.  Mixing iteration and these
+  methods will now trigger a :exc:`ValueError` from the :meth:`read\*` method.
+  (Implemented by Thomas Wouters.)
+
+  .. % Patch 1397960
+
+* The :mod:`struct` module now compiles structure format  strings into an
+  internal representation and caches this representation, yielding a 20% speedup.
+  (Contributed by Bob Ippolito at the NeedForSpeed sprint.)
+
+* The :mod:`re` module got a 1 or 2% speedup by switching to  Python's allocator
+  functions instead of the system's  :cfunc:`malloc` and :cfunc:`free`.
+  (Contributed by Jack Diederich at the NeedForSpeed sprint.)
+
+* The code generator's peephole optimizer now performs simple constant folding
+  in expressions.  If you write something like ``a = 2+3``, the code generator
+  will do the arithmetic and produce code corresponding to ``a = 5``.  (Proposed
+  and implemented  by Raymond Hettinger.)
+
+* Function calls are now faster because code objects now keep  the most recently
+  finished frame (a "zombie frame") in an internal field of the code object,
+  reusing it the next time the code object is invoked.  (Original patch by Michael
+  Hudson, modified by Armin Rigo and Richard Jones; committed at the NeedForSpeed
+  sprint.)  Frame objects are also slightly smaller, which may improve cache
+  locality and reduce memory usage a bit.  (Contributed by Neal Norwitz.)
+
+  .. % Patch 876206
+  .. % Patch 1337051
+
+* Python's built-in exceptions are now new-style classes, a change that speeds
+  up instantiation considerably.  Exception handling in Python 2.5 is therefore
+  about 30% faster than in 2.4. (Contributed by Richard Jones, Georg Brandl and
+  Sean Reifschneider at the NeedForSpeed sprint.)
+
+* Importing now caches the paths tried, recording whether  they exist or not so
+  that the interpreter makes fewer  :cfunc:`open` and :cfunc:`stat` calls on
+  startup. (Contributed by Martin von Löwis and Georg Brandl.)
+
+  .. % Patch 921466
+
+.. % ======================================================================
+
+
+.. _modules:
+
+New, Improved, and Removed Modules
+==================================
+
+The standard library received many enhancements and bug fixes in Python 2.5.
+Here's a partial list of the most notable changes, sorted alphabetically by
+module name. Consult the :file:`Misc/NEWS` file in the source tree for a more
+complete list of changes, or look through the SVN logs for all the details.
+
+* The :mod:`audioop` module now supports the a-LAW encoding, and the code for
+  u-LAW encoding has been improved.  (Contributed by Lars Immisch.)
+
+* The :mod:`codecs` module gained support for incremental codecs.  The
+  :func:`codec.lookup` function now returns a :class:`CodecInfo` instance instead
+  of a tuple. :class:`CodecInfo` instances behave like a 4-tuple to preserve
+  backward compatibility but also have the attributes :attr:`encode`,
+  :attr:`decode`, :attr:`incrementalencoder`, :attr:`incrementaldecoder`,
+  :attr:`streamwriter`, and :attr:`streamreader`.  Incremental codecs  can receive
+  input and produce output in multiple chunks; the output is the same as if the
+  entire input was fed to the non-incremental codec. See the :mod:`codecs` module
+  documentation for details. (Designed and implemented by Walter Dörwald.)
+
+  .. % Patch  1436130
+
+* The :mod:`collections` module gained a new type, :class:`defaultdict`, that
+  subclasses the standard :class:`dict` type.  The new type mostly behaves like a
+  dictionary but constructs a default value when a key isn't present,
+  automatically adding it to the dictionary for the requested key value.
+
+  The first argument to :class:`defaultdict`'s constructor is a factory function
+  that gets called whenever a key is requested but not found. This factory
+  function receives no arguments, so you can use built-in type constructors such
+  as :func:`list` or :func:`int`.  For example,  you can make an index of words
+  based on their initial letter like this::
+
+     words = """Nel mezzo del cammin di nostra vita
+     mi ritrovai per una selva oscura
+     che la diritta via era smarrita""".lower().split()
+
+     index = defaultdict(list)
+
+     for w in words:
+         init_letter = w[0]
+         index[init_letter].append(w)
+
+  Printing ``index`` results in the following output::
+
+     defaultdict(<type 'list'>, {'c': ['cammin', 'che'], 'e': ['era'], 
+             'd': ['del', 'di', 'diritta'], 'm': ['mezzo', 'mi'], 
+             'l': ['la'], 'o': ['oscura'], 'n': ['nel', 'nostra'], 
+             'p': ['per'], 's': ['selva', 'smarrita'], 
+             'r': ['ritrovai'], 'u': ['una'], 'v': ['vita', 'via']}
+
+  (Contributed by Guido van Rossum.)
+
+* The :class:`deque` double-ended queue type supplied by the :mod:`collections`
+  module now has a :meth:`remove(value)` method that removes the first occurrence
+  of *value* in the queue, raising :exc:`ValueError` if the value isn't found.
+  (Contributed by Raymond Hettinger.)
+
+* New module: The :mod:`contextlib` module contains helper functions for use
+  with the new ':keyword:`with`' statement.  See section :ref:`module-contextlib`
+  for more about this module.
+
+* New module: The :mod:`cProfile` module is a C implementation of  the existing
+  :mod:`profile` module that has much lower overhead. The module's interface is
+  the same as :mod:`profile`: you run ``cProfile.run('main()')`` to profile a
+  function, can save profile data to a file, etc.  It's not yet known if the
+  Hotshot profiler, which is also written in C but doesn't match the
+  :mod:`profile` module's interface, will continue to be maintained in future
+  versions of Python.  (Contributed by Armin Rigo.)
+
+  Also, the :mod:`pstats` module for analyzing the data measured by the profiler
+  now supports directing the output to any file object by supplying a *stream*
+  argument to the :class:`Stats` constructor. (Contributed by Skip Montanaro.)
+
+* The :mod:`csv` module, which parses files in comma-separated value format,
+  received several enhancements and a number of bugfixes.  You can now set the
+  maximum size in bytes of a field by calling the
+  :meth:`csv.field_size_limit(new_limit)` function; omitting the *new_limit*
+  argument will return the currently-set limit.  The :class:`reader` class now has
+  a :attr:`line_num` attribute that counts the number of physical lines read from
+  the source; records can span multiple physical lines, so :attr:`line_num` is not
+  the same as the number of records read.
+
+  The CSV parser is now stricter about multi-line quoted fields. Previously, if a
+  line ended within a quoted field without a terminating newline character, a
+  newline would be inserted into the returned field. This behavior caused problems
+  when reading files that contained carriage return characters within fields, so
+  the code was changed to return the field without inserting newlines. As a
+  consequence, if newlines embedded within fields are important, the input should
+  be split into lines in a manner that preserves the newline characters.
+
+  (Contributed by Skip Montanaro and Andrew McNamara.)
+
+* The :class:`datetime` class in the :mod:`datetime`  module now has a
+  :meth:`strptime(string, format)`  method for parsing date strings, contributed
+  by Josh Spoerri. It uses the same format characters as :func:`time.strptime` and
+  :func:`time.strftime`::
+
+     from datetime import datetime
+
+     ts = datetime.strptime('10:13:15 2006-03-07',
+                            '%H:%M:%S %Y-%m-%d')
+
+* The :meth:`SequenceMatcher.get_matching_blocks` method in the :mod:`difflib`
+  module now guarantees to return a minimal list of blocks describing matching
+  subsequences.  Previously, the algorithm would occasionally break a block of
+  matching elements into two list entries. (Enhancement by Tim Peters.)
+
+* The :mod:`doctest` module gained a ``SKIP`` option that keeps an example from
+  being executed at all.  This is intended for code snippets that are usage
+  examples intended for the reader and aren't actually test cases.
+
+  An *encoding* parameter was added to the :func:`testfile` function and the
+  :class:`DocFileSuite` class to specify the file's encoding.  This makes it
+  easier to use non-ASCII characters in  tests contained within a docstring.
+  (Contributed by Bjorn Tillenius.)
+
+  .. % Patch 1080727
+
+* The :mod:`email` package has been updated to version 4.0. (Contributed by
+  Barry Warsaw.)
+
+  .. % XXX need to provide some more detail here
+
+* The :mod:`fileinput` module was made more flexible. Unicode filenames are now
+  supported, and a *mode* parameter that defaults to ``"r"`` was added to the
+  :func:`input` function to allow opening files in binary or universal-newline
+  mode.  Another new parameter, *openhook*, lets you use a function other than
+  :func:`open`  to open the input files.  Once you're iterating over  the set of
+  files, the :class:`FileInput` object's new :meth:`fileno` returns the file
+  descriptor for the currently opened file. (Contributed by Georg Brandl.)
+
+* In the :mod:`gc` module, the new :func:`get_count` function returns a 3-tuple
+  containing the current collection counts for the three GC generations.  This is
+  accounting information for the garbage collector; when these counts reach a
+  specified threshold, a garbage collection sweep will be made.  The existing
+  :func:`gc.collect` function now takes an optional *generation* argument of 0, 1,
+  or 2 to specify which generation to collect. (Contributed by Barry Warsaw.)
+
+* The :func:`nsmallest` and  :func:`nlargest` functions in the :mod:`heapq`
+  module  now support a ``key`` keyword parameter similar to the one provided by
+  the :func:`min`/:func:`max` functions and the :meth:`sort` methods.  For
+  example::
+
+     >>> import heapq
+     >>> L = ["short", 'medium', 'longest', 'longer still']
+     >>> heapq.nsmallest(2, L)  # Return two lowest elements, lexicographically
+     ['longer still', 'longest']
+     >>> heapq.nsmallest(2, L, key=len)   # Return two shortest elements
+     ['short', 'medium']
+
+  (Contributed by Raymond Hettinger.)
+
+* The :func:`itertools.islice` function now accepts ``None`` for the start and
+  step arguments.  This makes it more compatible with the attributes of slice
+  objects, so that you can now write the following::
+
+     s = slice(5)     # Create slice object
+     itertools.islice(iterable, s.start, s.stop, s.step)
+
+  (Contributed by Raymond Hettinger.)
+
+* The :func:`format` function in the :mod:`locale` module has been modified and
+  two new functions were added, :func:`format_string` and :func:`currency`.
+
+  The :func:`format` function's *val* parameter could previously be a string as
+  long as no more than one %char specifier appeared; now the parameter must be
+  exactly one %char specifier with no surrounding text.  An optional *monetary*
+  parameter was also added which, if ``True``, will use the locale's rules for
+  formatting currency in placing a separator between groups of three digits.
+
+  To format strings with multiple %char specifiers, use the new
+  :func:`format_string` function that works like :func:`format` but also supports
+  mixing %char specifiers with arbitrary text.
+
+  A new :func:`currency` function was also added that formats a number according
+  to the current locale's settings.
+
+  (Contributed by Georg Brandl.)
+
+  .. % Patch 1180296
+
+* The :mod:`mailbox` module underwent a massive rewrite to add the capability to
+  modify mailboxes in addition to reading them.  A new set of classes that include
+  :class:`mbox`, :class:`MH`, and :class:`Maildir` are used to read mailboxes, and
+  have an :meth:`add(message)` method to add messages, :meth:`remove(key)` to
+  remove messages, and :meth:`lock`/:meth:`unlock` to lock/unlock the mailbox.
+  The following example converts a maildir-format mailbox into an mbox-format
+  one::
+
+     import mailbox
+
+     # 'factory=None' uses email.Message.Message as the class representing
+     # individual messages.
+     src = mailbox.Maildir('maildir', factory=None)
+     dest = mailbox.mbox('/tmp/mbox')
+
+     for msg in src:
+         dest.add(msg)
+
+  (Contributed by Gregory K. Johnson.  Funding was provided by Google's 2005
+  Summer of Code.)
+
+* New module: the :mod:`msilib` module allows creating Microsoft Installer
+  :file:`.msi` files and CAB files.  Some support for reading the :file:`.msi`
+  database is also included. (Contributed by Martin von Löwis.)
+
+* The :mod:`nis` module now supports accessing domains other than the system
+  default domain by supplying a *domain* argument to the :func:`nis.match` and
+  :func:`nis.maps` functions. (Contributed by Ben Bell.)
+
+* The :mod:`operator` module's :func:`itemgetter`  and :func:`attrgetter`
+  functions now support multiple fields.   A call such as
+  ``operator.attrgetter('a', 'b')`` will return a function  that retrieves the
+  :attr:`a` and :attr:`b` attributes.  Combining  this new feature with the
+  :meth:`sort` method's ``key`` parameter  lets you easily sort lists using
+  multiple fields. (Contributed by Raymond Hettinger.)
+
+* The :mod:`optparse` module was updated to version 1.5.1 of the Optik library.
+  The :class:`OptionParser` class gained an :attr:`epilog` attribute, a string
+  that will be printed after the help message, and a :meth:`destroy` method to
+  break reference cycles created by the object. (Contributed by Greg Ward.)
+
+* The :mod:`os` module underwent several changes.  The :attr:`stat_float_times`
+  variable now defaults to true, meaning that :func:`os.stat` will now return time
+  values as floats.  (This doesn't necessarily mean that :func:`os.stat` will
+  return times that are precise to fractions of a second; not all systems support
+  such precision.)
+
+  Constants named :attr:`os.SEEK_SET`, :attr:`os.SEEK_CUR`, and
+  :attr:`os.SEEK_END` have been added; these are the parameters to the
+  :func:`os.lseek` function.  Two new constants for locking are
+  :attr:`os.O_SHLOCK` and :attr:`os.O_EXLOCK`.
+
+  Two new functions, :func:`wait3` and :func:`wait4`, were added.  They're similar
+  the :func:`waitpid` function which waits for a child process to exit and returns
+  a tuple of the process ID and its exit status, but :func:`wait3` and
+  :func:`wait4` return additional information.  :func:`wait3` doesn't take a
+  process ID as input, so it waits for any child process to exit and returns a
+  3-tuple of *process-id*, *exit-status*, *resource-usage* as returned from the
+  :func:`resource.getrusage` function. :func:`wait4(pid)` does take a process ID.
+  (Contributed by Chad J. Schroeder.)
+
+  On FreeBSD, the :func:`os.stat` function now returns  times with nanosecond
+  resolution, and the returned object now has :attr:`st_gen` and
+  :attr:`st_birthtime`. The :attr:`st_flags` member is also available, if the
+  platform supports it. (Contributed by Antti Louko and  Diego Pettenò.)
+
+  .. % (Patch 1180695, 1212117)
+
+* The Python debugger provided by the :mod:`pdb` module can now store lists of
+  commands to execute when a breakpoint is reached and execution stops.  Once
+  breakpoint #1 has been created, enter ``commands 1`` and enter a series of
+  commands to be executed, finishing the list with ``end``.  The command list can
+  include commands that resume execution, such as ``continue`` or ``next``.
+  (Contributed by Grégoire Dooms.)
+
+  .. % Patch 790710
+
+* The :mod:`pickle` and :mod:`cPickle` modules no longer accept a return value
+  of ``None`` from the :meth:`__reduce__` method; the method must return a tuple
+  of arguments instead.  The ability to return ``None`` was deprecated in Python
+  2.4, so this completes the removal of the feature.
+
+* The :mod:`pkgutil` module, containing various utility functions for finding
+  packages, was enhanced to support PEP 302's import hooks and now also works for
+  packages stored in ZIP-format archives. (Contributed by Phillip J. Eby.)
+
+* The pybench benchmark suite by Marc-André Lemburg is now included in the
+  :file:`Tools/pybench` directory.  The pybench suite is an improvement on the
+  commonly used :file:`pystone.py` program because pybench provides a more
+  detailed measurement of the interpreter's speed.  It times particular operations
+  such as function calls, tuple slicing, method lookups, and numeric operations,
+  instead of performing many different operations and reducing the result to a
+  single number as :file:`pystone.py` does.
+
+* The :mod:`pyexpat` module now uses version 2.0 of the Expat parser.
+  (Contributed by Trent Mick.)
+
+* The :class:`Queue` class provided by the :mod:`Queue` module gained two new
+  methods.  :meth:`join` blocks until all items in the queue have been retrieved
+  and all processing work on the items  have been completed.  Worker threads call
+  the other new method,  :meth:`task_done`, to signal that processing for an item
+  has been completed.  (Contributed by Raymond Hettinger.)
+
+* The old :mod:`regex` and :mod:`regsub` modules, which have been  deprecated
+  ever since Python 2.0, have finally been deleted.   Other deleted modules:
+  :mod:`statcache`, :mod:`tzparse`, :mod:`whrandom`.
+
+* Also deleted: the :file:`lib-old` directory, which includes ancient modules
+  such as :mod:`dircmp` and :mod:`ni`, was removed.  :file:`lib-old` wasn't on the
+  default ``sys.path``, so unless your programs explicitly added the directory to
+  ``sys.path``, this removal shouldn't affect your code.
+
+* The :mod:`rlcompleter` module is no longer  dependent on importing the
+  :mod:`readline` module and therefore now works on non-Unix platforms. (Patch
+  from Robert Kiendl.)
+
+  .. % Patch #1472854
+
+* The :mod:`SimpleXMLRPCServer` and :mod:`DocXMLRPCServer`  classes now have a
+  :attr:`rpc_paths` attribute that constrains XML-RPC operations to a limited set
+  of URL paths; the default is to allow only ``'/'`` and ``'/RPC2'``.  Setting
+  :attr:`rpc_paths` to ``None`` or an empty tuple disables  this path checking.
+
+  .. % Bug #1473048
+
+* The :mod:`socket` module now supports :const:`AF_NETLINK` sockets on Linux,
+  thanks to a patch from Philippe Biondi.   Netlink sockets are a Linux-specific
+  mechanism for communications between a user-space process and kernel code; an
+  introductory  article about them is at http://www.linuxjournal.com/article/7356.
+  In Python code, netlink addresses are represented as a tuple of 2 integers,
+  ``(pid, group_mask)``.
+
+  Two new methods on socket objects, :meth:`recv_into(buffer)` and
+  :meth:`recvfrom_into(buffer)`, store the received data in an object  that
+  supports the buffer protocol instead of returning the data as a string.  This
+  means you can put the data directly into an array or a memory-mapped file.
+
+  Socket objects also gained :meth:`getfamily`, :meth:`gettype`, and
+  :meth:`getproto` accessor methods to retrieve the family, type, and protocol
+  values for the socket.
+
+* New module: the :mod:`spwd` module provides functions for accessing the shadow
+  password database on systems that support  shadow passwords.
+
+* The :mod:`struct` is now faster because it  compiles format strings into
+  :class:`Struct` objects with :meth:`pack` and :meth:`unpack` methods.  This is
+  similar to how the :mod:`re` module lets you create compiled regular expression
+  objects.  You can still use the module-level  :func:`pack` and :func:`unpack`
+  functions; they'll create  :class:`Struct` objects and cache them.  Or you can
+  use  :class:`Struct` instances directly::
+
+     s = struct.Struct('ih3s')
+
+     data = s.pack(1972, 187, 'abc')
+     year, number, name = s.unpack(data)
+
+  You can also pack and unpack data to and from buffer objects directly using the
+  :meth:`pack_into(buffer, offset, v1, v2, ...)` and :meth:`unpack_from(buffer,
+  offset)` methods.  This lets you store data directly into an array or a memory-
+  mapped file.
+
+  (:class:`Struct` objects were implemented by Bob Ippolito at the NeedForSpeed
+  sprint.  Support for buffer objects was added by Martin Blais, also at the
+  NeedForSpeed sprint.)
+
+* The Python developers switched from CVS to Subversion during the 2.5
+  development process.  Information about the exact build version is available as
+  the ``sys.subversion`` variable, a 3-tuple of ``(interpreter-name, branch-name,
+  revision-range)``.  For example, at the time of writing my copy of 2.5 was
+  reporting ``('CPython', 'trunk', '45313:45315')``.
+
+  This information is also available to C extensions via the
+  :cfunc:`Py_GetBuildInfo` function that returns a  string of build information
+  like this: ``"trunk:45355:45356M, Apr 13 2006, 07:42:19"``.   (Contributed by
+  Barry Warsaw.)
+
+* Another new function, :func:`sys._current_frames`, returns the current stack
+  frames for all running threads as a dictionary mapping thread identifiers to the
+  topmost stack frame currently active in that thread at the time the function is
+  called.  (Contributed by Tim Peters.)
+
+* The :class:`TarFile` class in the :mod:`tarfile` module now has an
+  :meth:`extractall` method that extracts all members from the archive into the
+  current working directory.  It's also possible to set a different directory as
+  the extraction target, and to unpack only a subset of the archive's members.
+
+  The compression used for a tarfile opened in stream mode can now be autodetected
+  using the mode ``'r|*'``. (Contributed by Lars Gustäbel.)
+
+  .. % patch 918101
+
+* The :mod:`threading` module now lets you set the stack size used when new
+  threads are created. The :func:`stack_size([*size*])` function returns the
+  currently configured stack size, and supplying the optional *size* parameter
+  sets a new value.  Not all platforms support changing the stack size, but
+  Windows, POSIX threading, and OS/2 all do. (Contributed by Andrew MacIntyre.)
+
+  .. % Patch 1454481
+
+* The :mod:`unicodedata` module has been updated to use version 4.1.0 of the
+  Unicode character database.  Version 3.2.0 is required  by some specifications,
+  so it's still available as  :attr:`unicodedata.ucd_3_2_0`.
+
+* New module: the  :mod:`uuid` module generates  universally unique identifiers
+  (UUIDs) according to :rfc:`4122`.  The RFC defines several different UUID
+  versions that are generated from a starting string, from system properties, or
+  purely randomly.  This module contains a :class:`UUID` class and  functions
+  named :func:`uuid1`, :func:`uuid3`, :func:`uuid4`,  and  :func:`uuid5` to
+  generate different versions of UUID.  (Version 2 UUIDs  are not specified in
+  :rfc:`4122` and are not supported by this module.) ::
+
+     >>> import uuid
+     >>> # make a UUID based on the host ID and current time
+     >>> uuid.uuid1()
+     UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')
+
+     >>> # make a UUID using an MD5 hash of a namespace UUID and a name
+     >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
+     UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')
+
+     >>> # make a random UUID
+     >>> uuid.uuid4()
+     UUID('16fd2706-8baf-433b-82eb-8c7fada847da')
+
+     >>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
+     >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
+     UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
+
+  (Contributed by Ka-Ping Yee.)
+
+* The :mod:`weakref` module's :class:`WeakKeyDictionary` and
+  :class:`WeakValueDictionary` types gained new methods for iterating over the
+  weak references contained in the dictionary.  :meth:`iterkeyrefs` and
+  :meth:`keyrefs` methods were added to :class:`WeakKeyDictionary`, and
+  :meth:`itervaluerefs` and :meth:`valuerefs` were added to
+  :class:`WeakValueDictionary`.  (Contributed by Fred L. Drake, Jr.)
+
+* The :mod:`webbrowser` module received a number of enhancements. It's now
+  usable as a script with ``python -m webbrowser``, taking a URL as the argument;
+  there are a number of switches  to control the behaviour (:option:`-n` for a new
+  browser window,  :option:`-t` for a new tab).  New module-level functions,
+  :func:`open_new` and :func:`open_new_tab`, were added  to support this.  The
+  module's :func:`open` function supports an additional feature, an *autoraise*
+  parameter that signals whether to raise the open window when possible. A number
+  of additional browsers were added to the supported list such as Firefox, Opera,
+  Konqueror, and elinks.  (Contributed by Oleg Broytmann and Georg Brandl.)
+
+  .. % Patch #754022
+
+* The :mod:`xmlrpclib` module now supports returning  :class:`datetime` objects
+  for the XML-RPC date type.  Supply  ``use_datetime=True`` to the :func:`loads`
+  function or the :class:`Unmarshaller` class to enable this feature. (Contributed
+  by Skip Montanaro.)
+
+  .. % Patch 1120353
+
+* The :mod:`zipfile` module now supports the ZIP64 version of the  format,
+  meaning that a .zip archive can now be larger than 4 GiB and can contain
+  individual files larger than 4 GiB.  (Contributed by Ronald Oussoren.)
+
+  .. % Patch 1446489
+
+* The :mod:`zlib` module's :class:`Compress` and :class:`Decompress` objects now
+  support a :meth:`copy` method that makes a copy of the  object's internal state
+  and returns a new  :class:`Compress` or :class:`Decompress` object.
+  (Contributed by Chris AtLee.)
+
+  .. % Patch 1435422
+
+.. % ======================================================================
+
+
+.. _module-ctypes:
+
+The ctypes package
+------------------
+
+The :mod:`ctypes` package, written by Thomas Heller, has been added  to the
+standard library.  :mod:`ctypes` lets you call arbitrary functions  in shared
+libraries or DLLs.  Long-time users may remember the :mod:`dl` module, which
+provides functions for loading shared libraries and calling functions in them.
+The :mod:`ctypes` package is much fancier.
+
+To load a shared library or DLL, you must create an instance of the
+:class:`CDLL` class and provide the name or path of the shared library or DLL.
+Once that's done, you can call arbitrary functions by accessing them as
+attributes of the :class:`CDLL` object.   ::
+
+   import ctypes
+
+   libc = ctypes.CDLL('libc.so.6')
+   result = libc.printf("Line of output\n")
+
+Type constructors for the various C types are provided: :func:`c_int`,
+:func:`c_float`, :func:`c_double`, :func:`c_char_p` (equivalent to :ctype:`char
+\*`), and so forth.  Unlike Python's types, the C versions are all mutable; you
+can assign to their :attr:`value` attribute to change the wrapped value.  Python
+integers and strings will be automatically converted to the corresponding C
+types, but for other types you  must call the correct type constructor.  (And I
+mean *must*;  getting it wrong will often result in the interpreter crashing
+with a segmentation fault.)
+
+You shouldn't use :func:`c_char_p` with a Python string when the C function will
+be modifying the memory area, because Python strings are  supposed to be
+immutable; breaking this rule will cause puzzling bugs.  When you need a
+modifiable memory area, use :func:`create_string_buffer`::
+
+   s = "this is a string"
+   buf = ctypes.create_string_buffer(s)
+   libc.strfry(buf)
+
+C functions are assumed to return integers, but you can set the :attr:`restype`
+attribute of the function object to  change this::
+
+   >>> libc.atof('2.71828')
+   -1783957616
+   >>> libc.atof.restype = ctypes.c_double
+   >>> libc.atof('2.71828')
+   2.71828
+
+:mod:`ctypes` also provides a wrapper for Python's C API  as the
+``ctypes.pythonapi`` object.  This object does *not*  release the global
+interpreter lock before calling a function, because the lock must be held when
+calling into the interpreter's code.   There's a :class:`py_object()` type
+constructor that will create a  :ctype:`PyObject \*` pointer.  A simple usage::
+
+   import ctypes
+
+   d = {}
+   ctypes.pythonapi.PyObject_SetItem(ctypes.py_object(d),
+             ctypes.py_object("abc"),  ctypes.py_object(1))
+   # d is now {'abc', 1}.
+
+Don't forget to use :class:`py_object()`; if it's omitted you end  up with a
+segmentation fault.
+
+:mod:`ctypes` has been around for a while, but people still write  and
+distribution hand-coded extension modules because you can't rely on
+:mod:`ctypes` being present. Perhaps developers will begin to write  Python
+wrappers atop a library accessed through :mod:`ctypes` instead of extension
+modules, now that :mod:`ctypes` is included with core Python.
+
+
+.. seealso::
+
+   http://starship.python.net/crew/theller/ctypes/
+      The ctypes web page, with a tutorial, reference, and FAQ.
+
+   The documentation  for the :mod:`ctypes` module.
+
+.. % ======================================================================
+
+
+.. _module-etree:
+
+The ElementTree package
+-----------------------
+
+A subset of Fredrik Lundh's ElementTree library for processing XML has been
+added to the standard library as :mod:`xml.etree`.  The available modules are
+:mod:`ElementTree`, :mod:`ElementPath`, and :mod:`ElementInclude` from
+ElementTree 1.2.6.    The :mod:`cElementTree` accelerator module is also
+included.
+
+The rest of this section will provide a brief overview of using ElementTree.
+Full documentation for ElementTree is available at http://effbot.org/zone
+/element-index.htm.
+
+ElementTree represents an XML document as a tree of element nodes. The text
+content of the document is stored as the :attr:`.text` and :attr:`.tail`
+attributes of  (This is one of the major differences between ElementTree and
+the Document Object Model; in the DOM there are many different types of node,
+including :class:`TextNode`.)
+
+The most commonly used parsing function is :func:`parse`, that takes either a
+string (assumed to contain a filename) or a file-like object and returns an
+:class:`ElementTree` instance::
+
+   from xml.etree import ElementTree as ET
+
+   tree = ET.parse('ex-1.xml')
+
+   feed = urllib.urlopen(
+             'http://planet.python.org/rss10.xml')
+   tree = ET.parse(feed)
+
+Once you have an :class:`ElementTree` instance, you can call its :meth:`getroot`
+method to get the root :class:`Element` node.
+
+There's also an :func:`XML` function that takes a string literal and returns an
+:class:`Element` node (not an :class:`ElementTree`).   This function provides a
+tidy way to incorporate XML fragments, approaching the convenience of an XML
+literal::
+
+   svg = ET.XML("""<svg width="10px" version="1.0">
+                </svg>""")
+   svg.set('height', '320px')
+   svg.append(elem1)
+
+Each XML element supports some dictionary-like and some list-like access
+methods.  Dictionary-like operations are used to access attribute values, and
+list-like operations are used to access child nodes.
+
++-------------------------------+--------------------------------------------+
+| Operation                     | Result                                     |
++===============================+============================================+
+| ``elem[n]``                   | Returns n'th child element.                |
++-------------------------------+--------------------------------------------+
+| ``elem[m:n]``                 | Returns list of m'th through n'th child    |
+|                               | elements.                                  |
++-------------------------------+--------------------------------------------+
+| ``len(elem)``                 | Returns number of child elements.          |
++-------------------------------+--------------------------------------------+
+| ``list(elem)``                | Returns list of child elements.            |
++-------------------------------+--------------------------------------------+
+| ``elem.append(elem2)``        | Adds *elem2* as a child.                   |
++-------------------------------+--------------------------------------------+
+| ``elem.insert(index, elem2)`` | Inserts *elem2* at the specified location. |
++-------------------------------+--------------------------------------------+
+| ``del elem[n]``               | Deletes n'th child element.                |
++-------------------------------+--------------------------------------------+
+| ``elem.keys()``               | Returns list of attribute names.           |
++-------------------------------+--------------------------------------------+
+| ``elem.get(name)``            | Returns value of attribute *name*.         |
++-------------------------------+--------------------------------------------+
+| ``elem.set(name, value)``     | Sets new value for attribute *name*.       |
++-------------------------------+--------------------------------------------+
+| ``elem.attrib``               | Retrieves the dictionary containing        |
+|                               | attributes.                                |
++-------------------------------+--------------------------------------------+
+| ``del elem.attrib[name]``     | Deletes attribute *name*.                  |
++-------------------------------+--------------------------------------------+
+
+Comments and processing instructions are also represented as :class:`Element`
+nodes.  To check if a node is a comment or processing instructions::
+
+   if elem.tag is ET.Comment:
+       ...
+   elif elem.tag is ET.ProcessingInstruction:
+       ...
+
+To generate XML output, you should call the :meth:`ElementTree.write` method.
+Like :func:`parse`, it can take either a string or a file-like object::
+
+   # Encoding is US-ASCII
+   tree.write('output.xml')
+
+   # Encoding is UTF-8
+   f = open('output.xml', 'w')
+   tree.write(f, encoding='utf-8')
+
+(Caution: the default encoding used for output is ASCII.  For general XML work,
+where an element's name may contain arbitrary Unicode characters, ASCII isn't a
+very useful encoding because it will raise an exception if an element's name
+contains any characters with values greater than 127.  Therefore, it's best to
+specify a different encoding such as UTF-8 that can handle any Unicode
+character.)
+
+This section is only a partial description of the ElementTree interfaces. Please
+read the package's official documentation for more details.
+
+
+.. seealso::
+
+   http://effbot.org/zone/element-index.htm
+      Official documentation for ElementTree.
+
+.. % ======================================================================
+
+
+.. _module-hashlib:
+
+The hashlib package
+-------------------
+
+A new :mod:`hashlib` module, written by Gregory P. Smith,  has been added to
+replace the :mod:`md5` and :mod:`sha` modules.  :mod:`hashlib` adds support for
+additional secure hashes (SHA-224, SHA-256, SHA-384, and SHA-512). When
+available, the module uses OpenSSL for fast platform optimized implementations
+of algorithms.
+
+The old :mod:`md5` and :mod:`sha` modules still exist as wrappers around hashlib
+to preserve backwards compatibility.  The new module's interface is very close
+to that of the old modules, but not identical. The most significant difference
+is that the constructor functions for creating new hashing objects are named
+differently. ::
+
+   # Old versions
+   h = md5.md5()   
+   h = md5.new()   
+
+   # New version 
+   h = hashlib.md5()
+
+   # Old versions
+   h = sha.sha()   
+   h = sha.new()   
+
+   # New version 
+   h = hashlib.sha1()
+
+   # Hash that weren't previously available
+   h = hashlib.sha224()
+   h = hashlib.sha256()
+   h = hashlib.sha384()
+   h = hashlib.sha512()
+
+   # Alternative form
+   h = hashlib.new('md5')          # Provide algorithm as a string
+
+Once a hash object has been created, its methods are the same as before:
+:meth:`update(string)` hashes the specified string into the  current digest
+state, :meth:`digest` and :meth:`hexdigest` return the digest value as a binary
+string or a string of hex digits, and :meth:`copy` returns a new hashing object
+with the same digest state.
+
+
+.. seealso::
+
+   The documentation  for the :mod:`hashlib` module.
+
+.. % ======================================================================
+
+
+.. _module-sqlite:
+
+The sqlite3 package
+-------------------
+
+The pysqlite module (http://www.pysqlite.org), a wrapper for the SQLite embedded
+database, has been added to the standard library under the package name
+:mod:`sqlite3`.
+
+SQLite is a C library that provides a lightweight disk-based database that
+doesn't require a separate server process and allows accessing the database
+using a nonstandard variant of the SQL query language. Some applications can use
+SQLite for internal data storage.  It's also possible to prototype an
+application using SQLite and then port the code to a larger database such as
+PostgreSQL or Oracle.
+
+pysqlite was written by Gerhard Häring and provides a SQL interface compliant
+with the DB-API 2.0 specification described by :pep:`249`.
+
+If you're compiling the Python source yourself, note that the source tree
+doesn't include the SQLite code, only the wrapper module. You'll need to have
+the SQLite libraries and headers installed before compiling Python, and the
+build process will compile the module when the necessary headers are available.
+
+To use the module, you must first create a :class:`Connection` object that
+represents the database.  Here the data will be stored in the
+:file:`/tmp/example` file::
+
+   conn = sqlite3.connect('/tmp/example')
+
+You can also supply the special name ``:memory:`` to create a database in RAM.
+
+Once you have a :class:`Connection`, you can create a :class:`Cursor`  object
+and call its :meth:`execute` method to perform SQL commands::
+
+   c = conn.cursor()
+
+   # Create table
+   c.execute('''create table stocks
+   (date text, trans text, symbol text,
+    qty real, price real)''')
+
+   # Insert a row of data
+   c.execute("""insert into stocks
+             values ('2006-01-05','BUY','RHAT',100,35.14)""")
+
+Usually your SQL operations will need to use values from Python variables.  You
+shouldn't assemble your query using Python's string operations because doing so
+is insecure; it makes your program vulnerable to an SQL injection attack.
+
+Instead, use the DB-API's parameter substitution.  Put ``?`` as a placeholder
+wherever you want to use a value, and then provide a tuple of values as the
+second argument to the cursor's :meth:`execute` method.  (Other database modules
+may use a different placeholder, such as ``%s`` or ``:1``.) For example::
+
+   # Never do this -- insecure!
+   symbol = 'IBM'
+   c.execute("... where symbol = '%s'" % symbol)
+
+   # Do this instead
+   t = (symbol,)
+   c.execute('select * from stocks where symbol=?', t)
+
+   # Larger example
+   for t in (('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
+             ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
+             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
+            ):
+       c.execute('insert into stocks values (?,?,?,?,?)', t)
+
+To retrieve data after executing a SELECT statement, you can either  treat the
+cursor as an iterator, call the cursor's :meth:`fetchone` method to retrieve a
+single matching row,  or call :meth:`fetchall` to get a list of the matching
+rows.
+
+This example uses the iterator form::
+
+   >>> c = conn.cursor()
+   >>> c.execute('select * from stocks order by price')
+   >>> for row in c:
+   ...    print row
+   ...
+   (u'2006-01-05', u'BUY', u'RHAT', 100, 35.140000000000001)
+   (u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)
+   (u'2006-04-06', u'SELL', u'IBM', 500, 53.0)
+   (u'2006-04-05', u'BUY', u'MSOFT', 1000, 72.0)
+   >>>
+
+For more information about the SQL dialect supported by SQLite, see
+http://www.sqlite.org.
+
+
+.. seealso::
+
+   http://www.pysqlite.org
+      The pysqlite web page.
+
+   http://www.sqlite.org
+      The SQLite web page; the documentation describes the syntax and the available
+      data types for the supported SQL dialect.
+
+   The documentation  for the :mod:`sqlite3` module.
+
+   :pep:`249` - Database API Specification 2.0
+      PEP written by Marc-André Lemburg.
+
+.. % ======================================================================
+
+
+.. _module-wsgiref:
+
+The wsgiref package
+-------------------
+
+The Web Server Gateway Interface (WSGI) v1.0 defines a standard interface
+between web servers and Python web applications and is described in :pep:`333`.
+The :mod:`wsgiref` package is a reference implementation of the WSGI
+specification.
+
+.. % XXX should this be in a PEP 333 section instead?
+
+The package includes a basic HTTP server that will run a WSGI application; this
+server is useful for debugging but isn't intended for  production use.  Setting
+up a server takes only a few lines of code::
+
+   from wsgiref import simple_server
+
+   wsgi_app = ...
+
+   host = ''
+   port = 8000
+   httpd = simple_server.make_server(host, port, wsgi_app)
+   httpd.serve_forever()
+
+.. % XXX discuss structure of WSGI applications?
+.. % XXX provide an example using Django or some other framework?
+
+
+.. seealso::
+
+   http://www.wsgi.org
+      A central web site for WSGI-related resources.
+
+   :pep:`333` - Python Web Server Gateway Interface v1.0
+      PEP written by Phillip J. Eby.
+
+.. % ======================================================================
+
+
+.. _build-api:
+
+Build and C API Changes
+=======================
+
+Changes to Python's build process and to the C API include:
+
+* The Python source tree was converted from CVS to Subversion,  in a complex
+  migration procedure that was supervised and flawlessly carried out by Martin von
+  Löwis.  The procedure was developed as :pep:`347`.
+
+* Coverity, a company that markets a source code analysis tool called Prevent,
+  provided the results of their examination of the Python source code.  The
+  analysis found about 60 bugs that  were quickly fixed.  Many of the bugs were
+  refcounting problems, often occurring in error-handling code.  See
+  http://scan.coverity.com for the statistics.
+
+* The largest change to the C API came from :pep:`353`, which modifies the
+  interpreter to use a :ctype:`Py_ssize_t` type definition instead of
+  :ctype:`int`.  See the earlier section :ref:`pep-353` for a discussion of this
+  change.
+
+* The design of the bytecode compiler has changed a great deal,  no longer
+  generating bytecode by traversing the parse tree.  Instead the parse tree is
+  converted to an abstract syntax tree (or AST), and it is  the abstract syntax
+  tree that's traversed to produce the bytecode.
+
+  It's possible for Python code to obtain AST objects by using the
+  :func:`compile` built-in and specifying ``_ast.PyCF_ONLY_AST`` as the value of
+  the  *flags* parameter::
+
+     from _ast import PyCF_ONLY_AST
+     ast = compile("""a=0
+     for i in range(10):
+         a += i
+     """, "<string>", 'exec', PyCF_ONLY_AST)
+
+     assignment = ast.body[0]
+     for_loop = ast.body[1]
+
+  No official documentation has been written for the AST code yet, but :pep:`339`
+  discusses the design.  To start learning about the code, read the definition of
+  the various AST nodes in :file:`Parser/Python.asdl`.  A Python script reads this
+  file and generates a set of C structure definitions in
+  :file:`Include/Python-ast.h`.  The :cfunc:`PyParser_ASTFromString` and
+  :cfunc:`PyParser_ASTFromFile`, defined in :file:`Include/pythonrun.h`, take
+  Python source as input and return the root of an AST representing the contents.
+  This AST can then be turned into a code object by :cfunc:`PyAST_Compile`.  For
+  more information, read the source code, and then ask questions on python-dev.
+
+  The AST code was developed under Jeremy Hylton's management, and implemented by
+  (in alphabetical order) Brett Cannon, Nick Coghlan, Grant Edwards, John
+  Ehresman, Kurt Kaiser, Neal Norwitz, Tim Peters, Armin Rigo, and Neil
+  Schemenauer, plus the participants in a number of AST sprints at conferences
+  such as PyCon.
+
+  .. % List of names taken from Jeremy's python-dev post at
+  .. % http://mail.python.org/pipermail/python-dev/2005-October/057500.html
+
+* Evan Jones's patch to obmalloc, first described in a talk at PyCon DC 2005,
+  was applied.  Python 2.4 allocated small objects in 256K-sized arenas, but never
+  freed arenas.  With this patch, Python will free arenas when they're empty.  The
+  net effect is that on some platforms, when you allocate many objects, Python's
+  memory usage may actually drop when you delete them and the memory may be
+  returned to the operating system.  (Implemented by Evan Jones, and reworked by
+  Tim Peters.)
+
+  Note that this change means extension modules must be more careful when
+  allocating memory.  Python's API has many different functions for allocating
+  memory that are grouped into families.  For example, :cfunc:`PyMem_Malloc`,
+  :cfunc:`PyMem_Realloc`, and :cfunc:`PyMem_Free` are one family that allocates
+  raw memory, while :cfunc:`PyObject_Malloc`, :cfunc:`PyObject_Realloc`, and
+  :cfunc:`PyObject_Free` are another family that's supposed to be used for
+  creating Python objects.
+
+  Previously these different families all reduced to the platform's
+  :cfunc:`malloc` and :cfunc:`free` functions.  This meant  it didn't matter if
+  you got things wrong and allocated memory with the :cfunc:`PyMem` function but
+  freed it with the :cfunc:`PyObject` function.  With 2.5's changes to obmalloc,
+  these families now do different things and mismatches will probably result in a
+  segfault.  You should carefully test your C extension modules with Python 2.5.
+
+* The built-in set types now have an official C API.  Call :cfunc:`PySet_New`
+  and :cfunc:`PyFrozenSet_New` to create a new set, :cfunc:`PySet_Add` and
+  :cfunc:`PySet_Discard` to add and remove elements, and :cfunc:`PySet_Contains`
+  and :cfunc:`PySet_Size` to examine the set's state. (Contributed by Raymond
+  Hettinger.)
+
+* C code can now obtain information about the exact revision of the Python
+  interpreter by calling the  :cfunc:`Py_GetBuildInfo` function that returns a
+  string of build information like this: ``"trunk:45355:45356M, Apr 13 2006,
+  07:42:19"``.   (Contributed by Barry Warsaw.)
+
+* Two new macros can be used to indicate C functions that are local to the
+  current file so that a faster calling convention can be used.
+  :cfunc:`Py_LOCAL(type)` declares the function as returning a value of the
+  specified *type* and uses a fast-calling qualifier.
+  :cfunc:`Py_LOCAL_INLINE(type)` does the same thing and also requests the
+  function be inlined.  If :cfunc:`PY_LOCAL_AGGRESSIVE` is defined before
+  :file:`python.h` is included, a set of more aggressive optimizations are enabled
+  for the module; you should benchmark the results to find out if these
+  optimizations actually make the code faster.  (Contributed by Fredrik Lundh at
+  the NeedForSpeed sprint.)
+
+* :cfunc:`PyErr_NewException(name, base, dict)` can now accept a tuple of base
+  classes as its *base* argument.  (Contributed by Georg Brandl.)
+
+* The :cfunc:`PyErr_Warn` function for issuing warnings is now deprecated in
+  favour of :cfunc:`PyErr_WarnEx(category, message, stacklevel)` which lets you
+  specify the number of stack frames separating this function and the caller.  A
+  *stacklevel* of 1 is the function calling :cfunc:`PyErr_WarnEx`, 2 is the
+  function above that, and so forth.  (Added by Neal Norwitz.)
+
+* The CPython interpreter is still written in C, but  the code can now be
+  compiled with a C++ compiler without errors.   (Implemented by Anthony Baxter,
+  Martin von Löwis, Skip Montanaro.)
+
+* The :cfunc:`PyRange_New` function was removed.  It was never documented, never
+  used in the core code, and had dangerously lax error checking.  In the unlikely
+  case that your extensions were using it, you can replace it by something like
+  the following::
+
+     range = PyObject_CallFunction((PyObject*) &PyRange_Type, "lll", 
+                                   start, stop, step);
+
+.. % ======================================================================
+
+
+.. _ports:
+
+Port-Specific Changes
+---------------------
+
+* MacOS X (10.3 and higher): dynamic loading of modules now uses the
+  :cfunc:`dlopen` function instead of MacOS-specific functions.
+
+* MacOS X: a :option:`--enable-universalsdk` switch was added to the
+  :program:`configure` script that compiles the interpreter as a universal binary
+  able to run on both PowerPC and Intel processors. (Contributed by Ronald
+  Oussoren.)
+
+* Windows: :file:`.dll` is no longer supported as a filename extension for
+  extension modules.  :file:`.pyd` is now the only filename extension that will be
+  searched for.
+
+.. % ======================================================================
+
+
+.. _porting:
+
+Porting to Python 2.5
+=====================
+
+This section lists previously described changes that may require changes to your
+code:
+
+* ASCII is now the default encoding for modules.  It's now  a syntax error if a
+  module contains string literals with 8-bit characters but doesn't have an
+  encoding declaration.  In Python 2.4 this triggered a warning, not a syntax
+  error.
+
+* Previously, the :attr:`gi_frame` attribute of a generator was always a frame
+  object.  Because of the :pep:`342` changes described in section :ref:`pep-342`,
+  it's now possible for :attr:`gi_frame` to be ``None``.
+
+* A new warning, :class:`UnicodeWarning`, is triggered when  you attempt to
+  compare a Unicode string and an 8-bit string that can't be converted to Unicode
+  using the default ASCII encoding.  Previously such comparisons would raise a
+  :class:`UnicodeDecodeError` exception.
+
+* Library: the :mod:`csv` module is now stricter about multi-line quoted fields.
+  If your files contain newlines embedded within fields, the input should be split
+  into lines in a manner which preserves the newline characters.
+
+* Library: the :mod:`locale` module's  :func:`format` function's would
+  previously  accept any string as long as no more than one %char specifier
+  appeared.  In Python 2.5, the argument must be exactly one %char specifier with
+  no surrounding text.
+
+* Library: The :mod:`pickle` and :mod:`cPickle` modules no longer accept a
+  return value of ``None`` from the :meth:`__reduce__` method; the method must
+  return a tuple of arguments instead.  The modules also no longer accept the
+  deprecated *bin* keyword parameter.
+
+* Library: The :mod:`SimpleXMLRPCServer` and :mod:`DocXMLRPCServer`  classes now
+  have a :attr:`rpc_paths` attribute that constrains XML-RPC operations to a
+  limited set of URL paths; the default is to allow only ``'/'`` and ``'/RPC2'``.
+  Setting  :attr:`rpc_paths` to ``None`` or an empty tuple disables  this path
+  checking.
+
+* C API: Many functions now use :ctype:`Py_ssize_t`  instead of :ctype:`int` to
+  allow processing more data on 64-bit machines.  Extension code may need to make
+  the same change to avoid warnings and to support 64-bit machines.  See the
+  earlier section :ref:`pep-353` for a discussion of this change.
+
+* C API:  The obmalloc changes mean that  you must be careful to not mix usage
+  of the :cfunc:`PyMem_\*` and :cfunc:`PyObject_\*` families of functions. Memory
+  allocated with  one family's :cfunc:`\*_Malloc` must be  freed with the
+  corresponding family's :cfunc:`\*_Free` function.
+
+.. % ======================================================================
+
+
+.. _acks:
+
+Acknowledgements
+================
+
+The author would like to thank the following people for offering suggestions,
+corrections and assistance with various drafts of this article: Georg Brandl,
+Nick Coghlan, Phillip J. Eby, Lars Gustäbel, Raymond Hettinger, Ralf W. Grosse-
+Kunstleve, Kent Johnson, Iain Lowe, Martin von Löwis, Fredrik Lundh, Andrew
+McNamara, Skip Montanaro, Gustavo Niemeyer, Paul Prescod, James Pryor, Mike
+Rovner, Scott Weikart, Barry Warsaw, Thomas Wouters.
+
diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst
new file mode 100644
index 0000000..b0e731a
--- /dev/null
+++ b/Doc/whatsnew/2.6.rst
@@ -0,0 +1,236 @@
+****************************
+  What's New in Python 2.6  
+****************************
+
+:Author: A.M. Kuchling
+:Release: |release|
+:Date: |today|
+
+.. % $Id: whatsnew26.tex 55963 2007-06-13 18:07:49Z guido.van.rossum $
+.. % Rules for maintenance:
+.. % 
+.. % * Anyone can add text to this document.  Do not spend very much time
+.. % on the wording of your changes, because your text will probably
+.. % get rewritten to some degree.
+.. % 
+.. % * The maintainer will go through Misc/NEWS periodically and add
+.. % changes; it's therefore more important to add your changes to
+.. % Misc/NEWS than to this file.
+.. % 
+.. % * This is not a complete list of every single change; completeness
+.. % is the purpose of Misc/NEWS.  Some changes I consider too small
+.. % or esoteric to include.  If such a change is added to the text,
+.. % I'll just remove it.  (This is another reason you shouldn't spend
+.. % too much time on writing your addition.)
+.. % 
+.. % * If you want to draw your new text to the attention of the
+.. % maintainer, add 'XXX' to the beginning of the paragraph or
+.. % section.
+.. % 
+.. % * It's OK to just add a fragmentary note about a change.  For
+.. % example: "XXX Describe the transmogrify() function added to the
+.. % socket module."  The maintainer will research the change and
+.. % write the necessary text.
+.. % 
+.. % * You can comment out your additions if you like, but it's not
+.. % necessary (especially when a final release is some months away).
+.. % 
+.. % * Credit the author of a patch or bugfix.   Just the name is
+.. % sufficient; the e-mail address isn't necessary.
+.. % 
+.. % * It's helpful to add the bug/patch number as a comment:
+.. % 
+.. % % Patch 12345
+.. % XXX Describe the transmogrify() function added to the socket
+.. % module.
+.. % (Contributed by P.Y. Developer.)
+.. % 
+.. % This saves the maintainer the effort of going through the SVN log
+.. % when researching a change.
+
+This article explains the new features in Python 2.6.  No release date for
+Python 2.6 has been set; it will probably be released in mid 2008.
+
+This article doesn't attempt to provide a complete specification of the new
+features, but instead provides a convenient overview.  For full details, you
+should refer to the documentation for Python 2.6. If you want to understand the
+complete implementation and design rationale, refer to the PEP for a particular
+new feature.
+
+.. % Compare with previous release in 2 - 3 sentences here.
+.. % add hyperlink when the documentation becomes available online.
+
+.. % ======================================================================
+.. % Large, PEP-level features and changes should be described here.
+.. % Should there be a new section here for 3k migration?
+.. % Or perhaps a more general section describing module changes/deprecation?
+.. % sets module deprecated
+.. % ======================================================================
+
+
+Other Language Changes
+======================
+
+Here are all of the changes that Python 2.6 makes to the core Python language.
+
+* An obscure change: when you use the the :func:`locals` function inside a
+  :keyword:`class` statement, the resulting dictionary no longer returns free
+  variables.  (Free variables, in this case, are variables referred to in the
+  :keyword:`class` statement  that aren't attributes of the class.)
+
+.. % ======================================================================
+
+
+Optimizations
+-------------
+
+* Internally, a bit is now set in type objects to indicate some of the standard
+  built-in types.  This speeds up checking if an object is a subclass of one of
+  these types.  (Contributed by Neal Norwitz.)
+
+The net result of the 2.6 optimizations is that Python 2.6 runs the pystone
+benchmark around XX% faster than Python 2.5.
+
+.. % ======================================================================
+
+
+New, Improved, and Deprecated Modules
+=====================================
+
+As usual, Python's standard library received a number of enhancements and bug
+fixes.  Here's a partial list of the most notable changes, sorted alphabetically
+by module name. Consult the :file:`Misc/NEWS` file in the source tree for a more
+complete list of changes, or look through the CVS logs for all the details.
+
+* A new data type in the :mod:`collections` module: :class:`NamedTuple(typename,
+  fieldnames)` is a factory function that creates subclasses of the standard tuple
+  whose fields are accessible by name as well as index.  For example::
+
+     var_type = collections.NamedTuple('variable', 
+                  'id name type size')
+     var = var_type(1, 'frequency', 'int', 4)
+
+     print var[0], var.id		# Equivalent
+     print var[2], var.type          # Equivalent
+
+  (Contributed by Raymond Hettinger.)
+
+* A new method in the :mod:`curses` module: for a window, :meth:`chgat` changes
+  the display characters for a  certain number of characters on a single line. ::
+
+     # Boldface text starting at y=0,x=21 
+     # and affecting the rest of the line.
+     stdscr.chgat(0,21, curses.A_BOLD)  
+
+  (Contributed by Fabian Kreutz.)
+
+* The :func:`glob.glob` function can now return Unicode filenames if 
+  a Unicode path was used and Unicode filenames are matched within the directory.
+
+  .. % Patch #1001604
+
+* The :mod:`gopherlib` module has been removed.
+
+* A new function in the :mod:`heapq` module: ``merge(iter1, iter2, ...)``
+  takes any number of iterables that return data  *in sorted order*,  and  returns
+  a new iterator that returns the contents of all the iterators, also in sorted
+  order.  For example::
+
+     heapq.merge([1, 3, 5, 9], [2, 8, 16]) ->
+       [1, 2, 3, 5, 8, 9, 16]
+
+  (Contributed by Raymond Hettinger.)
+
+* A new function in the :mod:`itertools` module: ``izip_longest(iter1, iter2,
+  ...[, fillvalue])`` makes tuples from each of the elements; if some of the
+  iterables are shorter than others, the missing values  are set to *fillvalue*.
+  For example::
+
+     itertools.izip_longest([1,2,3], [1,2,3,4,5]) ->
+       [(1, 1), (2, 2), (3, 3), (None, 4), (None, 5)]
+
+  (Contributed by Raymond Hettinger.)
+
+* The :mod:`macfs` module has been removed.  This in turn required the
+  :func:`macostools.touched` function to be removed because it depended on the
+  :mod:`macfs` module.
+
+  .. % Patch #1490190
+
+* New functions in the :mod:`posix` module: :func:`chflags` and :func:`lchflags`
+  are wrappers for the corresponding system calls (where they're available).
+  Constants for the flag values are defined in the :mod:`stat` module; some
+  possible values include :const:`UF_IMMUTABLE` to signal the file may not be
+  changed and :const:`UF_APPEND` to indicate that data can only be appended to the
+  file.  (Contributed by M. Levinson.)
+
+* The :mod:`rgbimg` module has been removed.
+
+* The :mod:`smtplib` module now supports SMTP over  SSL thanks to the addition
+  of the :class:`SMTP_SSL` class. This class supports an interface identical to
+  the existing :class:`SMTP`  class. (Contributed by Monty Taylor.)
+
+* The :mod:`test.test_support` module now contains a :func:`EnvironmentVarGuard`
+  context manager that  supports temporarily changing environment variables and
+  automatically restores them to their old values. (Contributed by Brett Cannon.)
+
+.. % ======================================================================
+.. % whole new modules get described in \subsections here
+
+.. % ======================================================================
+
+
+Build and C API Changes
+=======================
+
+Changes to Python's build process and to the C API include:
+
+* Detailed changes are listed here.
+
+.. % ======================================================================
+
+
+Port-Specific Changes
+---------------------
+
+Platform-specific changes go here.
+
+.. % ======================================================================
+
+
+.. _section-other:
+
+Other Changes and Fixes
+=======================
+
+As usual, there were a bunch of other improvements and bugfixes scattered
+throughout the source tree.  A search through the change logs finds there were
+XXX patches applied and YYY bugs fixed between Python 2.5 and 2.6.  Both figures
+are likely to be underestimates.
+
+Some of the more notable changes are:
+
+* Details go here.
+
+.. % ======================================================================
+
+
+Porting to Python 2.6
+=====================
+
+This section lists previously described changes that may require changes to your
+code:
+
+* Everything is all in the details!
+
+.. % ======================================================================
+
+
+.. _acks:
+
+Acknowledgements
+================
+
+The author would like to thank the following people for offering suggestions,
+corrections and assistance with various drafts of this article: .
+
diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst
new file mode 100644
index 0000000..ac82317
--- /dev/null
+++ b/Doc/whatsnew/3.0.rst
@@ -0,0 +1,161 @@
+****************************
+  What's New in Python 3.0  
+****************************
+
+:Author: A.M. Kuchling
+
+.. |release| replace:: 0.0
+
+.. % $Id: whatsnew26.tex 55506 2007-05-22 07:43:29Z neal.norwitz $
+.. % Rules for maintenance:
+.. % 
+.. % * Anyone can add text to this document.  Do not spend very much time
+.. % on the wording of your changes, because your text will probably
+.. % get rewritten to some degree.
+.. % 
+.. % * The maintainer will go through Misc/NEWS periodically and add
+.. % changes; it's therefore more important to add your changes to
+.. % Misc/NEWS than to this file.
+.. % 
+.. % * This is not a complete list of every single change; completeness
+.. % is the purpose of Misc/NEWS.  Some changes I consider too small
+.. % or esoteric to include.  If such a change is added to the text,
+.. % I'll just remove it.  (This is another reason you shouldn't spend
+.. % too much time on writing your addition.)
+.. % 
+.. % * If you want to draw your new text to the attention of the
+.. % maintainer, add 'XXX' to the beginning of the paragraph or
+.. % section.
+.. % 
+.. % * It's OK to just add a fragmentary note about a change.  For
+.. % example: "XXX Describe the transmogrify() function added to the
+.. % socket module."  The maintainer will research the change and
+.. % write the necessary text.
+.. % 
+.. % * You can comment out your additions if you like, but it's not
+.. % necessary (especially when a final release is some months away).
+.. % 
+.. % * Credit the author of a patch or bugfix.   Just the name is
+.. % sufficient; the e-mail address isn't necessary.
+.. % 
+.. % * It's helpful to add the bug/patch number as a comment:
+.. % 
+.. % % Patch 12345
+.. % XXX Describe the transmogrify() function added to the socket
+.. % module.
+.. % (Contributed by P.Y. Developer.)
+.. % 
+.. % This saves the maintainer the effort of going through the SVN log
+.. % when researching a change.
+
+This article explains the new features in Python 3.0.  No release date for
+Python 3.0 has been set; it will probably be released in mid 2008.
+
+This article doesn't attempt to provide a complete specification of the new
+features, but instead provides a convenient overview.  For full details, you
+should refer to the documentation for Python 3.0. If you want to understand the
+complete implementation and design rationale, refer to the PEP for a particular
+new feature.
+
+.. % Compare with previous release in 2 - 3 sentences here.
+.. % add hyperlink when the documentation becomes available online.
+
+.. % ======================================================================
+.. % Large, PEP-level features and changes should be described here.
+.. % Should there be a new section here for 3k migration?
+.. % Or perhaps a more general section describing module changes/deprecation?
+.. % sets module deprecated
+.. % ======================================================================
+
+
+Other Language Changes
+======================
+
+Here are all of the changes that Python 2.6 makes to the core Python language.
+
+* Detailed changes are listed here.
+
+.. % ======================================================================
+
+
+Optimizations
+-------------
+
+* Detailed changes are listed here.
+
+The net result of the 3.0 optimizations is that Python 3.0 runs the pystone
+benchmark around XX% slower than Python 2.6.
+
+.. % ======================================================================
+
+
+New, Improved, and Deprecated Modules
+=====================================
+
+As usual, Python's standard library received a number of enhancements and bug
+fixes.  Here's a partial list of the most notable changes, sorted alphabetically
+by module name. Consult the :file:`Misc/NEWS` file in the source tree for a more
+complete list of changes, or look through the CVS logs for all the details.
+
+* Detailed changes are listed here.
+
+.. % ======================================================================
+.. % whole new modules get described in \subsections here
+
+.. % ======================================================================
+
+
+Build and C API Changes
+=======================
+
+Changes to Python's build process and to the C API include:
+
+* Detailed changes are listed here.
+
+.. % ======================================================================
+
+
+Port-Specific Changes
+---------------------
+
+Platform-specific changes go here.
+
+.. % ======================================================================
+
+
+.. _section-other:
+
+Other Changes and Fixes
+=======================
+
+As usual, there were a bunch of other improvements and bugfixes scattered
+throughout the source tree.  A search through the change logs finds there were
+XXX patches applied and YYY bugs fixed between Python 2.6 and 3.0.  Both figures
+are likely to be underestimates.
+
+Some of the more notable changes are:
+
+* Details go here.
+
+.. % ======================================================================
+
+
+Porting to Python 3.0
+=====================
+
+This section lists previously described changes that may require changes to your
+code:
+
+* Everything is all in the details!
+
+.. % ======================================================================
+
+
+.. _acks:
+
+Acknowledgements
+================
+
+The author would like to thank the following people for offering suggestions,
+corrections and assistance with various drafts of this article: .
+