****************************
  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.  Python 2.5 was released on September 19, 2006.

The changes in Python 2.5 are an interesting mix of language and library
improvements. The library enhancements will be more important to Python's user
community, I think, because several widely useful packages were added.  New
modules include ElementTree for XML processing (:mod:`xml.etree`),
the SQLite database module (:mod:`sqlite`), and the :mod:`ctypes`
module for calling C functions.

The language changes are of middling significance.  Some pleasant new features
were added, but most of them aren't features that you'll use every day.
Conditional expressions were finally added to the language using a novel syntax;
see section :ref:`pep-308`.  The new ':keyword:`with`' statement will make
writing cleanup code easier (section :ref:`pep-343`).  Values can now be passed
into generators (section :ref:`pep-342`).  Imports are now visible as either
absolute or relative (section :ref:`pep-328`).  Some corner cases of exception
handling are handled better (section :ref:`pep-341`).  All these improvements
are worthwhile, but they're improvements to one specific language feature or
another; none of them are broad modifications to Python's semantics.

As well as the language and library additions, other improvements and bugfixes
were made throughout the source tree.  A search through the SVN change logs
finds there were 353 patches applied and 458 bugs fixed between Python 2.4 and
2.5.  (Both figures are likely to be underestimates.)

This article doesn't try to be a complete specification of the new features;
instead changes are briefly introduced using helpful examples.  For full
details, you should always refer to the documentation for Python 2.5 at
https://docs.python.org. If you want to understand the complete implementation
and design rationale, refer to the PEP for a particular new feature.

Comments, suggestions, and error reports for this document are welcome; please
e-mail them to the author or open a bug in the Python bug tracker.

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


.. _pep-308:

PEP 308: Conditional Expressions
================================

For a long time, people have been requesting a way to write conditional
expressions, which are expressions that return value A or value B depending on
whether a Boolean value is true or false.  A conditional expression lets you
write a single assignment statement that has the same effect as the following::

   if condition:
       x = true_value
   else:
       x = false_value

There have been endless tedious discussions of syntax on both python-dev and
comp.lang.python.  A vote was even held that found the majority of voters wanted
conditional expressions in some form, but there was no syntax that was preferred
by a clear majority. Candidates included C's ``cond ? true_v : false_v``, ``if
cond then true_v else false_v``, and 16 other variations.

Guido van Rossum eventually chose a surprising syntax::

   x = true_value if condition else false_value

Evaluation is still lazy as in existing Boolean expressions, so the order of
evaluation jumps around a bit.  The *condition* expression in the middle is
evaluated first, and the *true_value* expression is evaluated only if the
condition was true.  Similarly, the *false_value* expression is only evaluated
when the condition is false.

This syntax may seem strange and backwards; why does the condition go in the
*middle* of the expression, and not in the front as in C's ``c ? x : y``?  The
decision was checked by applying the new syntax to the modules in the standard
library and seeing how the resulting code read.  In many cases where a
conditional expression is used, one value seems to be the 'common case' and one
value is an 'exceptional case', used only on rarer occasions when the condition
isn't met.  The conditional syntax makes this pattern a bit more obvious::

   contents = ((doc + '\n') if doc else '')

I read the above statement as meaning "here *contents* is  usually assigned a
value of ``doc+'\n'``; sometimes  *doc* is empty, in which special case an empty
string is returned."   I doubt I will use conditional expressions very often
where there  isn't a clear common and uncommon case.

There was some discussion of whether the language should require surrounding
conditional expressions with parentheses.  The decision was made to *not*
require parentheses in the Python language's grammar, but as a matter of style I
think you should always use them. Consider these two statements::

   # First version -- no parens
   level = 1 if logging else 0

   # Second version -- with parens
   level = (1 if logging else 0)

In the first version, I think a reader's eye might group the statement into
'level = 1', 'if logging', 'else 0', and think that the condition decides
whether the assignment to *level* is performed.  The second version reads
better, in my opinion, because it makes it clear that the assignment is always
performed and the choice is being made between two values.

Another reason for including the brackets: a few odd combinations of list
comprehensions and lambdas could look like incorrect conditional expressions.
See :pep:`308` for some examples.  If you put parentheses around your
conditional expressions, you won't run into this case.


.. seealso::

   :pep:`308` - Conditional Expressions
      PEP written by Guido van Rossum and Raymond D. Hettinger; implemented by Thomas
      Wouters.

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


.. _pep-309:

PEP 309: Partial Function Application
=====================================

The :mod:`functools` module is intended to contain tools for functional-style
programming.

One useful tool in this module is the :func:`partial` function. For programs
written in a functional style, you'll sometimes want to construct variants of
existing functions that have some of the parameters filled in.  Consider a
Python function ``f(a, b, c)``; you could create a new function ``g(b, c)`` that
was equivalent to ``f(1, b, c)``.  This is called "partial function
application".

:func:`partial` takes the arguments ``(function, arg1, arg2, ... kwarg1=value1,
kwarg2=value2)``.  The resulting object is callable, so you can just call it to
invoke *function* with the filled-in arguments.

Here's a small but realistic example::

   import functools

   def log (message, subsystem):
       "Write the contents of 'message' to the specified subsystem."
       print '%s: %s' % (subsystem, message)
       ...

   server_log = functools.partial(log, subsystem='server')
   server_log('Unable to open socket')

Here's another example, from a program that uses PyGTK.  Here a context-sensitive
pop-up menu is being constructed dynamically.  The callback provided
for the menu option is a partially applied version of the :meth:`open_item`
method, where the first argument has been provided. ::

   ...
   class Application:
       def open_item(self, path):
          ...
       def init (self):
           open_func = functools.partial(self.open_item, item_path)
           popup_menu.append( ("Open", open_func, 1) )

Another function in the :mod:`functools` module is the
``update_wrapper(wrapper, wrapped)`` function that helps you write
well-behaved decorators.  :func:`update_wrapper` copies the name, module, and
docstring attribute to a wrapper function so that tracebacks inside the wrapped
function are easier to understand.  For example, you might write::

   def my_decorator(f):
       def wrapper(*args, **kwds):
           print 'Calling decorated function'
           return f(*args, **kwds)
       functools.update_wrapper(wrapper, f)
       return wrapper

:func:`wraps` is a decorator that can be used inside your own decorators to copy
the wrapped function's information.  An alternate  version of the previous
example would be::

   def my_decorator(f):
       @functools.wraps(f)
       def wrapper(*args, **kwds):
           print 'Calling decorated function'
           return f(*args, **kwds)
       return wrapper


.. seealso::

   :pep:`309` - Partial Function Application
      PEP proposed and written by Peter Harris; implemented by Hye-Shik Chang and Nick
      Coghlan, with adaptations by Raymond Hettinger.

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


.. _pep-314:

PEP 314: Metadata for Python Software Packages v1.1
===================================================

Some simple dependency support was added to Distutils.  The :func:`setup`
function now has ``requires``, ``provides``, and ``obsoletes`` keyword
parameters.  When you build a source distribution using the ``sdist`` command,
the dependency information will be recorded in the :file:`PKG-INFO` file.

Another new keyword parameter is ``download_url``, which should be set to a URL
for the package's source code.  This means it's now possible to look up an entry
in the package index, determine the dependencies for a package, and download the
required packages. ::

   VERSION = '1.0'
   setup(name='PyPackage',
         version=VERSION,
         requires=['numarray', 'zlib (>=1.1.4)'],
         obsoletes=['OldPackage']
         download_url=('http://www.example.com/pypackage/dist/pkg-%s.tar.gz'
                       % VERSION),
        )

Another new enhancement to the Python package index at
https://pypi.org is storing source and binary archives for a
package.  The new :command:`upload` Distutils command will upload a package to
the repository.

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

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


.. seealso::

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

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


.. _pep-328:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


.. seealso::

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

   https://pylib.readthedocs.io/
      The py library by Holger Krekel, which contains the :mod:`py.std` package.

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


.. _pep-338:

PEP 338: Executing Modules as Scripts
=====================================

The :option:`-m` switch added in Python 2.4 to execute a module as a script
gained a few more abilities.  Instead of being implemented in C code inside the
Python interpreter, the switch now uses an implementation in a new module,
:mod:`runpy`.

The :mod:`runpy` module implements a more sophisticated import mechanism so that
it's now possible to run modules in a package such as :mod:`pychecker.checker`.
The module also supports alternative import mechanisms such as the
:mod:`zipimport` module.  This means you can add a .zip archive's path to
``sys.path`` and then use the :option:`-m` switch to execute code from the
archive.


.. seealso::

   :pep:`338` - Executing modules as scripts
      PEP written and  implemented by Nick Coghlan.

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


.. _pep-341:

PEP 341: Unified try/except/finally
===================================

Until Python 2.5, the :keyword:`try` statement came in two flavours. You could
use a :keyword:`finally` block to ensure that code is always executed, or one or
more :keyword:`except` blocks to catch  specific exceptions.  You couldn't
combine both :keyword:`!except` blocks and a :keyword:`!finally` block, because
generating the right bytecode for the combined version was complicated and it
wasn't clear what the semantics of the combined statement should be.

Guido van Rossum spent some time working with Java, which does support the
equivalent of combining :keyword:`except` blocks and a :keyword:`finally` block,
and this clarified what the statement should mean.  In Python 2.5, you can now
write::

   try:
       block-1 ...
   except Exception1:
       handler-1 ...
   except Exception2:
       handler-2 ...
   else:
       else-block
   finally:
       final-block

The code in *block-1* is executed.  If the code raises an exception, the various
:keyword:`except` blocks are tested: if the exception is of class
:class:`Exception1`, *handler-1* is executed; otherwise if it's of class
:class:`Exception2`, *handler-2* is executed, and so forth.  If no exception is
raised, the *else-block* is executed.

No matter what happened previously, the *final-block* is executed once the code
block is complete and any raised exceptions handled. Even if there's an error in
an exception handler or the *else-block* and a new exception is raised, the code
in the *final-block* is still run.


.. seealso::

   :pep:`341` - Unifying try-except and try-finally
      PEP written by Georg Brandl;  implementation by Thomas Lee.

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


.. _pep-342:

PEP 342: New Generator Features
===============================

Python 2.5 adds a simple way to pass values *into* a generator. As introduced in
Python 2.3, generators only produce output; once a generator's code was invoked
to create an iterator, there was no way to pass any new information into the
function when its execution is resumed.  Sometimes the ability to pass in some
information would be useful.  Hackish solutions to this include making the
generator's code look at a global variable and then changing the global
variable's value, or passing in some mutable object that callers then modify.

To refresh your memory of basic generators, here's a simple example::

   def counter (maximum):
       i = 0
       while i < maximum:
           yield i
           i += 1

When you call ``counter(10)``, the result is an iterator that returns the values
from 0 up to 9.  On encountering the :keyword:`yield` statement, the iterator
returns the provided value and suspends the function's execution, preserving the
local variables. Execution resumes on the following call to the iterator's
:meth:`next` method, picking up after the :keyword:`!yield` statement.

In Python 2.3, :keyword:`yield` was a statement; it didn't return any value.  In
2.5, :keyword:`!yield` is now an expression, returning a value that can be
assigned to a variable or otherwise operated on::

   val = (yield i)

I recommend that you always put parentheses around a :keyword:`yield` expression
when you're doing something with the returned value, as in the above example.
The parentheses aren't always necessary, but it's easier to always add them
instead of having to remember when they're needed.

(:pep:`342` explains the exact rules, which are that a
:keyword:`yield`\ -expression must always be parenthesized except when it
occurs at the top-level
expression on the right-hand side of an assignment.  This means you can write
``val = yield i`` but have to use parentheses when there's an operation, as in
``val = (yield i) + 12``.)

Values are sent into a generator by calling its ``send(value)`` method.  The
generator's code is then resumed and the :keyword:`yield` expression returns the
specified *value*.  If the regular :meth:`next` method is called, the
:keyword:`!yield` returns :const:`None`.

Here's the previous example, modified to allow changing the value of the
internal counter. ::

   def counter (maximum):
       i = 0
       while i < maximum:
           val = (yield i)
           # If value provided, change counter
           if val is not None:
               i = val
           else:
               i += 1

And here's an example of changing the counter::

   >>> it = counter(10)
   >>> print it.next()
   0
   >>> print it.next()
   1
   >>> print it.send(8)
   8
   >>> print it.next()
   9
   >>> print it.next()
   Traceback (most recent call last):
     File "t.py", line 15, in ?
       print it.next()
   StopIteration

:keyword:`yield` will usually return :const:`None`, so you should always check
for this case.  Don't just use its value in expressions unless you're sure that
the :meth:`send` method will be the only method used to resume your generator
function.

In addition to :meth:`send`, there are two other new methods on generators:

* ``throw(type, value=None, traceback=None)`` is used to raise an exception
  inside the generator; the exception is raised by the :keyword:`yield` expression
  where the generator's execution is paused.

* :meth:`close` raises a new :exc:`GeneratorExit` exception inside the generator
  to terminate the iteration.  On receiving this exception, the generator's code
  must either raise :exc:`GeneratorExit` or :exc:`StopIteration`.  Catching the
  :exc:`GeneratorExit` exception and returning a value is illegal and will trigger
  a :exc:`RuntimeError`; if the function raises some other exception, that
  exception is propagated to the caller.  :meth:`close` will also be called by
  Python's garbage collector when the generator is garbage-collected.

  If you need to run cleanup code when a :exc:`GeneratorExit` occurs, I suggest
  using a ``try: ... finally:`` suite instead of  catching :exc:`GeneratorExit`.

The cumulative effect of these changes is to turn generators from one-way
producers of information into both producers and consumers.

Generators also become *coroutines*, a more generalized form of subroutines.
Subroutines are entered at one point and exited at another point (the top of the
function, and a :keyword:`return` statement), but coroutines can be entered,
exited, and resumed at many different points (the :keyword:`yield` statements).
We'll have to figure out patterns for using coroutines effectively in Python.

The addition of the :meth:`close` method has one side effect that isn't obvious.
:meth:`close` is called when a generator is garbage-collected, so this means the
generator's code gets one last chance to run before the generator is destroyed.
This last chance means that ``try...finally`` statements in generators can now
be guaranteed to work; the :keyword:`finally` clause will now always get a
chance to run.  The syntactic restriction that you couldn't mix :keyword:`yield`
statements with a ``try...finally`` suite has therefore been removed.  This
seems like a minor bit of language trivia, but using generators and
``try...finally`` is actually necessary in order to implement the
:keyword:`with` statement described by :pep:`343`.  I'll look at this new statement
in the following  section.

Another even more esoteric effect of this change: previously, the
:attr:`gi_frame` attribute of a generator was always a frame object. It's now
possible for :attr:`gi_frame` to be ``None`` once the generator has been
exhausted.


.. seealso::

   :pep:`342` - Coroutines via Enhanced Generators
      PEP written by  Guido van Rossum and Phillip J. Eby; implemented by Phillip J.
      Eby.  Includes examples of  some fancier uses of generators as coroutines.

      Earlier versions of these features were proposed in  :pep:`288` by Raymond
      Hettinger and :pep:`325` by Samuele Pedroni.

   https://en.wikipedia.org/wiki/Coroutine
      The Wikipedia entry for  coroutines.

   https://web.archive.org/web/20160321211320/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:expr:`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:expr:`int` type to store
sizes or counts; for example, the number of items in a list or tuple were stored
in an :c:expr:`int`.  The C compilers for most 64-bit platforms still define
:c:expr:`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
https://unix.org/version2/whatsnew/lp64_wp.html for a discussion -- but the
most commonly available model leaves :c:expr:`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:expr:`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:expr:`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:expr:`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:expr:`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::

   https://web.archive.org/web/20180410025338/http://starship.python.net/crew/theller/ctypes/
      The pre-stdlib 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
https://web.archive.org/web/20201124024954/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::

   https://web.archive.org/web/20201124024954/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 (https://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::

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

   https://web.archive.org/web/20160331090247/http://wsgi.readthedocs.org/en/latest/
      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:expr:`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:expr:`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 ``PyMem_*`` and ``PyObject_*`` families of functions. Memory
  allocated with  one family's ``*_Malloc`` must be  freed with the
  corresponding family's ``*_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.

