****************************
  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
https://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
https://pypi.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.

   https://pylib.readthedocs.io/
      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.

   https://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 :kbd:`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 <-W>` 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.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.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 https://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.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
https://www.sqlite.org.


.. seealso::

   http://www.pysqlite.org
      The pysqlite web page.

   https://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
  https://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
  .. https://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.

