****************************
  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 (:mod:`xml.etree`),
the SQLite database module (:mod:`sqlite`), and the :mod:`ctypes`
module for calling C functions.

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
``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 ``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:

* ``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()


.. _new-25-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 ``__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


.. _contextlibmod:

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 ``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 ``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  :c:type:`Py_ssize_t` type
definition instead of :c:type:`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 :c:type:`int` type to store
sizes or counts; for example, the number of items in a list or tuple were stored
in an :c:type:`int`.  The C compilers for most 64-bit platforms still define
:c:type:`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 :c:type:`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
:c:type:`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
:c:type:`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
:c:type:`Py_ssize_t` to store their size.   Functions such as
:c:func:`PyList_Size`  now return :c:type:`Py_ssize_t`.  Code in extension modules
may therefore need to have some variables changed to :c:type:`Py_ssize_t`.

The :c:func:`PyArg_ParseTuple` and :c:func:`Py_BuildValue` functions have a new
conversion code, ``n``, for :c:type:`Py_ssize_t`.   :c:func:`PyArg_ParseTuple`'s
``s#`` and ``t#`` still output :c:type:`int` by default, but you can define the
macro  :c:macro:`PY_SSIZE_T_CLEAN` before including :file:`Python.h`  to make
them return :c:type:`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
:c:type:`PyNumberMethods` structure to let C extensions implement this protocol.
``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 ``__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 ``partition(sep)``  and
  ``rpartition(sep)`` methods that simplify a common use case.

  The ``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.
  ``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.  ``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.)

.. ======================================================================


.. _25interactive:

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 ``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  :c:func:`malloc` and :c:func:`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  :c:func:`open` and :c:func:`stat` calls on
  startup. (Contributed by Martin von Löwis and Georg Brandl.)

  .. Patch 921466

.. ======================================================================


.. _25modules:

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 ``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:`contextlibmod`
  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
  ``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
  ``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

  .. index::
     single: universal newlines; What's new

* 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 :term:`universal
  newlines` 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 ``add(message)`` method to add messages, ``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. ``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` attribute 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, ``recv_into(buffer)`` and
  ``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
  ``pack_into(buffer, offset, v1, v2, ...)`` and ``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
  :c:func:`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 ``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 :c:type:`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  :c:type:`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:
``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 :c:type:`Py_ssize_t` type definition instead of
  :c:type:`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 :c:func:`PyParser_ASTFromString` and
  :c:func:`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 :c:func:`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, :c:func:`PyMem_Malloc`,
  :c:func:`PyMem_Realloc`, and :c:func:`PyMem_Free` are one family that allocates
  raw memory, while :c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc`, and
  :c:func:`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
  :c:func:`malloc` and :c:func:`free` functions.  This meant  it didn't matter if
  you got things wrong and allocated memory with the :c:func:`PyMem` function but
  freed it with the :c:func:`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 :c:func:`PySet_New`
  and :c:func:`PyFrozenSet_New` to create a new set, :c:func:`PySet_Add` and
  :c:func:`PySet_Discard` to add and remove elements, and :c:func:`PySet_Contains`
  and :c:func:`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  :c:func:`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.
  ``Py_LOCAL(type)`` declares the function as returning a value of the
  specified *type* and uses a fast-calling qualifier.
  ``Py_LOCAL_INLINE(type)`` does the same thing and also requests the
  function be inlined.  If :c:func:`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.)

* ``PyErr_NewException(name, base, dict)`` can now accept a tuple of base
  classes as its *base* argument.  (Contributed by Georg Brandl.)

* The :c:func:`PyErr_Warn` function for issuing warnings is now deprecated in
  favour of ``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 :c:func:`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 :c:func:`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
  :c:func:`dlopen` function instead of MacOS-specific functions.

* MacOS X: an :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; :issue:`2573`.)

* 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 :c:type:`Py_ssize_t`  instead of :c:type:`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 :c:func:`PyMem_\*` and :c:func:`PyObject_\*` families of functions. Memory
  allocated with  one family's :c:func:`\*_Malloc` must be  freed with the
  corresponding family's :c:func:`\*_Free` function.

.. ======================================================================


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.

