****************************
  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.python.org is storing source and binary archives for a
package.  The new :command:`upload` Distutils command will upload a package to
the repository.

Before a package can be uploaded, you must be able to build a distribution using
the :command:`sdist` Distutils command.  Once that works, you can run ``python
setup.py upload`` to add your package to the PyPI archive.  Optionally you can
GPG-sign the package by supplying the :option:`!--sign` and :option:`!--identity`
options.

Package uploading was implemented by Martin von Löwis and Richard Jones.


.. seealso::

   :pep:`314` - Metadata for Python Software Packages v1.1
      PEP proposed and written by A.M. Kuchling, Richard Jones, and Fred Drake;
      implemented by Richard Jones and Fred Drake.

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


.. _pep-328:

PEP 328: Absolute and Relative Imports
======================================

The simpler part of PEP 328 was implemented in Python 2.4: parentheses could now
be used to enclose the names imported from a module using the ``from ... import
...`` statement, making it easier to import many different names.

The more complicated part has been implemented in Python 2.5: importing a module
can be specified to use absolute or package-relative imports.  The plan is to
move toward making absolute imports the default in future versions of Python.

Let's say you have a package directory like this::

   pkg/
   pkg/__init__.py
   pkg/main.py
   pkg/string.py

This defines a package named :mod:`pkg` containing the :mod:`pkg.main` and
:mod:`pkg.string` submodules.

Consider the code in the :file:`main.py` module.  What happens if it executes
the statement ``import string``?  In Python 2.4 and earlier, it will first look
in the package's directory to perform a relative import, finds
:file:`pkg/string.py`, imports the contents of that file as the
:mod:`pkg.string` module, and that module is bound to the name ``string`` in the
:mod:`pkg.main` module's namespace.

That's fine if :mod:`pkg.string` was what you wanted.  But what if you wanted
Python's standard :mod:`string` module?  There's no clean way to ignore
:mod:`pkg.string` and look for the standard module; generally you had to look at
the contents of ``sys.modules``, which is slightly unclean.    Holger Krekel's
:mod:`py.std` package provides a tidier way to perform imports from the standard
library, ``import py; py.std.string.join()``, but that package isn't available
on all Python installations.

Reading code which relies on relative imports is also less clear, because a
reader may be confused about which module, :mod:`string` or :mod:`pkg.string`,
is intended to be used.  Python users soon learned not to duplicate the names of
standard library modules in the names of their packages' submodules, but you
can't protect against having your submodule's name being used for a new module
added in a future version of Python.

In Python 2.5, you can switch :keyword:`import`'s behaviour to  absolute imports
using a ``from __future__ import absolute_import`` directive.  This absolute-import
behaviour will become the default in a future version (probably Python
2.7).  Once absolute imports  are the default, ``import string`` will always
find the standard library's version. It's suggested that users should begin
using absolute imports as much as possible, so it's preferable to begin writing
``from pkg import string`` in your code.

Relative imports are still possible by adding a leading period  to the module
name when using the ``from ... import`` form::

   # Import names from pkg.string
   from .string import name1, name2
   # Import pkg.string
   from . import string

This imports the :mod:`string` module relative to the current package, so in
:mod:`pkg.main` this will import *name1* and *name2* from :mod:`pkg.string`.
Additional leading periods perform the relative import starting from the parent
of the current package.  For example, code in the :mod:`A.B.C` module can do::

   from . import D                 # Imports A.B.D
   from .. import E                # Imports A.E
   from ..F import G               # Imports A.F.G

Leading periods cannot be used with the ``import modname``  form of the import
statement, only the ``from ... import`` form.


.. seealso::

   :pep:`328` - Imports: Multi-Line and Absolute/Relative
      PEP written by Aahz; implemented by Thomas Wouters.

   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.

