.. _whats-new-in-2.6:

****************************
  What's New in Python 2.6
****************************

.. XXX add trademark info for Apple, Microsoft, SourceForge.

:Author: A.M. Kuchling (amk at amk.ca)
:Release: |release|
:Date: |today|

.. $Id$
   Rules for maintenance:

   * Anyone can add text to this document.  Do not spend very much time
   on the wording of your changes, because your text will probably
   get rewritten to some degree.

   * The maintainer will go through Misc/NEWS periodically and add
   changes; it's therefore more important to add your changes to
   Misc/NEWS than to this file.

   * This is not a complete list of every single change; completeness
   is the purpose of Misc/NEWS.  Some changes I consider too small
   or esoteric to include.  If such a change is added to the text,
   I'll just remove it.  (This is another reason you shouldn't spend
   too much time on writing your addition.)

   * If you want to draw your new text to the attention of the
   maintainer, add 'XXX' to the beginning of the paragraph or
   section.

   * It's OK to just add a fragmentary note about a change.  For
   example: "XXX Describe the transmogrify() function added to the
   socket module."  The maintainer will research the change and
   write the necessary text.

   * You can comment out your additions if you like, but it's not
   necessary (especially when a final release is some months away).

   * Credit the author of a patch or bugfix.   Just the name is
   sufficient; the e-mail address isn't necessary.

   * It's helpful to add the bug/patch number in a parenthetical comment.

   XXX Describe the transmogrify() function added to the socket
   module.
   (Contributed by P.Y. Developer; :issue:`12345`.)

   This saves the maintainer some effort going through the SVN logs
   when researching a change.

This article explains the new features in Python 2.6, released on October 1
2008.  The release schedule is described in :pep:`361`.

The major theme of Python 2.6 is preparing the migration path to
Python 3.0, a major redesign of the language.  Whenever possible,
Python 2.6 incorporates new features and syntax from 3.0 while
remaining compatible with existing code by not removing older features
or syntax.  When it's not possible to do that, Python 2.6 tries to do
what it can, adding compatibility functions in a
:mod:`future_builtins` module and a :option:`-3` switch to warn about
usages that will become unsupported in 3.0.

Some significant new packages have been added to the standard library,
such as the :mod:`multiprocessing` and :mod:`json` modules, but
there aren't many new features that aren't related to Python 3.0 in
some way.

Python 2.6 also sees a number of improvements and bugfixes throughout
the source.  A search through the change logs finds there were 259
patches applied and 612 bugs fixed between Python 2.5 and 2.6.  Both
figures are likely to be underestimates.

This article doesn't attempt to provide a complete specification of
the new features, but instead provides a convenient overview.  For
full details, you should refer to the documentation for Python 2.6. If
you want to understand the rationale for the design and
implementation, refer to the PEP for a particular new feature.
Whenever possible, "What's New in Python" links to the bug/patch item
for each change.

.. Compare with previous release in 2 - 3 sentences here.
   add hyperlink when the documentation becomes available online.

.. ========================================================================
.. Large, PEP-level features and changes should be described here.
.. ========================================================================

Python 3.0
================

The development cycle for Python versions 2.6 and 3.0 was
synchronized, with the alpha and beta releases for both versions being
made on the same days.  The development of 3.0 has influenced many
features in 2.6.

Python 3.0 is a far-ranging redesign of Python that breaks
compatibility with the 2.x series.  This means that existing Python
code will need some conversion in order to run on
Python 3.0.  However, not all the changes in 3.0 necessarily break
compatibility.  In cases where new features won't cause existing code
to break, they've been backported to 2.6 and are described in this
document in the appropriate place.  Some of the 3.0-derived features
are:

* A :meth:`__complex__` method for converting objects to a complex number.
* Alternate syntax for catching exceptions: ``except TypeError as exc``.
* The addition of :func:`functools.reduce` as a synonym for the built-in
  :func:`reduce` function.

Python 3.0 adds several new built-in functions and changes the
semantics of some existing built-ins.  Functions that are new in 3.0
such as :func:`bin` have simply been added to Python 2.6, but existing
built-ins haven't been changed; instead, the :mod:`future_builtins`
module has versions with the new 3.0 semantics.  Code written to be
compatible with 3.0 can do ``from future_builtins import hex, map`` as
necessary.

A new command-line switch, :option:`-3`, enables warnings
about features that will be removed in Python 3.0.  You can run code
with this switch to see how much work will be necessary to port
code to 3.0.  The value of this switch is available
to Python code as the boolean variable :data:`sys.py3kwarning`,
and to C extension code as :cdata:`Py_Py3kWarningFlag`.

.. seealso::

   The 3xxx series of PEPs, which contains proposals for Python 3.0.
   :pep:`3000` describes the development process for Python 3.0.
   Start with :pep:`3100` that describes the general goals for Python
   3.0, and then explore the higher-numbered PEPS that propose
   specific features.


Changes to the Development Process
==================================================

While 2.6 was being developed, the Python development process
underwent two significant changes: we switched from SourceForge's
issue tracker to a customized Roundup installation, and the
documentation was converted from LaTeX to reStructuredText.


New Issue Tracker: Roundup
--------------------------------------------------

For a long time, the Python developers had been growing increasingly
annoyed by SourceForge's bug tracker.  SourceForge's hosted solution
doesn't permit much customization; for example, it wasn't possible to
customize the life cycle of issues.

The infrastructure committee of the Python Software Foundation
therefore posted a call for issue trackers, asking volunteers to set
up different products and import some of the bugs and patches from
SourceForge.  Four different trackers were examined: `Jira
<http://www.atlassian.com/software/jira/>`__,
`Launchpad <http://www.launchpad.net>`__,
`Roundup <http://roundup.sourceforge.net/>`__, and
`Trac <http://trac.edgewall.org/>`__.
The committee eventually settled on Jira
and Roundup as the two candidates.  Jira is a commercial product that
offers no-cost hosted instances to free-software projects; Roundup
is an open-source project that requires volunteers
to administer it and a server to host it.

After posting a call for volunteers, a new Roundup installation was
set up at http://bugs.python.org.  One installation of Roundup can
host multiple trackers, and this server now also hosts issue trackers
for Jython and for the Python web site.  It will surely find
other uses in the future.  Where possible,
this edition of "What's New in Python" links to the bug/patch
item for each change.

Hosting of the Python bug tracker is kindly provided by
`Upfront Systems <http://www.upfrontsystems.co.za/>`__
of Stellenbosch, South Africa.  Martin von Loewis put a
lot of effort into importing existing bugs and patches from
SourceForge; his scripts for this import operation are at
http://svn.python.org/view/tracker/importer/ and may be useful to
other projects wishing to move from SourceForge to Roundup.

.. seealso::

  http://bugs.python.org
    The Python bug tracker.

  http://bugs.jython.org:
    The Jython bug tracker.

  http://roundup.sourceforge.net/
    Roundup downloads and documentation.

  http://svn.python.org/view/tracker/importer/
    Martin von Loewis's conversion scripts.

New Documentation Format: reStructuredText Using Sphinx
-----------------------------------------------------------

The Python documentation was written using LaTeX since the project
started around 1989.  In the 1980s and early 1990s, most documentation
was printed out for later study, not viewed online. LaTeX was widely
used because it provided attractive printed output while remaining
straightforward to write once the basic rules of the markup were
learned.

Today LaTeX is still used for writing publications destined for
printing, but the landscape for programming tools has shifted.  We no
longer print out reams of documentation; instead, we browse through it
online and HTML has become the most important format to support.
Unfortunately, converting LaTeX to HTML is fairly complicated and Fred
L. Drake Jr., the long-time Python documentation editor, spent a lot
of time maintaining the conversion process.  Occasionally people would
suggest converting the documentation into SGML and later XML, but
performing a good conversion is a major task and no one ever committed
the time required to finish the job.

During the 2.6 development cycle, Georg Brandl put a lot of effort
into building a new toolchain for processing the documentation.  The
resulting package is called Sphinx, and is available from
http://sphinx.pocoo.org/.

Sphinx concentrates on HTML output, producing attractively styled and
modern HTML; printed output is still supported through conversion to
LaTeX.  The input format is reStructuredText, a markup syntax
supporting custom extensions and directives that is commonly used in
the Python community.

Sphinx is a standalone package that can be used for writing, and
almost two dozen other projects
(`listed on the Sphinx web site <http://sphinx.pocoo.org/examples.html>`__)
have adopted Sphinx as their documentation tool.

.. seealso::

   :ref:`documenting-index`
       Describes how to write for Python's documentation.

   `Sphinx <http://sphinx.pocoo.org/>`__
     Documentation and code for the Sphinx toolchain.

   `Docutils <http://docutils.sf.net>`__
     The underlying reStructuredText parser and toolset.


.. _pep-0343:

PEP 343: The 'with' statement
=============================

The previous version, Python 2.5, added the ':keyword:`with`'
statement as an optional feature, to be enabled by a ``from __future__
import with_statement`` directive.  In 2.6 the statement no longer needs to
be specially enabled; this means that :keyword:`with` is now always a
keyword.  The rest of this section is a copy of the corresponding
section from the "What's New in Python 2.5" document; if you're
familiar with the ':keyword:`with`' statement
from Python 2.5, you can skip this section.

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 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.

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 :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-26-context-managers:

Writing Context Managers
------------------------

Under the hood, the ':keyword:`with`' statement is fairly complicated. Most
people will only use ':keyword:`with`' in company with existing objects and
don't need to know these details, so you can skip the rest of this section if
you like.  Authors of new objects will need to understand the details of the
underlying implementation and should keep reading.

A high-level explanation of the context management protocol is:

* The expression is evaluated and should result in an object called a "context
  manager".  The context manager must have :meth:`__enter__` and :meth:`__exit__`
  methods.

* The context manager's :meth:`__enter__` method is called.  The value returned
  is assigned to *VAR*.  If no ``as VAR`` clause is present, the value is simply
  discarded.

* The code in *BLOCK* is executed.

* If *BLOCK* raises an exception, the :meth:`__exit__(type, value, traceback)`
  is called with the exception details, the same values returned by
  :func:`sys.exc_info`.  The method's return value controls whether the exception
  is re-raised: any false value re-raises the exception, and ``True`` will result
  in suppressing it.  You'll only rarely want to suppress the exception, because
  if you do the author of the code containing the ':keyword:`with`' statement will
  never realize anything went wrong.

* If *BLOCK* didn't raise an exception,  the :meth:`__exit__` method is still
  called, but *type*, *value*, and *traceback* are all ``None``.

Let's think through an example.  I won't present detailed code but will only
sketch the methods necessary for a database that supports transactions.

(For people unfamiliar with database terminology: a set of changes to the
database are grouped into a transaction.  Transactions can be either committed,
meaning that all the changes are written into the database, or rolled back,
meaning that the changes are all discarded and the database is unchanged.  See
any database textbook for more information.)

Let's assume there's an object representing a database connection. Our goal will
be to let the user write code like this::

   db_connection = DatabaseConnection()
   with db_connection as cursor:
       cursor.execute('insert into ...')
       cursor.execute('delete from ...')
       # ... more operations ...

The transaction should be committed if the code in the block runs flawlessly or
rolled back if there's an exception. Here's the basic interface for
:class:`DatabaseConnection` that I'll assume::

   class DatabaseConnection:
       # Database interface
       def cursor(self):
           "Returns a cursor object and starts a new transaction"
       def commit(self):
           "Commits current transaction"
       def rollback(self):
           "Rolls back current transaction"

The :meth:`__enter__` method is pretty easy, having only to start a new
transaction.  For this application the resulting cursor object would be a useful
result, so the method will return it.  The user can then add ``as cursor`` to
their ':keyword:`with`' statement to bind the cursor to a variable name. ::

   class DatabaseConnection:
       ...
       def __enter__(self):
           # Code to start a new transaction
           cursor = self.cursor()
           return cursor

The :meth:`__exit__` method is the most complicated because it's where most of
the work has to be done.  The method has to check if an exception occurred.  If
there was no exception, the transaction is committed.  The transaction is rolled
back if there was an exception.

In the code below, execution will just fall off the end of the function,
returning the default value of ``None``.  ``None`` is false, so the exception
will be re-raised automatically.  If you wished, you could be more explicit and
add a :keyword:`return` statement at the marked location. ::

   class DatabaseConnection:
       ...
       def __exit__(self, type, value, tb):
           if tb is None:
               # No exception, so commit
               self.commit()
           else:
               # Exception occurred, so rollback.
               self.rollback()
               # return False


.. _new-module-contextlib:

The contextlib module
---------------------

The :mod:`contextlib` module provides some functions and a decorator that
are useful when 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.

Using this decorator, our database example from the previous section
could be written as::

   from contextlib import contextmanager

   @contextmanager
   def db_transaction(connection):
       cursor = connection.cursor()
       try:
           yield cursor
       except:
           connection.rollback()
           raise
       else:
           connection.commit()

   db = DatabaseConnection()
   with db_transaction(db) as cursor:
       ...

The :mod:`contextlib` module also has a :func:`nested(mgr1, mgr2, ...)` function
that combines a number of context managers so you don't need to write nested
':keyword:`with`' statements.  In this example, the single ':keyword:`with`'
statement both starts a database transaction and acquires a thread lock::

   lock = threading.Lock()
   with nested (db_transaction(db), lock) as (cursor, locked):
       ...

Finally, the :func:`closing(object)` function returns *object* so that it can be
bound to a variable, and calls ``object.close`` at the end of the block. ::

   import urllib, sys
   from contextlib import closing

   with closing(urllib.urlopen('http://www.yahoo.com')) as f:
       for line in f:
           sys.stdout.write(line)


.. seealso::

   :pep:`343` - The "with" statement
      PEP written by Guido van Rossum and Nick Coghlan; implemented by Mike Bland,
      Guido van Rossum, and Neal Norwitz.  The PEP shows the code generated for a
      ':keyword:`with`' statement, which can be helpful in learning how the statement
      works.

   The documentation  for the :mod:`contextlib` module.

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

.. _pep-0366:

PEP 366: Explicit Relative Imports From a Main Module
============================================================

Python's :option:`-m` switch allows running a module as a script.
When you ran a module that was located inside a package, relative
imports didn't work correctly.

The fix for Python 2.6 adds a :attr:`__package__` attribute to
modules.  When this attribute is present, relative imports will be
relative to the value of this attribute instead of the
:attr:`__name__` attribute.

PEP 302-style importers can then set :attr:`__package__` as necessary.
The :mod:`runpy` module that implements the :option:`-m` switch now
does this, so relative imports will now work correctly in scripts
running from inside a package.

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

.. _pep-0370:

PEP 370: Per-user ``site-packages`` Directory
=====================================================

When you run Python, the module search path ``sys.path`` usually
includes a directory whose path ends in ``"site-packages"``.  This
directory is intended to hold locally-installed packages available to
all users using a machine or a particular site installation.

Python 2.6 introduces a convention for user-specific site directories.
The directory varies depending on the platform:

* Unix and Mac OS X: :file:`~/.local/`
* Windows: :file:`%APPDATA%/Python`

Within this directory, there will be version-specific subdirectories,
such as :file:`lib/python2.6/site-packages` on Unix/Mac OS and
:file:`Python26/site-packages` on Windows.

If you don't like the default directory, it can be overridden by an
environment variable.  :envvar:`PYTHONUSERBASE` sets the root
directory used for all Python versions supporting this feature.  On
Windows, the directory for application-specific data can be changed by
setting the :envvar:`APPDATA` environment variable.  You can also
modify the :file:`site.py` file for your Python installation.

The feature can be disabled entirely by running Python with the
:option:`-s` option or setting the :envvar:`PYTHONNOUSERSITE`
environment variable.

.. seealso::

   :pep:`370` - Per-user ``site-packages`` Directory
     PEP written and implemented by Christian Heimes.


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

.. _pep-0371:

PEP 371: The ``multiprocessing`` Package
=====================================================

The new :mod:`multiprocessing` package lets Python programs create new
processes that will perform a computation and return a result to the
parent.  The parent and child processes can communicate using queues
and pipes, synchronize their operations using locks and semaphores,
and can share simple arrays of data.

The :mod:`multiprocessing` module started out as an exact emulation of
the :mod:`threading` module using processes instead of threads.  That
goal was discarded along the path to Python 2.6, but the general
approach of the module is still similar.  The fundamental class
is the :class:`Process`, which is passed a callable object and
a collection of arguments.  The :meth:`start` method
sets the callable running in a subprocess, after which you can call
the :meth:`is_alive` method to check whether the subprocess is still running
and the :meth:`join` method to wait for the process to exit.

Here's a simple example where the subprocess will calculate a
factorial.  The function doing the calculation is written strangely so
that it takes significantly longer when the input argument is a
multiple of 4.

::

    import time
    from multiprocessing import Process, Queue


    def factorial(queue, N):
        "Compute a factorial."
        # If N is a multiple of 4, this function will take much longer.
        if (N % 4) == 0:
            time.sleep(.05 * N/4)

        # Calculate the result
        fact = 1L
        for i in range(1, N+1):
            fact = fact * i

        # Put the result on the queue
        queue.put(fact)

    if __name__ == '__main__':
        queue = Queue()

        N = 5

        p = Process(target=factorial, args=(queue, N))
        p.start()
        p.join()

        result = queue.get()
        print 'Factorial', N, '=', result

A :class:`Queue` is used to communicate the input parameter *N* and
the result.  The :class:`Queue` object is stored in a global variable.
The child process will use the value of the variable when the child
was created; because it's a :class:`Queue`, parent and child can use
the object to communicate.  (If the parent were to change the value of
the global variable, the child's value would be unaffected, and vice
versa.)

Two other classes, :class:`Pool` and :class:`Manager`, provide
higher-level interfaces.  :class:`Pool` will create a fixed number of
worker processes, and requests can then be distributed to the workers
by calling :meth:`apply` or :meth:`apply_async` to add a single request,
and :meth:`map` or :meth:`map_async` to add a number of
requests.  The following code uses a :class:`Pool` to spread requests
across 5 worker processes and retrieve a list of results::

    from multiprocessing import Pool

    def factorial(N, dictionary):
        "Compute a factorial."
        ...
    p = Pool(5)
    result = p.map(factorial, range(1, 1000, 10))
    for v in result:
        print v

This produces the following output::

    1
    39916800
    51090942171709440000
    8222838654177922817725562880000000
    33452526613163807108170062053440751665152000000000
    ...

The other high-level interface, the :class:`Manager` class, creates a
separate server process that can hold master copies of Python data
structures.  Other processes can then access and modify these data
structures using proxy objects.  The following example creates a
shared dictionary by calling the :meth:`dict` method; the worker
processes then insert values into the dictionary.  (Locking is not
done for you automatically, which doesn't matter in this example.
:class:`Manager`'s methods also include :meth:`Lock`, :meth:`RLock`,
and :meth:`Semaphore` to create shared locks.)

::

    import time
    from multiprocessing import Pool, Manager

    def factorial(N, dictionary):
        "Compute a factorial."
        # Calculate the result
        fact = 1L
        for i in range(1, N+1):
            fact = fact * i

        # Store result in dictionary
        dictionary[N] = fact

    if __name__ == '__main__':
        p = Pool(5)
        mgr = Manager()
        d = mgr.dict()         # Create shared dictionary

        # Run tasks using the pool
        for N in range(1, 1000, 10):
            p.apply_async(factorial, (N, d))

        # Mark pool as closed -- no more tasks can be added.
        p.close()

        # Wait for tasks to exit
        p.join()

        # Output results
        for k, v in sorted(d.items()):
            print k, v

This will produce the output::

    1 1
    11 39916800
    21 51090942171709440000
    31 8222838654177922817725562880000000
    41 33452526613163807108170062053440751665152000000000
    51 15511187532873822802242430164693032110632597200169861120000...

.. seealso::

   The documentation for the :mod:`multiprocessing` module.

   :pep:`371` - Addition of the multiprocessing package
     PEP written by Jesse Noller and Richard Oudkerk;
     implemented by Richard Oudkerk and Jesse Noller.


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

.. _pep-3101:

PEP 3101: Advanced String Formatting
=====================================================

In Python 3.0, the `%` operator is supplemented by a more powerful string
formatting method, :meth:`format`.  Support for the :meth:`str.format` method
has been backported to Python 2.6.

In 2.6, both 8-bit and Unicode strings have a `.format()` method that
treats the string as a template and takes the arguments to be formatted.
The formatting template uses curly brackets (`{`, `}`) as special characters::

     >>> # Substitute positional argument 0 into the string.
     >>> "User ID: {0}".format("root")
     'User ID: root'
     >>> # Use the named keyword arguments
     >>> "User ID: {uid}   Last seen: {last_login}".format(
     ...    uid="root",
     ...    last_login = "5 Mar 2008 07:20")
     'User ID: root   Last seen: 5 Mar 2008 07:20'

Curly brackets can be escaped by doubling them::

     >>> "Empty dict: {{}}".format()
     "Empty dict: {}"

Field names can be integers indicating positional arguments, such as
``{0}``, ``{1}``, etc. or names of keyword arguments.  You can also
supply compound field names that read attributes or access dictionary keys::

    >>> import sys
    >>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
    Platform: darwin
    Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41)
    [GCC 4.0.1 (Apple Computer, Inc. build 5367)]'

    >>> import mimetypes
    >>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)
    'Content-type: video/mp4'

Note that when using dictionary-style notation such as ``[.mp4]``, you
don't need to put any quotation marks around the string; it will look
up the value using ``.mp4`` as the key.  Strings beginning with a
number will be converted to an integer.  You can't write more
complicated expressions inside a format string.

So far we've shown how to specify which field to substitute into the
resulting string.  The precise formatting used is also controllable by
adding a colon followed by a format specifier.  For example::

     >>> # Field 0: left justify, pad to 15 characters
     >>> # Field 1: right justify, pad to 6 characters
     >>> fmt = '{0:15} ${1:>6}'
     >>> fmt.format('Registration', 35)
     'Registration    $    35'
     >>> fmt.format('Tutorial', 50)
     'Tutorial        $    50'
     >>> fmt.format('Banquet', 125)
     'Banquet         $   125'

Format specifiers can reference other fields through nesting::

    >>> fmt = '{0:{1}}'
    >>> width = 15
    >>> fmt.format('Invoice #1234', width)
    'Invoice #1234  '
    >>> width = 35
    >>> fmt.format('Invoice #1234', width)
    'Invoice #1234                      '

The alignment of a field within the desired width can be specified:

================ ============================================
Character        Effect
================ ============================================
< (default)      Left-align
>                Right-align
^                Center
=                (For numeric types only) Pad after the sign.
================ ============================================

Format specifiers can also include a presentation type, which
controls how the value is formatted.  For example, floating-point numbers
can be formatted as a general number or in exponential notation::

    >>> '{0:g}'.format(3.75)
    '3.75'
    >>> '{0:e}'.format(3.75)
    '3.750000e+00'

A variety of presentation types are available.  Consult the 2.6
documentation for a :ref:`complete list <formatstrings>`; here's a sample:

===== ========================================================================
``b`` Binary. Outputs the number in base 2.
``c`` Character. Converts the integer to the corresponding Unicode character
      before printing.
``d`` Decimal Integer. Outputs the number in base 10.
``o`` Octal format. Outputs the number in base 8.
``x`` Hex format. Outputs the number in base 16, using lower-case letters for
      the digits above 9.
``e`` Exponent notation. Prints the number in scientific notation using the
      letter 'e' to indicate the exponent.
``g`` General format. This prints the number as a fixed-point number, unless
      the number is too large, in which case it switches to 'e' exponent
      notation.
``n`` Number. This is the same as 'g' (for floats) or 'd' (for integers),
      except that it uses the current locale setting to insert the appropriate
      number separator characters.
``%`` Percentage. Multiplies the number by 100 and displays in fixed ('f')
      format, followed by a percent sign.
===== ========================================================================

Classes and types can define a :meth:`__format__` method to control how they're
formatted.  It receives a single argument, the format specifier::

   def __format__(self, format_spec):
       if isinstance(format_spec, unicode):
           return unicode(str(self))
       else:
           return str(self)

There's also a :func:`format` built-in that will format a single
value.  It calls the type's :meth:`__format__` method with the
provided specifier::

    >>> format(75.6564, '.2f')
    '75.66'


.. seealso::

   :ref:`formatstrings`
      The reference documentation for format fields.

   :pep:`3101` - Advanced String Formatting
      PEP written by Talin. Implemented by Eric Smith.

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

.. _pep-3105:

PEP 3105: ``print`` As a Function
=====================================================

The ``print`` statement becomes the :func:`print` function in Python 3.0.
Making :func:`print` a function makes it possible to replace the function
by doing ``def print(...)`` or importing a new function from somewhere else.

Python 2.6 has a ``__future__`` import that removes ``print`` as language
syntax, letting you use the functional form instead.  For example::

    >>> from __future__ import print_function
    >>> print('# of entries', len(dictionary), file=sys.stderr)

The signature of the new function is::

    def print(*args, sep=' ', end='\n', file=None)


The parameters are:

 * *args*: positional arguments whose values will be printed out.
 * *sep*: the separator, which will be printed between arguments.
 * *end*: the ending text, which will be printed after all of the
   arguments have been output.
 * *file*: the file object to which the output will be sent.

.. seealso::

   :pep:`3105` - Make print a function
      PEP written by Georg Brandl.

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

.. _pep-3110:

PEP 3110: Exception-Handling Changes
=====================================================

One error that Python programmers occasionally make
is writing the following code::

    try:
        ...
    except TypeError, ValueError:  # Wrong!
        ...

The author is probably trying to catch both :exc:`TypeError` and
:exc:`ValueError` exceptions, but this code actually does something
different: it will catch :exc:`TypeError` and bind the resulting
exception object to the local name ``"ValueError"``.  The
:exc:`ValueError` exception will not be caught at all.  The correct
code specifies a tuple of exceptions::

    try:
        ...
    except (TypeError, ValueError):
        ...

This error happens because the use of the comma here is ambiguous:
does it indicate two different nodes in the parse tree, or a single
node that's a tuple?

Python 3.0 makes this unambiguous by replacing the comma with the word
"as".  To catch an exception and store the exception object in the
variable ``exc``, you must write::

    try:
        ...
    except TypeError as exc:
        ...

Python 3.0 will only support the use of "as", and therefore interprets
the first example as catching two different exceptions.  Python 2.6
supports both the comma and "as", so existing code will continue to
work.  We therefore suggest using "as" when writing new Python code
that will only be executed with 2.6.

.. seealso::

   :pep:`3110` - Catching Exceptions in Python 3000
      PEP written and implemented by Collin Winter.

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

.. _pep-3112:

PEP 3112: Byte Literals
=====================================================

Python 3.0 adopts Unicode as the language's fundamental string type and
denotes 8-bit literals differently, either as ``b'string'``
or using a :class:`bytes` constructor.  For future compatibility,
Python 2.6 adds :class:`bytes` as a synonym for the :class:`str` type,
and it also supports the ``b''`` notation.


The 2.6 :class:`str` differs from 3.0's :class:`bytes` type in various
ways; most notably, the constructor is completely different.  In 3.0,
``bytes([65, 66, 67])`` is 3 elements long, containing the bytes
representing ``ABC``; in 2.6, ``bytes([65, 66, 67])`` returns the
12-byte string representing the :func:`str` of the list.

The primary use of :class:`bytes` in 2.6 will be to write tests of
object type such as ``isinstance(x, bytes)``.  This will help the 2to3
converter, which can't tell whether 2.x code intends strings to
contain either characters or 8-bit bytes; you can now
use either :class:`bytes` or :class:`str` to represent your intention
exactly, and the resulting code will also be correct in Python 3.0.

There's also a ``__future__`` import that causes all string literals
to become Unicode strings.  This means that ``\u`` escape sequences
can be used to include Unicode characters::


    from __future__ import unicode_literals

    s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
         '\u3081\u3000\u751f\u305f\u307e\u3054')

    print len(s)               # 12 Unicode characters

At the C level, Python 3.0 will rename the existing 8-bit
string type, called :ctype:`PyStringObject` in Python 2.x,
to :ctype:`PyBytesObject`.  Python 2.6 uses ``#define``
to support using the names :cfunc:`PyBytesObject`,
:cfunc:`PyBytes_Check`, :cfunc:`PyBytes_FromStringAndSize`,
and all the other functions and macros used with strings.

Instances of the :class:`bytes` type are immutable just
as strings are.  A new :class:`bytearray` type stores a mutable
sequence of bytes::

    >>> bytearray([65, 66, 67])
    bytearray(b'ABC')
    >>> b = bytearray(u'\u21ef\u3244', 'utf-8')
    >>> b
    bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
    >>> b[0] = '\xe3'
    >>> b
    bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
    >>> unicode(str(b), 'utf-8')
    u'\u31ef \u3244'

Byte arrays support most of the methods of string types, such as
:meth:`startswith`/:meth:`endswith`, :meth:`find`/:meth:`rfind`,
and some of the methods of lists, such as :meth:`append`,
:meth:`pop`,  and :meth:`reverse`.

::

    >>> b = bytearray('ABC')
    >>> b.append('d')
    >>> b.append(ord('e'))
    >>> b
    bytearray(b'ABCde')

There's also a corresponding C API, with
:cfunc:`PyByteArray_FromObject`,
:cfunc:`PyByteArray_FromStringAndSize`,
and various other functions.

.. seealso::

   :pep:`3112` - Bytes literals in Python 3000
      PEP written by Jason Orendorff; backported to 2.6 by Christian Heimes.

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

.. _pep-3116:

PEP 3116: New I/O Library
=====================================================

Python's built-in file objects support a number of methods, but
file-like objects don't necessarily support all of them.  Objects that
imitate files usually support :meth:`read` and :meth:`write`, but they
may not support :meth:`readline`, for example.  Python 3.0 introduces
a layered I/O library in the :mod:`io` module that separates buffering
and text-handling features from the fundamental read and write
operations.

There are three levels of abstract base classes provided by
the :mod:`io` module:

* :class:`RawIOBase` defines raw I/O operations: :meth:`read`,
  :meth:`readinto`,
  :meth:`write`, :meth:`seek`, :meth:`tell`, :meth:`truncate`,
  and :meth:`close`.
  Most of the methods of this class will often map to a single system call.
  There are also :meth:`readable`, :meth:`writable`, and :meth:`seekable`
  methods for determining what operations a given object will allow.

  Python 3.0 has concrete implementations of this class for files and
  sockets, but Python 2.6 hasn't restructured its file and socket objects
  in this way.

  .. XXX should 2.6 register them in io.py?

* :class:`BufferedIOBase` is an abstract base class that
  buffers data in memory to reduce the number of
  system calls used, making I/O processing more efficient.
  It supports all of the methods of :class:`RawIOBase`,
  and adds a :attr:`raw` attribute holding the underlying raw object.

  There are five concrete classes implementing this ABC.
  :class:`BufferedWriter` and :class:`BufferedReader` are for objects
  that support write-only or read-only usage that have a :meth:`seek`
  method for random access.  :class:`BufferedRandom` objects support
  read and write access upon the same underlying stream, and
  :class:`BufferedRWPair` is for objects such as TTYs that have both
  read and write operations acting upon unconnected streams of data.
  The :class:`BytesIO` class supports reading, writing, and seeking
  over an in-memory buffer.

* :class:`TextIOBase`: Provides functions for reading and writing
  strings (remember, strings will be Unicode in Python 3.0),
  and supporting universal newlines.  :class:`TextIOBase` defines
  the :meth:`readline` method and supports iteration upon
  objects.

  There are two concrete implementations.  :class:`TextIOWrapper`
  wraps a buffered I/O object, supporting all of the methods for
  text I/O and adding a :attr:`buffer` attribute for access
  to the underlying object.  :class:`StringIO` simply buffers
  everything in memory without ever writing anything to disk.

  (In Python 2.6, :class:`io.StringIO` is implemented in
  pure Python, so it's pretty slow.   You should therefore stick with the
  existing :mod:`StringIO` module or :mod:`cStringIO` for now.  At some
  point Python 3.0's :mod:`io` module will be rewritten into C for speed,
  and perhaps the C implementation will be  backported to the 2.x releases.)

In Python 2.6, the underlying implementations haven't been
restructured to build on top of the :mod:`io` module's classes.  The
module is being provided to make it easier to write code that's
forward-compatible with 3.0, and to save developers the effort of writing
their own implementations of buffering and text I/O.

.. seealso::

   :pep:`3116` - New I/O
      PEP written by Daniel Stutzbach, Mike Verdone, and Guido van Rossum.
      Code by Guido van Rossum, Georg Brandl, Walter Doerwald,
      Jeremy Hylton, Martin von Loewis, Tony Lownds, and others.

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

.. _pep-3118:

PEP 3118: Revised Buffer Protocol
=====================================================

The buffer protocol is a C-level API that lets Python types
exchange pointers into their internal representations.  A
memory-mapped file can be viewed as a buffer of characters, for
example, and this lets another module such as :mod:`re`
treat memory-mapped files as a string of characters to be searched.

The primary users of the buffer protocol are numeric-processing
packages such as NumPy, which expose the internal representation
of arrays so that callers can write data directly into an array instead
of going through a slower API.  This PEP updates the buffer protocol in light of experience
from NumPy development, adding a number of new features
such as indicating the shape of an array or locking a memory region.

The most important new C API function is
``PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)``, which
takes an object and a set of flags, and fills in the
``Py_buffer`` structure with information
about the object's memory representation.  Objects
can use this operation to lock memory in place
while an external caller could be modifying the contents,
so there's a corresponding ``PyBuffer_Release(Py_buffer *view)`` to
indicate that the external caller is done.

.. XXX PyObject_GetBuffer not documented in c-api

The *flags* argument to :cfunc:`PyObject_GetBuffer` specifies
constraints upon the memory returned.  Some examples are:

 * :const:`PyBUF_WRITABLE` indicates that the memory must be writable.

 * :const:`PyBUF_LOCK` requests a read-only or exclusive lock on the memory.

 * :const:`PyBUF_C_CONTIGUOUS` and :const:`PyBUF_F_CONTIGUOUS`
   requests a C-contiguous (last dimension varies the fastest) or
   Fortran-contiguous (first dimension varies the fastest) array layout.

Two new argument codes for :cfunc:`PyArg_ParseTuple`,
``s*`` and ``z*``, return locked buffer objects for a parameter.

.. seealso::

   :pep:`3118` - Revising the buffer protocol
      PEP written by Travis Oliphant and Carl Banks; implemented by
      Travis Oliphant.


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

.. _pep-3119:

PEP 3119: Abstract Base Classes
=====================================================

Some object-oriented languages such as Java support interfaces,
declaring that a class has a given set of methods or supports a given
access protocol.  Abstract Base Classes (or ABCs) are an equivalent
feature for Python. The ABC support consists of an :mod:`abc` module
containing a metaclass called :class:`ABCMeta`, special handling of
this metaclass by the :func:`isinstance` and :func:`issubclass`
built-ins, and a collection of basic ABCs that the Python developers
think will be widely useful.  Future versions of Python will probably
add more ABCs.

Let's say you have a particular class and wish to know whether it supports
dictionary-style access.  The phrase "dictionary-style" is vague, however.
It probably means that accessing items with ``obj[1]`` works.
Does it imply that setting items with ``obj[2] = value`` works?
Or that the object will have :meth:`keys`, :meth:`values`, and :meth:`items`
methods?  What about the iterative variants  such as :meth:`iterkeys`?  :meth:`copy`
and :meth:`update`?  Iterating over the object with :func:`iter`?

The Python 2.6 :mod:`collections` module includes a number of
different ABCs that represent these distinctions.  :class:`Iterable`
indicates that a class defines :meth:`__iter__`, and
:class:`Container` means the class defines a :meth:`__contains__`
method and therefore supports ``x in y`` expressions.  The basic
dictionary interface of getting items, setting items, and
:meth:`keys`, :meth:`values`, and :meth:`items`, is defined by the
:class:`MutableMapping` ABC.

You can derive your own classes from a particular ABC
to indicate they support that ABC's interface::

    import collections

    class Storage(collections.MutableMapping):
        ...


Alternatively, you could write the class without deriving from
the desired ABC and instead register the class by
calling the ABC's :meth:`register` method::

    import collections

    class Storage:
        ...

    collections.MutableMapping.register(Storage)

For classes that you write, deriving from the ABC is probably clearer.
The :meth:`register`  method is useful when you've written a new
ABC that can describe an existing type or class, or if you want
to declare that some third-party class implements an ABC.
For example, if you defined a :class:`PrintableType` ABC,
it's legal to do::

  # Register Python's types
  PrintableType.register(int)
  PrintableType.register(float)
  PrintableType.register(str)

Classes should obey the semantics specified by an ABC, but
Python can't check this; it's up to the class author to
understand the ABC's requirements and to implement the code accordingly.

To check whether an object supports a particular interface, you can
now write::

    def func(d):
        if not isinstance(d, collections.MutableMapping):
            raise ValueError("Mapping object expected, not %r" % d)

Don't feel that you must now begin writing lots of checks as in the
above example.  Python has a strong tradition of duck-typing, where
explicit type-checking is never done and code simply calls methods on
an object, trusting that those methods will be there and raising an
exception if they aren't.  Be judicious in checking for ABCs and only
do it where it's absolutely necessary.

You can write your own ABCs by using ``abc.ABCMeta`` as the
metaclass in a class definition::

    from abc import ABCMeta, abstractmethod

    class Drawable():
        __metaclass__ = ABCMeta

        @abstractmethod
        def draw(self, x, y, scale=1.0):
            pass

        def draw_doubled(self, x, y):
            self.draw(x, y, scale=2.0)


    class Square(Drawable):
        def draw(self, x, y, scale):
            ...


In the :class:`Drawable` ABC above, the :meth:`draw_doubled` method
renders the object at twice its size and can be implemented in terms
of other methods described in :class:`Drawable`.  Classes implementing
this ABC therefore don't need to provide their own implementation
of :meth:`draw_doubled`, though they can do so.  An implementation
of :meth:`draw` is necessary, though; the ABC can't provide
a useful generic implementation.

You can apply the ``@abstractmethod`` decorator to methods such as
:meth:`draw` that must be implemented; Python will then raise an
exception for classes that don't define the method.
Note that the exception is only raised when you actually
try to create an instance of a subclass lacking the method::

    >>> class Circle(Drawable):
    ...     pass
    ...
    >>> c = Circle()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Can't instantiate abstract class Circle with abstract methods draw
    >>>

Abstract data attributes can be declared using the
``@abstractproperty`` decorator::

    from abc import abstractproperty
    ...

    @abstractproperty
    def readonly(self):
       return self._x

Subclasses must then define a :meth:`readonly` property.

.. seealso::

   :pep:`3119` - Introducing Abstract Base Classes
      PEP written by Guido van Rossum and Talin.
      Implemented by Guido van Rossum.
      Backported to 2.6 by Benjamin Aranguren, with Alex Martelli.

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

.. _pep-3127:

PEP 3127: Integer Literal Support and Syntax
=====================================================

Python 3.0 changes the syntax for octal (base-8) integer literals,
prefixing them with "0o" or "0O" instead of a leading zero, and adds
support for binary (base-2) integer literals, signalled by a "0b" or
"0B" prefix.

Python 2.6 doesn't drop support for a leading 0 signalling
an octal number, but it does add support for "0o" and "0b"::

    >>> 0o21, 2*8 + 1
    (17, 17)
    >>> 0b101111
    47

The :func:`oct` built-in still returns numbers
prefixed with a leading zero, and a new :func:`bin`
built-in returns the binary representation for a number::

    >>> oct(42)
    '052'
    >>> future_builtins.oct(42)
    '0o52'
    >>> bin(173)
    '0b10101101'

The :func:`int` and :func:`long` built-ins will now accept the "0o"
and "0b" prefixes when base-8 or base-2 are requested, or when the
*base* argument is zero (signalling that the base used should be
determined from the string)::

    >>> int ('0o52', 0)
    42
    >>> int('1101', 2)
    13
    >>> int('0b1101', 2)
    13
    >>> int('0b1101', 0)
    13


.. seealso::

   :pep:`3127` - Integer Literal Support and Syntax
      PEP written by Patrick Maupin; backported to 2.6 by
      Eric Smith.

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

.. _pep-3129:

PEP 3129: Class Decorators
=====================================================

Decorators have been extended from functions to classes.  It's now legal to
write::

  @foo
  @bar
  class A:
    pass

This is equivalent to::

  class A:
    pass

  A = foo(bar(A))

.. seealso::

   :pep:`3129` - Class Decorators
      PEP written by Collin Winter.

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

.. _pep-3141:

PEP 3141: A Type Hierarchy for Numbers
=====================================================

Python 3.0 adds several abstract base classes for numeric types
inspired by Scheme's numeric tower.  These classes were backported to
2.6 as the :mod:`numbers` module.

The most general ABC is :class:`Number`.  It defines no operations at
all, and only exists to allow checking if an object is a number by
doing ``isinstance(obj, Number)``.

:class:`Complex` is a subclass of :class:`Number`.  Complex numbers
can undergo the basic operations of addition, subtraction,
multiplication, division, and exponentiation, and you can retrieve the
real and imaginary parts and obtain a number's conjugate.  Python's built-in
complex type is an implementation of :class:`Complex`.

:class:`Real` further derives from :class:`Complex`, and adds
operations that only work on real numbers: :func:`floor`, :func:`trunc`,
rounding, taking the remainder mod N, floor division,
and comparisons.

:class:`Rational` numbers derive from :class:`Real`, have
:attr:`numerator` and :attr:`denominator` properties, and can be
converted to floats.  Python 2.6 adds a simple rational-number class,
:class:`Fraction`, in the :mod:`fractions` module.  (It's called
:class:`Fraction` instead of :class:`Rational` to avoid
a name clash with :class:`numbers.Rational`.)

:class:`Integral` numbers derive from :class:`Rational`, and
can be shifted left and right with ``<<`` and ``>>``,
combined using bitwise operations such as ``&`` and ``|``,
and can be used as array indexes and slice boundaries.

In Python 3.0, the PEP slightly redefines the existing built-ins
:func:`round`, :func:`math.floor`, :func:`math.ceil`, and adds a new
one, :func:`math.trunc`, that's been backported to Python 2.6.
:func:`math.trunc` rounds toward zero, returning the closest
:class:`Integral` that's between the function's argument and zero.

.. seealso::

   :pep:`3141` - A Type Hierarchy for Numbers
      PEP written by Jeffrey Yasskin.

   `Scheme's numerical tower <http://www.gnu.org/software/guile/manual/html_node/Numerical-Tower.html#Numerical-Tower>`__, from the Guile manual.

   `Scheme's number datatypes <http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_sec_6.2>`__ from the R5RS Scheme specification.


The :mod:`fractions` Module
--------------------------------------------------

To fill out the hierarchy of numeric types, the :mod:`fractions`
module provides a rational-number class.  Rational numbers store their
values as a numerator and denominator forming a fraction, and can
exactly represent numbers such as ``2/3`` that floating-point numbers
can only approximate.

The :class:`Fraction` constructor takes two :class:`Integral` values
that will be the numerator and denominator of the resulting fraction. ::

    >>> from fractions import Fraction
    >>> a = Fraction(2, 3)
    >>> b = Fraction(2, 5)
    >>> float(a), float(b)
    (0.66666666666666663, 0.40000000000000002)
    >>> a+b
    Fraction(16, 15)
    >>> a/b
    Fraction(5, 3)

For converting floating-point numbers to rationals,
the float type now has an :meth:`as_integer_ratio()` method that returns
the numerator and denominator for a fraction that evaluates to the same
floating-point value::

    >>> (2.5) .as_integer_ratio()
    (5, 2)
    >>> (3.1415) .as_integer_ratio()
    (7074029114692207L, 2251799813685248L)
    >>> (1./3) .as_integer_ratio()
    (6004799503160661L, 18014398509481984L)

Note that values that can only be approximated by floating-point
numbers, such as 1./3, are not simplified to the number being
approximated; the fraction attempts to match the floating-point value
**exactly**.

The :mod:`fractions` module is based upon an implementation by Sjoerd
Mullender that was in Python's :file:`Demo/classes/` directory for a
long time.  This implementation was significantly updated by Jeffrey
Yasskin.


Other Language Changes
======================

Some smaller changes made to the core Python language are:

* The :func:`hasattr` function was catching and ignoring all errors,
  under the assumption that they meant a :meth:`__getattr__` method
  was failing somehow and the return value of :func:`hasattr` would
  therefore be ``False``.  This logic shouldn't be applied to
  :exc:`KeyboardInterrupt` and :exc:`SystemExit`, however; Python 2.6
  will no longer discard such exceptions when :func:`hasattr`
  encounters them.  (Fixed by Benjamin Peterson; :issue:`2196`.)

* When calling a function using the ``**`` syntax to provide keyword
  arguments, you are no longer required to use a Python dictionary;
  any mapping will now work::

    >>> def f(**kw):
    ...    print sorted(kw)
    ...
    >>> ud=UserDict.UserDict()
    >>> ud['a'] = 1
    >>> ud['b'] = 'string'
    >>> f(**ud)
    ['a', 'b']

  (Contributed by Alexander Belopolsky; :issue:`1686487`.)

  It's also become legal to provide keyword arguments after a ``*args`` argument
  to a function call. ::

    >>> def f(*args, **kw):
    ...     print args, kw
    ...
    >>> f(1,2,3, *(4,5,6), keyword=13)
    (1, 2, 3, 4, 5, 6) {'keyword': 13}

  Previously this would have been a syntax error.
  (Contributed by Amaury Forgeot d'Arc; :issue:`3473`.)

* A new built-in, ``next(iterator, [default])`` returns the next item
  from the specified iterator.  If the *default* argument is supplied,
  it will be returned if *iterator* has been exhausted; otherwise,
  the :exc:`StopIteration` exception will be raised.  (Backported
  in :issue:`2719`.)

* Tuples now have :meth:`index` and :meth:`count` methods matching the
  list type's :meth:`index` and :meth:`count` methods::

    >>> t = (0,1,2,3,4,0,1,2)
    >>> t.index(3)
    3
    >>> t.count(0)
    2

  (Contributed by Raymond Hettinger)

* The built-in types now have improved support for extended slicing syntax,
  accepting various combinations of ``(start, stop, step)``.
  Previously, the support was partial and certain corner cases wouldn't work.
  (Implemented by Thomas Wouters.)

  .. Revision 57619

* Properties now have three attributes, :attr:`getter`, :attr:`setter`
  and :attr:`deleter`, that are decorators providing useful shortcuts
  for adding a getter, setter or deleter function to an existing
  property. You would use them like this::

    class C(object):
        @property
        def x(self):
            return self._x

        @x.setter
        def x(self, value):
            self._x = value

        @x.deleter
        def x(self):
            del self._x

    class D(C):
        @C.x.getter
        def x(self):
            return self._x * 2

        @x.setter
        def x(self, value):
            self._x = value / 2

* Several methods of the built-in set types now accept multiple iterables:
  :meth:`intersection`,
  :meth:`intersection_update`,
  :meth:`union`, :meth:`update`,
  :meth:`difference` and :meth:`difference_update`.

  ::

    >>> s=set('1234567890')
    >>> s.intersection('abc123', 'cdf246')  # Intersection between all inputs
    set(['2'])
    >>> s.difference('246', '789')
    set(['1', '0', '3', '5'])

  (Contributed by Raymond Hettinger.)

* Many floating-point features were added.  The :func:`float` function
  will now turn the string ``nan`` into an
  IEEE 754 Not A Number value, and ``+inf`` and ``-inf`` into
  positive or negative infinity.  This works on any platform with
  IEEE 754 semantics.  (Contributed by Christian Heimes; :issue:`1635`.)

  Other functions in the :mod:`math` module, :func:`isinf` and
  :func:`isnan`, return true if their floating-point argument is
  infinite or Not A Number.  (:issue:`1640`)

  Conversion functions were added to convert floating-point numbers
  into hexadecimal strings (:issue:`3008`).  These functions
  convert floats to and from a string representation without
  introducing rounding errors from the conversion between decimal and
  binary.  Floats have a :meth:`hex` method that returns a string
  representation, and the ``float.fromhex()`` method converts a string
  back into a number::

      >>> a = 3.75
      >>> a.hex()
      '0x1.e000000000000p+1'
      >>> float.fromhex('0x1.e000000000000p+1')
      3.75
      >>> b=1./3
      >>> b.hex()
      '0x1.5555555555555p-2'

* A numerical nicety: when creating a complex number from two floats
  on systems that support signed zeros (-0 and +0), the
  :func:`complex` constructor will now preserve the sign
  of the zero.  (Fixed by Mark T. Dickinson; :issue:`1507`.)

* Classes that inherit a :meth:`__hash__` method from a parent class
  can set ``__hash__ = None`` to indicate that the class isn't
  hashable.  This will make ``hash(obj)`` raise a :exc:`TypeError`
  and the class will not be indicated as implementing the
  :class:`Hashable` ABC.

  You should do this when you've defined a :meth:`__cmp__` or
  :meth:`__eq__` method that compares objects by their value rather
  than by identity.  All objects have a default hash method that uses
  ``id(obj)`` as the hash value.  There's no tidy way to remove the
  :meth:`__hash__` method inherited from a parent class, so
  assigning ``None`` was implemented as an override.  At the
  C level, extensions can set ``tp_hash`` to
  :cfunc:`PyObject_HashNotImplemented`.
  (Fixed by Nick Coghlan and Amaury Forgeot d'Arc; :issue:`2235`.)

* Changes to the :class:`Exception` interface
  as dictated by :pep:`352` continue to be made.  For 2.6,
  the :attr:`message` attribute is being deprecated in favor of the
  :attr:`args` attribute.

* The :exc:`GeneratorExit` exception now subclasses
  :exc:`BaseException` instead of :exc:`Exception`.  This means
  that an exception handler that does ``except Exception:``
  will not inadvertently catch :exc:`GeneratorExit`.
  (Contributed by Chad Austin; :issue:`1537`.)

* Generator objects now have a :attr:`gi_code` attribute that refers to
  the original code object backing the generator.
  (Contributed by Collin Winter; :issue:`1473257`.)

* The :func:`compile` built-in function now accepts keyword arguments
  as well as positional parameters.  (Contributed by Thomas Wouters;
  :issue:`1444529`.)

* The :func:`complex` constructor now accepts strings containing
  parenthesized complex numbers, meaning that ``complex(repr(cplx))``
  will now round-trip values.  For example, ``complex('(3+4j)')``
  now returns the value (3+4j).  (:issue:`1491866`)

* The string :meth:`translate` method now accepts ``None`` as the
  translation table parameter, which is treated as the identity
  transformation.   This makes it easier to carry out operations
  that only delete characters.  (Contributed by Bengt Richter and
  implemented by Raymond Hettinger; :issue:`1193128`.)

* The built-in :func:`dir` function now checks for a :meth:`__dir__`
  method on the objects it receives.  This method must return a list
  of strings containing the names of valid attributes for the object,
  and lets the object control the value that :func:`dir` produces.
  Objects that have :meth:`__getattr__` or :meth:`__getattribute__`
  methods can use this to advertise pseudo-attributes they will honor.
  (:issue:`1591665`)

* Instance method objects have new attributes for the object and function
  comprising the method; the new synonym for :attr:`im_self` is
  :attr:`__self__`, and :attr:`im_func` is also available as :attr:`__func__`.
  The old names are still supported in Python 2.6, but are gone in 3.0.

* An obscure change: when you use the :func:`locals` function inside a
  :keyword:`class` statement, the resulting dictionary no longer returns free
  variables.  (Free variables, in this case, are variables referenced in the
  :keyword:`class` statement  that aren't attributes of the class.)

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


Optimizations
-------------

* The :mod:`warnings` module has been rewritten in C.  This makes
  it possible to invoke warnings from the parser, and may also
  make the interpreter's startup faster.
  (Contributed by Neal Norwitz and Brett Cannon; :issue:`1631171`.)

* Type objects now have a cache of methods that can reduce
  the work required to find the correct method implementation
  for a particular class; once cached, the interpreter doesn't need to
  traverse base classes to figure out the right method to call.
  The cache is cleared if a base class or the class itself is modified,
  so the cache should remain correct even in the face of Python's dynamic
  nature.
  (Original optimization implemented by Armin Rigo, updated for
  Python 2.6 by Kevin Jacobs; :issue:`1700288`.)

  By default, this change is only applied to types that are included with
  the Python core.  Extension modules may not necessarily be compatible with
  this cache,
  so they must explicitly add :cmacro:`Py_TPFLAGS_HAVE_VERSION_TAG`
  to the module's ``tp_flags`` field to enable the method cache.
  (To be compatible with the method cache, the extension module's code
  must not directly access and modify the ``tp_dict`` member of
  any of the types it implements.  Most modules don't do this,
  but it's impossible for the Python interpreter to determine that.
  See :issue:`1878` for some discussion.)

* Function calls that use keyword arguments are significantly faster
  by doing a quick pointer comparison, usually saving the time of a
  full string comparison.  (Contributed by Raymond Hettinger, after an
  initial implementation by Antoine Pitrou; :issue:`1819`.)

* All of the functions in the :mod:`struct` module have been rewritten in
  C, thanks to work at the Need For Speed sprint.
  (Contributed by Raymond Hettinger.)

* Some of the standard built-in types now set a bit in their type
  objects.  This speeds up checking whether an object is a subclass of
  one of these types.  (Contributed by Neal Norwitz.)

* Unicode strings now use faster code for detecting
  whitespace and line breaks; this speeds up the :meth:`split` method
  by about 25% and :meth:`splitlines` by 35%.
  (Contributed by Antoine Pitrou.)  Memory usage is reduced
  by using pymalloc for the Unicode string's data.

* The ``with`` statement now stores the :meth:`__exit__` method on the stack,
  producing a small speedup.  (Implemented by Jeffrey Yasskin.)

* To reduce memory usage, the garbage collector will now clear internal
  free lists when garbage-collecting the highest generation of objects.
  This may return memory to the operating system sooner.

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

.. _new-26-interpreter:

Interpreter Changes
-------------------------------

Two command-line options have been reserved for use by other Python
implementations.  The :option:`-J` switch has been reserved for use by
Jython for Jython-specific options, such as switches that are passed to
the underlying JVM.  :option:`-X` has been reserved for options
specific to a particular implementation of Python such as CPython,
Jython, or IronPython.  If either option is used with Python 2.6, the
interpreter will report that the option isn't currently used.

Python can now be prevented from writing :file:`.pyc` or :file:`.pyo`
files by supplying the :option:`-B` switch to the Python interpreter,
or by setting the :envvar:`PYTHONDONTWRITEBYTECODE` environment
variable before running the interpreter.  This setting is available to
Python programs as the ``sys.dont_write_bytecode`` variable, and
Python code can change the value to modify the interpreter's
behaviour.  (Contributed by Neal Norwitz and Georg Brandl.)

The encoding used for standard input, output, and standard error can
be specified by setting the :envvar:`PYTHONIOENCODING` environment
variable before running the interpreter.  The value should be a string
in the form ``<encoding>`` or ``<encoding>:<errorhandler>``.
The *encoding* part specifies the encoding's name, e.g. ``utf-8`` or
``latin-1``; the optional *errorhandler* part specifies
what to do with characters that can't be handled by the encoding,
and  should be one of "error", "ignore", or "replace".   (Contributed
by Martin von Loewis.)

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

New, Improved, and Deprecated Modules
=====================================

As in every release, Python's standard library received a number of
enhancements and bug fixes.  Here's a partial list of the most notable
changes, sorted alphabetically by module name. Consult the
:file:`Misc/NEWS` file in the source tree for a more complete list of
changes, or look through the Subversion logs for all the details.

* (3.0-warning mode) Python 3.0 will feature a reorganized standard
  library that will drop many outdated modules and rename others.
  Python 2.6 running in 3.0-warning mode will warn about these modules
  when they are imported.

  The list of deprecated modules is:
  :mod:`audiodev`,
  :mod:`bgenlocations`,
  :mod:`buildtools`,
  :mod:`bundlebuilder`,
  :mod:`Canvas`,
  :mod:`compiler`,
  :mod:`dircache`,
  :mod:`dl`,
  :mod:`fpformat`,
  :mod:`gensuitemodule`,
  :mod:`ihooks`,
  :mod:`imageop`,
  :mod:`imgfile`,
  :mod:`linuxaudiodev`,
  :mod:`mhlib`,
  :mod:`mimetools`,
  :mod:`multifile`,
  :mod:`new`,
  :mod:`pure`,
  :mod:`statvfs`,
  :mod:`sunaudiodev`,
  :mod:`test.testall`, and
  :mod:`toaiff`.

* The :mod:`asyncore` and :mod:`asynchat` modules are
  being actively maintained again, and a number of patches and bugfixes
  were applied.  (Maintained by Josiah Carlson; see :issue:`1736190` for
  one patch.)

* The :mod:`bsddb` module also has a new maintainer, Jesús Cea, and the package
  is now available as a standalone package.  The web page for the package is
  `www.jcea.es/programacion/pybsddb.htm
  <http://www.jcea.es/programacion/pybsddb.htm>`__.
  The plan is to remove the package from the standard library
  in Python 3.0, because its pace of releases is much more frequent than
  Python's.

  The :mod:`bsddb.dbshelve` module now uses the highest pickling protocol
  available, instead of restricting itself to protocol 1.
  (Contributed by W. Barnes; :issue:`1551443`.)

* The :mod:`cgi` module will now read variables from the query string
  of an HTTP POST request.  This makes it possible to use form actions
  with URLs that include query strings such as
  "/cgi-bin/add.py?category=1".  (Contributed by Alexandre Fiori and
  Nubis; :issue:`1817`.)

  The :func:`parse_qs` and :func:`parse_qsl` functions have been
  relocated from the :mod:`cgi` module to the :mod:`urlparse` module.
  The versions still available in the :mod:`cgi` module will
  trigger :exc:`PendingDeprecationWarning` messages in 2.6
  (:issue:`600362`).

* The :mod:`cmath` module underwent extensive revision,
  contributed by Mark Dickinson and Christian Heimes.
  Five new functions were added:

  * :func:`polar` converts a complex number to polar form, returning
    the modulus and argument of the complex number.

  * :func:`rect` does the opposite, turning a modulus, argument pair
    back into the corresponding complex number.

  * :func:`phase` returns the argument (also called the angle) of a complex
    number.

  * :func:`isnan` returns True if either
    the real or imaginary part of its argument is a NaN.

  * :func:`isinf` returns True if either the real or imaginary part of
    its argument is infinite.

  The revisions also improved the numerical soundness of the
  :mod:`cmath` module.  For all functions, the real and imaginary
  parts of the results are accurate to within a few units of least
  precision (ulps) whenever possible.  See :issue:`1381` for the
  details.  The branch cuts for :func:`asinh`, :func:`atanh`: and
  :func:`atan` have also been corrected.

  The tests for the module have been greatly expanded; nearly 2000 new
  test cases exercise the algebraic functions.

  On IEEE 754 platforms, the :mod:`cmath` module now handles IEEE 754
  special values and floating-point exceptions in a manner consistent
  with Annex 'G' of the C99 standard.

* A new data type in the :mod:`collections` module: :class:`namedtuple(typename,
  fieldnames)` is a factory function that creates subclasses of the standard tuple
  whose fields are accessible by name as well as index.  For example::

     >>> var_type = collections.namedtuple('variable',
     ...             'id name type size')
     >>> # Names are separated by spaces or commas.
     >>> # 'id, name, type, size' would also work.
     >>> var_type._fields
     ('id', 'name', 'type', 'size')

     >>> var = var_type(1, 'frequency', 'int', 4)
     >>> print var[0], var.id    # Equivalent
     1 1
     >>> print var[2], var.type  # Equivalent
     int int
     >>> var._asdict()
     {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'}
     >>> v2 = var._replace(name='amplitude')
     >>> v2
     variable(id=1, name='amplitude', type='int', size=4)

  Several places in the standard library that returned tuples have
  been modified to return :class:`namedtuple` instances.  For example,
  the :meth:`Decimal.as_tuple` method now returns a named tuple with
  :attr:`sign`, :attr:`digits`, and :attr:`exponent` fields.

  (Contributed by Raymond Hettinger.)

* Another change to the :mod:`collections` module is that the
  :class:`deque` type now supports an optional *maxlen* parameter;
  if supplied, the deque's size will be restricted to no more
  than *maxlen* items.  Adding more items to a full deque causes
  old items to be discarded.

  ::

    >>> from collections import deque
    >>> dq=deque(maxlen=3)
    >>> dq
    deque([], maxlen=3)
    >>> dq.append(1) ; dq.append(2) ; dq.append(3)
    >>> dq
    deque([1, 2, 3], maxlen=3)
    >>> dq.append(4)
    >>> dq
    deque([2, 3, 4], maxlen=3)

  (Contributed by Raymond Hettinger.)

* The :mod:`Cookie` module's :class:`Morsel` objects now support an
  :attr:`httponly` attribute.  In some browsers. cookies with this attribute
  set cannot be accessed or manipulated by JavaScript code.
  (Contributed by Arvin Schnell; :issue:`1638033`.)

* A new window method in the :mod:`curses` module,
  :meth:`chgat`, changes the display attributes for a certain number of
  characters on a single line.  (Contributed by Fabian Kreutz.)

  ::

     # Boldface text starting at y=0,x=21
     # and affecting the rest of the line.
     stdscr.chgat(0, 21, curses.A_BOLD)

  The :class:`Textbox` class in the :mod:`curses.textpad` module
  now supports editing in insert mode as well as overwrite mode.
  Insert mode is enabled by supplying a true value for the *insert_mode*
  parameter when creating the :class:`Textbox` instance.

* The :mod:`datetime` module's :meth:`strftime` methods now support a
  ``%f`` format code that expands to the number of microseconds in the
  object, zero-padded on
  the left to six places.  (Contributed by Skip Montanaro; :issue:`1158`.)

* The :mod:`decimal` module was updated to version 1.66 of
  `the General Decimal Specification <http://www2.hursley.ibm.com/decimal/decarith.html>`__.  New features
  include some methods for some basic mathematical functions such as
  :meth:`exp` and :meth:`log10`::

    >>> Decimal(1).exp()
    Decimal("2.718281828459045235360287471")
    >>> Decimal("2.7182818").ln()
    Decimal("0.9999999895305022877376682436")
    >>> Decimal(1000).log10()
    Decimal("3")

  The :meth:`as_tuple` method of :class:`Decimal` objects now returns a
  named tuple with :attr:`sign`, :attr:`digits`, and :attr:`exponent` fields.

  (Implemented by Facundo Batista and Mark Dickinson.  Named tuple
  support added by Raymond Hettinger.)

* The :mod:`difflib` module's :class:`SequenceMatcher` class
  now returns named tuples representing matches,
  with :attr:`a`, :attr:`b`, and :attr:`size` attributes.
  (Contributed by Raymond Hettinger.)

* An optional ``timeout`` parameter, specifying a timeout measured in
  seconds, was added to the :class:`ftplib.FTP` class constructor as
  well as the :meth:`connect` method.  (Added by Facundo Batista.)
  Also, the :class:`FTP` class's :meth:`storbinary` and
  :meth:`storlines` now take an optional *callback* parameter that
  will be called with each block of data after the data has been sent.
  (Contributed by Phil Schwartz; :issue:`1221598`.)

* The :func:`reduce` built-in function is also available in the
  :mod:`functools` module.  In Python 3.0, the built-in has been
  dropped and :func:`reduce` is only available from :mod:`functools`;
  currently there are no plans to drop the built-in in the 2.x series.
  (Patched by Christian Heimes; :issue:`1739906`.)

* When possible, the :mod:`getpass` module will now use
  :file:`/dev/tty` to print a prompt message and read the password,
  falling back to standard error and standard input.  If the
  password may be echoed to the terminal, a warning is printed before
  the prompt is displayed.  (Contributed by Gregory P. Smith.)

* The :func:`glob.glob` function can now return Unicode filenames if
  a Unicode path was used and Unicode filenames are matched within the
  directory.  (:issue:`1001604`)

* The :mod:`gopherlib` module has been removed.

* A new function in the :mod:`heapq` module, ``merge(iter1, iter2, ...)``,
  takes any number of iterables returning data in sorted
  order, and returns a new generator that returns the contents of all
  the iterators, also in sorted order.  For example::

      >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))
      [1, 2, 3, 5, 8, 9, 16]

  Another new function, ``heappushpop(heap, item)``,
  pushes *item* onto *heap*, then pops off and returns the smallest item.
  This is more efficient than making a call to :func:`heappush` and then
  :func:`heappop`.

  :mod:`heapq` is now implemented to only use less-than comparison,
  instead of the less-than-or-equal comparison it previously used.
  This makes :mod:`heapq`'s usage of a type match the
  :meth:`list.sort` method.
  (Contributed by Raymond Hettinger.)

* An optional ``timeout`` parameter, specifying a timeout measured in
  seconds, was added to the :class:`httplib.HTTPConnection` and
  :class:`HTTPSConnection` class constructors.  (Added by Facundo
  Batista.)

* Most of the :mod:`inspect` module's functions, such as
  :func:`getmoduleinfo` and :func:`getargs`, now return named tuples.
  In addition to behaving like tuples, the elements of the  return value
  can also be accessed as attributes.
  (Contributed by Raymond Hettinger.)

  Some new functions in the module include
  :func:`isgenerator`, :func:`isgeneratorfunction`,
  and :func:`isabstract`.

* The :mod:`itertools` module gained several new functions.

  ``izip_longest(iter1, iter2, ...[, fillvalue])`` makes tuples from
  each of the elements; if some of the iterables are shorter than
  others, the missing values are set to *fillvalue*.  For example::

     >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))
     ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))

  ``product(iter1, iter2, ..., [repeat=N])`` returns the Cartesian product
  of the supplied iterables, a set of tuples containing
  every possible combination of the elements returned from each iterable. ::

     >>> list(itertools.product([1,2,3], [4,5,6]))
     [(1, 4), (1, 5), (1, 6),
      (2, 4), (2, 5), (2, 6),
      (3, 4), (3, 5), (3, 6)]

  The optional *repeat* keyword argument is used for taking the
  product of an iterable or a set of iterables with themselves,
  repeated *N* times.  With a single iterable argument, *N*-tuples
  are returned::

     >>> list(itertools.product([1,2], repeat=3))
     [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
      (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

  With two iterables, *2N*-tuples are returned. ::

     >>> list(itertools.product([1,2], [3,4], repeat=2))
     [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
      (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
      (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
      (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]

  ``combinations(iterable, r)`` returns sub-sequences of length *r* from
  the elements of *iterable*. ::

    >>> list(itertools.combinations('123', 2))
    [('1', '2'), ('1', '3'), ('2', '3')]
    >>> list(itertools.combinations('123', 3))
    [('1', '2', '3')]
    >>> list(itertools.combinations('1234', 3))
    [('1', '2', '3'), ('1', '2', '4'),
     ('1', '3', '4'), ('2', '3', '4')]

  ``permutations(iter[, r])`` returns all the permutations of length *r* of
  the iterable's elements.  If *r* is not specified, it will default to the
  number of elements produced by the iterable. ::

    >>> list(itertools.permutations([1,2,3,4], 2))
    [(1, 2), (1, 3), (1, 4),
     (2, 1), (2, 3), (2, 4),
     (3, 1), (3, 2), (3, 4),
     (4, 1), (4, 2), (4, 3)]

  ``itertools.chain(*iterables)`` is an existing function in
  :mod:`itertools` that gained a new constructor in Python 2.6.
  ``itertools.chain.from_iterable(iterable)`` takes a single
  iterable that should return other iterables.  :func:`chain` will
  then return all the elements of the first iterable, then
  all the elements of the second, and so on. ::

    >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))
    [1, 2, 3, 4, 5, 6]

  (All contributed by Raymond Hettinger.)

* The :mod:`logging` module's :class:`FileHandler` class
  and its subclasses :class:`WatchedFileHandler`, :class:`RotatingFileHandler`,
  and :class:`TimedRotatingFileHandler` now
  have an optional *delay* parameter to their constructors.  If *delay*
  is true, opening of the log file is deferred until the first
  :meth:`emit` call is made.  (Contributed by Vinay Sajip.)

  :class:`TimedRotatingFileHandler` also has a *utc* constructor
  parameter.  If the argument is true, UTC time will be used
  in determining when midnight occurs and in generating filenames;
  otherwise local time will be used.

* Several new functions were added to the :mod:`math` module:

  * :func:`~math.isinf` and :func:`~math.isnan` determine whether a given float
    is a (positive or negative) infinity or a NaN (Not a Number), respectively.

  * :func:`~math.copysign` copies the sign bit of an IEEE 754 number,
    returning the absolute value of *x* combined with the sign bit of
    *y*.  For example, ``math.copysign(1, -0.0)`` returns -1.0.
    (Contributed by Christian Heimes.)

  * :func:`~math.factorial` computes the factorial of a number.
    (Contributed by Raymond Hettinger; :issue:`2138`.)

  * :func:`~math.fsum` adds up the stream of numbers from an iterable,
    and is careful to avoid loss of precision through using partial sums.
    (Contributed by Jean Brouwers, Raymond Hettinger, and Mark Dickinson;
    :issue:`2819`.)

  * :func:`~math.acosh`, :func:`~math.asinh`
    and :func:`~math.atanh` compute the inverse hyperbolic functions.

  * :func:`~math.log1p` returns the natural logarithm of *1+x*
    (base *e*).

  * :func:`trunc` rounds a number toward zero, returning the closest
    :class:`Integral` that's between the function's argument and zero.
    Added as part of the backport of
    `PEP 3141's type hierarchy for numbers <#pep-3141>`__.

* The :mod:`math` module has been improved to give more consistent
  behaviour across platforms, especially with respect to handling of
  floating-point exceptions and IEEE 754 special values.

  Whenever possible, the module follows the recommendations of the C99
  standard about 754's special values.  For example, ``sqrt(-1.)``
  should now give a :exc:`ValueError` across almost all platforms,
  while ``sqrt(float('NaN'))`` should return a NaN on all IEEE 754
  platforms.  Where Annex 'F' of the C99 standard recommends signaling
  'divide-by-zero' or 'invalid', Python will raise :exc:`ValueError`.
  Where Annex 'F' of the C99 standard recommends signaling 'overflow',
  Python will raise :exc:`OverflowError`.  (See :issue:`711019` and
  :issue:`1640`.)

  (Contributed by Christian Heimes and Mark Dickinson.)

* The :mod:`MimeWriter` module and :mod:`mimify` module
  have been deprecated; use the :mod:`email`
  package instead.

* The :mod:`md5` module has been deprecated; use the :mod:`hashlib` module
  instead.

* :class:`mmap` objects now have a :meth:`rfind` method that searches for a
  substring beginning at the end of the string and searching
  backwards.  The :meth:`find` method also gained an *end* parameter
  giving an index at which to stop searching.
  (Contributed by John Lenton.)

* The :mod:`operator` module gained a
  :func:`methodcaller` function that takes a name and an optional
  set of arguments, returning a callable that will call
  the named function on any arguments passed to it.  For example::

    >>> # Equivalent to lambda s: s.replace('old', 'new')
    >>> replacer = operator.methodcaller('replace', 'old', 'new')
    >>> replacer('old wine in old bottles')
    'new wine in new bottles'

  (Contributed by Georg Brandl, after a suggestion by Gregory Petrosyan.)

  The :func:`attrgetter` function now accepts dotted names and performs
  the corresponding attribute lookups::

    >>> inst_name = operator.attrgetter(
    ...        '__class__.__name__')
    >>> inst_name('')
    'str'
    >>> inst_name(help)
    '_Helper'

  (Contributed by Georg Brandl, after a suggestion by Barry Warsaw.)

* The :mod:`os` module now wraps several new system calls.
  ``fchmod(fd, mode)`` and ``fchown(fd, uid, gid)`` change the mode
  and ownership of an opened file, and ``lchmod(path, mode)`` changes
  the mode of a symlink.  (Contributed by Georg Brandl and Christian
  Heimes.)

  :func:`chflags` and :func:`lchflags` are wrappers for the
  corresponding system calls (where they're available), changing the
  flags set on a file.  Constants for the flag values are defined in
  the :mod:`stat` module; some possible values include
  :const:`UF_IMMUTABLE` to signal the file may not be changed and
  :const:`UF_APPEND` to indicate that data can only be appended to the
  file.  (Contributed by M. Levinson.)

  ``os.closerange(low, high)`` efficiently closes all file descriptors
  from *low* to *high*, ignoring any errors and not including *high* itself.
  This function is now used by the :mod:`subprocess` module to make starting
  processes faster.  (Contributed by Georg Brandl; :issue:`1663329`.)

* The ``os.environ`` object's :meth:`clear` method will now unset the
  environment variables using :func:`os.unsetenv` in addition to clearing
  the object's keys.  (Contributed by Martin Horcicka; :issue:`1181`.)

* The :func:`os.walk` function now has a ``followlinks`` parameter. If
  set to True, it will follow symlinks pointing to directories and
  visit the directory's contents.  For backward compatibility, the
  parameter's default value is false.  Note that the function can fall
  into an infinite recursion if there's a symlink that points to a
  parent directory.  (:issue:`1273829`)

* In the :mod:`os.path` module, the :func:`splitext` function
  has been changed to not split on leading period characters.
  This produces better results when operating on Unix's dot-files.
  For example, ``os.path.splitext('.ipython')``
  now returns ``('.ipython', '')`` instead of ``('', '.ipython')``.
  (:issue:`115886`)

  A new function, ``os.path.relpath(path, start='.')``, returns a relative path
  from the ``start`` path, if it's supplied, or from the current
  working directory to the destination ``path``.  (Contributed by
  Richard Barran; :issue:`1339796`.)

  On Windows, :func:`os.path.expandvars` will now expand environment variables
  given in the form "%var%", and "~user" will be expanded into the
  user's home directory path.  (Contributed by Josiah Carlson;
  :issue:`957650`.)

* The Python debugger provided by the :mod:`pdb` module
  gained a new command: "run" restarts the Python program being debugged
  and can optionally take new command-line arguments for the program.
  (Contributed by Rocky Bernstein; :issue:`1393667`.)

* The :mod:`posixfile` module has been deprecated; :func:`fcntl.lockf`
  provides better locking.

  The :func:`post_mortem` function, used to begin debugging a
  traceback, will now use the traceback returned by :func:`sys.exc_info`
  if no traceback is supplied.   (Contributed by Facundo Batista;
  :issue:`1106316`.)

* The :mod:`pickletools` module now has an :func:`optimize` function
  that takes a string containing a pickle and removes some unused
  opcodes, returning a shorter pickle that contains the same data structure.
  (Contributed by Raymond Hettinger.)

* The :mod:`popen2` module has been deprecated; use the :mod:`subprocess`
  module.

* A :func:`get_data` function was added to the :mod:`pkgutil`
  module that returns the contents of resource files included
  with an installed Python package.  For example::

    >>> import pkgutil
    >>> print pkgutil.get_data('test', 'exception_hierarchy.txt')
    BaseException
     +-- SystemExit
     +-- KeyboardInterrupt
     +-- GeneratorExit
     +-- Exception
          +-- StopIteration
          +-- StandardError
     ...

  (Contributed by Paul Moore; :issue:`2439`.)

* The :mod:`pyexpat` module's :class:`Parser` objects now allow setting
  their :attr:`buffer_size` attribute to change the size of the buffer
  used to hold character data.
  (Contributed by Achim Gaedke; :issue:`1137`.)

* The :mod:`Queue` module now provides queue variants that retrieve entries
  in different orders.  The :class:`PriorityQueue` class stores
  queued items in a heap and retrieves them in priority order,
  and :class:`LifoQueue` retrieves the most recently added entries first,
  meaning that it behaves like a stack.
  (Contributed by Raymond Hettinger.)

* The :mod:`random` module's :class:`Random` objects can
  now be pickled on a 32-bit system and unpickled on a 64-bit
  system, and vice versa.  Unfortunately, this change also means
  that Python 2.6's :class:`Random` objects can't be unpickled correctly
  on earlier versions of Python.
  (Contributed by Shawn Ligocki; :issue:`1727780`.)

  The new ``triangular(low, high, mode)`` function returns random
  numbers following a triangular distribution.   The returned values
  are between *low* and *high*, not including *high* itself, and
  with *mode* as the most frequently occurring value
  in the distribution.  (Contributed by Wladmir van der Laan and
  Raymond Hettinger; :issue:`1681432`.)

* Long regular expression searches carried out by the  :mod:`re`
  module will check for signals being delivered, so
  time-consuming searches can now be interrupted.
  (Contributed by Josh Hoyt and Ralf Schmitt; :issue:`846388`.)

  The regular expression module is implemented by compiling bytecodes
  for a tiny regex-specific virtual machine.  Untrusted code
  could create malicious strings of bytecode directly and cause crashes,
  so Python 2.6 includes a verifier for the regex bytecode.
  (Contributed by Guido van Rossum from work for Google App Engine;
  :issue:`3487`.)

* The :mod:`rgbimg` module has been removed.

* The :mod:`rlcompleter` module's :meth:`Completer.complete()` method
  will now ignore exceptions triggered while evaluating a name.
  (Fixed by Lorenz Quack; :issue:`2250`.)

* The :mod:`sched` module's :class:`scheduler` instances now
  have a read-only :attr:`queue` attribute that returns the
  contents of the scheduler's queue, represented as a list of
  named tuples with the fields ``(time, priority, action, argument)``.
  (Contributed by Raymond Hettinger; :issue:`1861`.)

* The :mod:`select` module now has wrapper functions
  for the Linux :cfunc:`epoll` and BSD :cfunc:`kqueue` system calls.
  :meth:`modify` method was added to the existing :class:`poll`
  objects; ``pollobj.modify(fd, eventmask)`` takes a file descriptor
  or file object and an event mask, modifying the recorded event mask
  for that file.
  (Contributed by Christian Heimes; :issue:`1657`.)

* The :mod:`sets` module has been deprecated; it's better to
  use the built-in :class:`set` and :class:`frozenset` types.

* The :mod:`sha` module has been deprecated; use the :mod:`hashlib` module
  instead.

* The :func:`shutil.copytree` function now has an optional *ignore* argument
  that takes a callable object.  This callable will receive each directory path
  and a list of the directory's contents, and returns a list of names that
  will be ignored, not copied.

  The :mod:`shutil` module also provides an :func:`ignore_patterns`
  function for use with this new parameter.  :func:`ignore_patterns`
  takes an arbitrary number of glob-style patterns and returns a
  callable that will ignore any files and directories that match any
  of these patterns.  The following example copies a directory tree,
  but skips both :file:`.svn` directories and Emacs backup files,
  which have names ending with '~'::

      shutil.copytree('Doc/library', '/tmp/library',
                      ignore=shutil.ignore_patterns('*~', '.svn'))

  (Contributed by Tarek Ziadé; :issue:`2663`.)

* Integrating signal handling with GUI handling event loops
  like those used by Tkinter or GTk+ has long been a problem; most
  software ends up polling, waking up every fraction of a second to check
  if any GUI events have occurred.
  The :mod:`signal` module can now make this more efficient.
  Calling ``signal.set_wakeup_fd(fd)`` sets a file descriptor
  to be used; when a signal is received, a byte is written to that
  file descriptor.  There's also a C-level function,
  :cfunc:`PySignal_SetWakeupFd`, for setting the descriptor.

  Event loops will use this by opening a pipe to create two descriptors,
  one for reading and one for writing.  The writable descriptor
  will be passed to :func:`set_wakeup_fd`, and the readable descriptor
  will be added to the list of descriptors monitored by the event loop via
  :cfunc:`select` or :cfunc:`poll`.
  On receiving a signal, a byte will be written and the main event loop
  will be woken up, avoiding the need to poll.

  (Contributed by Adam Olsen; :issue:`1583`.)

  The :func:`siginterrupt` function is now available from Python code,
  and allows changing whether signals can interrupt system calls or not.
  (Contributed by Ralf Schmitt.)

  The :func:`setitimer` and :func:`getitimer` functions have also been
  added (where they're available).  :func:`setitimer`
  allows setting interval timers that will cause a signal to be
  delivered to the process after a specified time, measured in
  wall-clock time, consumed process time, or combined process+system
  time.  (Contributed by Guilherme Polo; :issue:`2240`.)

* The :mod:`smtplib` module now supports SMTP over SSL thanks to the
  addition of the :class:`SMTP_SSL` class. This class supports an
  interface identical to the existing :class:`SMTP` class.
  (Contributed by Monty Taylor.)  Both class constructors also have an
  optional ``timeout`` parameter that specifies a timeout for the
  initial connection attempt, measured in seconds.  (Contributed by
  Facundo Batista.)

  An implementation of the LMTP protocol (:rfc:`2033`) was also added
  to the module.  LMTP is used in place of SMTP when transferring
  e-mail between agents that don't manage a mail queue.  (LMTP
  implemented by Leif Hedstrom; :issue:`957003`.)

  SMTP.starttls() now complies with :rfc:`3207` and forgets any
  knowledge obtained from the server not obtained from the TLS
  negotiation itself.  (Patch contributed by Bill Fenner;
  :issue:`829951`.)

* The :mod:`socket` module now supports TIPC (http://tipc.sf.net),
  a high-performance non-IP-based protocol designed for use in clustered
  environments.  TIPC addresses are 4- or 5-tuples.
  (Contributed by Alberto Bertogli; :issue:`1646`.)

  A new function, :func:`create_connection`, takes an address
  and connects to it using an optional timeout value, returning
  the connected socket object.

* The base classes in the :mod:`SocketServer` module now support
  calling a :meth:`handle_timeout` method after a span of inactivity
  specified by the server's :attr:`timeout` attribute.  (Contributed
  by Michael Pomraning.)  The :meth:`serve_forever` method
  now takes an optional poll interval measured in seconds,
  controlling how often the server will check for a shutdown request.
  (Contributed by Pedro Werneck and Jeffrey Yasskin;
  :issue:`742598`, :issue:`1193577`.)

* The :mod:`sqlite3` module, maintained by Gerhard Haering,
  has been updated from version 2.3.2 in Python 2.5 to
  version 2.4.1.

* The :mod:`struct` module now supports the C99 :ctype:`_Bool` type,
  using the format character ``'?'``.
  (Contributed by David Remahl.)

* The :class:`Popen` objects provided by the :mod:`subprocess` module
  now have :meth:`terminate`, :meth:`kill`, and :meth:`send_signal` methods.
  On Windows, :meth:`send_signal` only supports the :const:`SIGTERM`
  signal, and all these methods are aliases for the Win32 API function
  :cfunc:`TerminateProcess`.
  (Contributed by Christian Heimes.)

* A new variable in the :mod:`sys` module, :attr:`float_info`, is an
  object containing information derived from the :file:`float.h` file
  about the platform's floating-point support.  Attributes of this
  object include :attr:`mant_dig` (number of digits in the mantissa),
  :attr:`epsilon` (smallest difference between 1.0 and the next
  largest value representable), and several others.  (Contributed by
  Christian Heimes; :issue:`1534`.)

  Another new variable, :attr:`dont_write_bytecode`, controls whether Python
  writes any :file:`.pyc` or :file:`.pyo` files on importing a module.
  If this variable is true, the compiled files are not written.  The
  variable is initially set on start-up by supplying the :option:`-B`
  switch to the Python interpreter, or by setting the
  :envvar:`PYTHONDONTWRITEBYTECODE` environment variable before
  running the interpreter.  Python code can subsequently
  change the value of this variable to control whether bytecode files
  are written or not.
  (Contributed by Neal Norwitz and Georg Brandl.)

  Information about the command-line arguments supplied to the Python
  interpreter is available by reading attributes of a named
  tuple available as ``sys.flags``.  For example, the :attr:`verbose`
  attribute is true if Python
  was executed in verbose mode, :attr:`debug` is true in debugging mode, etc.
  These attributes are all read-only.
  (Contributed by Christian Heimes.)

  A new function, :func:`getsizeof`, takes a Python object and returns
  the amount of memory used by the object, measured in bytes.  Built-in
  objects return correct results; third-party extensions may not,
  but can define a :meth:`__sizeof__` method to return the
  object's size.
  (Contributed by Robert Schuppenies; :issue:`2898`.)

  It's now possible to determine the current profiler and tracer functions
  by calling :func:`sys.getprofile` and :func:`sys.gettrace`.
  (Contributed by Georg Brandl; :issue:`1648`.)

* The :mod:`tarfile` module now supports POSIX.1-2001 (pax) tarfiles in
  addition to the POSIX.1-1988 (ustar) and GNU tar formats that were
  already supported.  The default format is GNU tar; specify the
  ``format`` parameter to open a file using a different format::

    tar = tarfile.open("output.tar", "w",
                       format=tarfile.PAX_FORMAT)

  The new ``encoding`` and ``errors`` parameters specify an encoding and
  an error handling scheme for character conversions.  ``'strict'``,
  ``'ignore'``, and ``'replace'`` are the three standard ways Python can
  handle errors,;
  ``'utf-8'`` is a special value that replaces bad characters with
  their UTF-8 representation.  (Character conversions occur because the
  PAX format supports Unicode filenames, defaulting to UTF-8 encoding.)

  The :meth:`TarFile.add` method now accepts an ``exclude`` argument that's
  a function that can be used to exclude certain filenames from
  an archive.
  The function must take a filename and return true if the file
  should be excluded or false if it should be archived.
  The function is applied to both the name initially passed to :meth:`add`
  and to the names of files in recursively-added directories.

  (All changes contributed by Lars Gustäbel).

* An optional ``timeout`` parameter was added to the
  :class:`telnetlib.Telnet` class constructor, specifying a timeout
  measured in seconds.  (Added by Facundo Batista.)

* The :class:`tempfile.NamedTemporaryFile` class usually deletes
  the temporary file it created when the file is closed.  This
  behaviour can now be changed by passing ``delete=False`` to the
  constructor.  (Contributed by Damien Miller; :issue:`1537850`.)

  A new class, :class:`SpooledTemporaryFile`, behaves like
  a temporary file but stores its data in memory until a maximum size is
  exceeded.  On reaching that limit, the contents will be written to
  an on-disk temporary file.  (Contributed by Dustin J. Mitchell.)

  The :class:`NamedTemporaryFile` and :class:`SpooledTemporaryFile` classes
  both work as context managers, so you can write
  ``with tempfile.NamedTemporaryFile() as tmp: ...``.
  (Contributed by Alexander Belopolsky; :issue:`2021`.)

* The :mod:`test.test_support` module gained a number
  of context managers useful for writing tests.
  :func:`EnvironmentVarGuard` is a
  context manager that temporarily changes environment variables and
  automatically restores them to their old values.

  Another context manager, :class:`TransientResource`, can surround calls
  to resources that may or may not be available; it will catch and
  ignore a specified list of exceptions.  For example,
  a network test may ignore certain failures when connecting to an
  external web site::

      with test_support.TransientResource(IOError,
                                      errno=errno.ETIMEDOUT):
          f = urllib.urlopen('https://sf.net')
          ...

  Finally, :func:`check_warnings` resets the :mod:`warning` module's
  warning filters and returns an object that will record all warning
  messages triggered (:issue:`3781`)::

      with test_support.check_warnings() as wrec:
          warnings.simplefilter("always")
          # ... code that triggers a warning ...
          assert str(wrec.message) == "function is outdated"
          assert len(wrec.warnings) == 1, "Multiple warnings raised"

  (Contributed by Brett Cannon.)

* The :mod:`textwrap` module can now preserve existing whitespace
  at the beginnings and ends of the newly-created lines
  by specifying ``drop_whitespace=False``
  as an argument::

    >>> S = """This  sentence  has a bunch   of
    ...   extra   whitespace."""
    >>> print textwrap.fill(S, width=15)
    This  sentence
    has a bunch
    of    extra
    whitespace.
    >>> print textwrap.fill(S, drop_whitespace=False, width=15)
    This  sentence
      has a bunch
       of    extra
       whitespace.
    >>>

  (Contributed by Dwayne Bailey; :issue:`1581073`.)

* The :mod:`threading` module API is being changed to use properties
  such as :attr:`daemon` instead of :meth:`setDaemon` and
  :meth:`isDaemon` methods, and some methods have been renamed to use
  underscores instead of camel-case; for example, the
  :meth:`activeCount` method is renamed to :meth:`active_count`.  Both
  the 2.6 and 3.0 versions of the module support the same properties
  and renamed methods, but don't remove the old methods.  No date has been set
  for the deprecation of the old APIs in Python 3.x; the old APIs won't
  be removed in any 2.x version.
  (Carried out by several people, most notably Benjamin Peterson.)

  The :mod:`threading` module's :class:`Thread` objects
  gained an :attr:`ident` property that returns the thread's
  identifier, a nonzero integer.  (Contributed by Gregory P. Smith;
  :issue:`2871`.)

* The :mod:`timeit` module now accepts callables as well as strings
  for the statement being timed and for the setup code.
  Two convenience functions were added for creating
  :class:`Timer` instances:
  ``repeat(stmt, setup, time, repeat, number)`` and
  ``timeit(stmt, setup, time, number)`` create an instance and call
  the corresponding method. (Contributed by Erik Demaine;
  :issue:`1533909`.)

* The :mod:`Tkinter` module now accepts lists and tuples for options,
  separating the elements by spaces before passing the resulting value to
  Tcl/Tk.
  (Contributed by Guilherme Polo; :issue:`2906`.)

* The :mod:`turtle` module for turtle graphics was greatly enhanced by
  Gregor Lingl.  New features in the module include:

  * Better animation of turtle movement and rotation.
  * Control over turtle movement using the new :meth:`delay`,
    :meth:`tracer`, and :meth:`speed` methods.
  * The ability to set new shapes for the turtle, and to
    define a new coordinate system.
  * Turtles now have an :meth:`undo()` method that can roll back actions.
  * Simple support for reacting to input events such as mouse and keyboard
    activity, making it possible to write simple games.
  * A :file:`turtle.cfg` file can be used to customize the starting appearance
    of the turtle's screen.
  * The module's docstrings can be replaced by new docstrings that have been
    translated into another language.

  (:issue:`1513695`)

* An optional ``timeout`` parameter was added to the
  :func:`urllib.urlopen` function and the
  :class:`urllib.ftpwrapper` class constructor, as well as the
  :func:`urllib2.urlopen` function.  The parameter specifies a timeout
  measured in seconds.   For example::

     >>> u = urllib2.urlopen("http://slow.example.com",
                             timeout=3)
     Traceback (most recent call last):
       ...
     urllib2.URLError: <urlopen error timed out>
     >>>

  (Added by Facundo Batista.)

* The Unicode database provided by the :mod:`unicodedata` module
  has been updated to version 5.1.0.  (Updated by
  Martin von Loewis; :issue:`3811`.)

* The :mod:`warnings` module's :func:`formatwarning` and :func:`showwarning`
  gained an optional *line* argument that can be used to supply the
  line of source code.  (Added as part of :issue:`1631171`, which re-implemented
  part of the :mod:`warnings` module in C code.)

  A new function, :func:`catch_warnings`, is a context manager
  intended for testing purposes that lets you temporarily modify the
  warning filters and then restore their original values (:issue:`3781`).

* The XML-RPC :class:`SimpleXMLRPCServer` and :class:`DocXMLRPCServer`
  classes can now be prevented from immediately opening and binding to
  their socket by passing True as the ``bind_and_activate``
  constructor parameter.  This can be used to modify the instance's
  :attr:`allow_reuse_address` attribute before calling the
  :meth:`server_bind` and :meth:`server_activate` methods to
  open the socket and begin listening for connections.
  (Contributed by Peter Parente; :issue:`1599845`.)

  :class:`SimpleXMLRPCServer` also has a :attr:`_send_traceback_header`
  attribute; if true, the exception and formatted traceback are returned
  as HTTP headers "X-Exception" and "X-Traceback".  This feature is
  for debugging purposes only and should not be used on production servers
  because the tracebacks might reveal passwords or other sensitive
  information.  (Contributed by Alan McIntyre as part of his
  project for Google's Summer of Code 2007.)

* The :mod:`xmlrpclib` module no longer automatically converts
  :class:`datetime.date` and :class:`datetime.time` to the
  :class:`xmlrpclib.DateTime` type; the conversion semantics were
  not necessarily correct for all applications.  Code using
  :mod:`xmlrpclib` should convert :class:`date` and :class:`time`
  instances. (:issue:`1330538`)  The code can also handle
  dates before 1900 (contributed by Ralf Schmitt; :issue:`2014`)
  and 64-bit integers represented by using ``<i8>`` in XML-RPC responses
  (contributed by Riku Lindblad; :issue:`2985`).

* The :mod:`zipfile` module's :class:`ZipFile` class now has
  :meth:`extract` and :meth:`extractall` methods that will unpack
  a single file or all the files in the archive to the current directory, or
  to a specified directory::

    z = zipfile.ZipFile('python-251.zip')

    # Unpack a single file, writing it relative
    # to the /tmp directory.
    z.extract('Python/sysmodule.c', '/tmp')

    # Unpack all the files in the archive.
    z.extractall()

  (Contributed by Alan McIntyre; :issue:`467924`.)

  The :meth:`open`, :meth:`read` and :meth:`extract` methods can now
  take either a filename or a :class:`ZipInfo` object.  This is useful when an
  archive accidentally contains a duplicated filename.
  (Contributed by Graham Horler; :issue:`1775025`.)

  Finally, :mod:`zipfile` now supports using Unicode filenames
  for archived files.  (Contributed by Alexey Borzenkov; :issue:`1734346`.)

.. ======================================================================
.. whole new modules get described in subsections here

The :mod:`ast` module
----------------------

The :mod:`ast` module provides an Abstract Syntax Tree
representation of Python code, and Armin Ronacher
contributed a set of helper functions that perform a variety of
common tasks.  These will be useful for HTML templating
packages, code analyzers, and similar tools that process
Python code.

The :func:`parse` function takes an expression and returns an AST.
The :func:`dump` function outputs a representation of a tree, suitable
for debugging::

    import ast

    t = ast.parse("""
    d = {}
    for i in 'abcdefghijklm':
        d[i + i] = ord(i) - ord('a') + 1
    print d
    """)
    print ast.dump(t)

This outputs a deeply nested tree::

    Module(body=[
      Assign(targets=[
        Name(id='d', ctx=Store())
       ], value=Dict(keys=[], values=[]))
      For(target=Name(id='i', ctx=Store()),
          iter=Str(s='abcdefghijklm'), body=[
        Assign(targets=[
          Subscript(value=
            Name(id='d', ctx=Load()),
              slice=
              Index(value=
                BinOp(left=Name(id='i', ctx=Load()), op=Add(),
                 right=Name(id='i', ctx=Load()))), ctx=Store())
         ], value=
         BinOp(left=
          BinOp(left=
           Call(func=
            Name(id='ord', ctx=Load()), args=[
              Name(id='i', ctx=Load())
             ], keywords=[], starargs=None, kwargs=None),
           op=Sub(), right=Call(func=
            Name(id='ord', ctx=Load()), args=[
              Str(s='a')
             ], keywords=[], starargs=None, kwargs=None)),
           op=Add(), right=Num(n=1)))
        ], orelse=[])
       Print(dest=None, values=[
         Name(id='d', ctx=Load())
       ], nl=True)
     ])

The :func:`literal_eval` method takes a string or an AST
representing a literal expression, parses and evaluates it, and
returns the resulting value.  A literal expression is a Python
expression containing only strings, numbers, dictionaries,
etc. but no statements or function calls.  If you need to
evaluate an expression but cannot accept the security risk of using an
:func:`eval` call, :func:`literal_eval` will handle it safely::

    >>> literal = '("a", "b", {2:4, 3:8, 1:2})'
    >>> print ast.literal_eval(literal)
    ('a', 'b', {1: 2, 2: 4, 3: 8})
    >>> print ast.literal_eval('"a" + "b"')
    Traceback (most recent call last):
      ...
    ValueError: malformed string

The module also includes :class:`NodeVisitor` and
:class:`NodeTransformer` classes for traversing and modifying an AST,
and functions for common transformations such as changing line
numbers.

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

The :mod:`future_builtins` module
--------------------------------------

Python 3.0 makes many changes to the repertoire of built-in
functions, and most of the changes can't be introduced in the Python
2.x series because they would break compatibility.
The :mod:`future_builtins` module provides versions
of these built-in functions that can be imported when writing
3.0-compatible code.

The functions in this module currently include:

* ``ascii(obj)``: equivalent to :func:`repr`.  In Python 3.0,
  :func:`repr` will return a Unicode string, while :func:`ascii` will
  return a pure ASCII bytestring.

* ``filter(predicate, iterable)``,
  ``map(func, iterable1, ...)``: the 3.0 versions
  return iterators, unlike the 2.x built-ins which return lists.

* ``hex(value)``, ``oct(value)``: instead of calling the
  :meth:`__hex__` or :meth:`__oct__` methods, these versions will
  call the :meth:`__index__` method and convert the result to hexadecimal
  or octal.  :func:`oct` will use the new ``0o`` notation for its
  result.

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

The :mod:`json` module: JavaScript Object Notation
--------------------------------------------------------------------

The new :mod:`json` module supports the encoding and decoding of Python types in
JSON (Javascript Object Notation). JSON is a lightweight interchange format
often used in web applications. For more information about JSON, see
http://www.json.org.

:mod:`json` comes with support for decoding and encoding most builtin Python
types. The following example encodes and decodes a dictionary::

       >>> import json
       >>> data = {"spam" : "foo", "parrot" : 42}
       >>> in_json = json.dumps(data) # Encode the data
       >>> in_json
       '{"parrot": 42, "spam": "foo"}'
       >>> json.loads(in_json) # Decode into a Python object
       {"spam" : "foo", "parrot" : 42}

It's also possible to write your own decoders and encoders to support
more types. Pretty-printing of the JSON strings is also supported.

:mod:`json` (originally called simplejson) was written by Bob
Ippolito.


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

The :mod:`plistlib` module: A Property-List Parser
--------------------------------------------------

The ``.plist`` format is commonly used on Mac OS X to
store basic data types (numbers, strings, lists,
and dictionaries) by serializing them into an XML-based format.
It resembles the XML-RPC serialization of data types.

Despite being primarily used on Mac OS X, the format
has nothing Mac-specific about it and the Python implementation works
on any platform that Python supports, so the :mod:`plistlib` module
has been promoted to the standard library.

Using the module is simple::

    import sys
    import plistlib
    import datetime

    # Create data structure
    data_struct = dict(lastAccessed=datetime.datetime.now(),
                       version=1,
                       categories=('Personal','Shared','Private'))

    # Create string containing XML.
    plist_str = plistlib.writePlistToString(data_struct)
    new_struct = plistlib.readPlistFromString(plist_str)
    print data_struct
    print new_struct

    # Write data structure to a file and read it back.
    plistlib.writePlist(data_struct, '/tmp/customizations.plist')
    new_struct = plistlib.readPlist('/tmp/customizations.plist')

    # read/writePlist accepts file-like objects as well as paths.
    plistlib.writePlist(data_struct, sys.stdout)

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

ctypes Enhancements
--------------------------------------------------

Thomas Heller continued to maintain and enhance the
:mod:`ctypes` module.

:mod:`ctypes` now supports a :class:`c_bool` datatype
that represents the C99 ``bool`` type.  (Contributed by David Remahl;
:issue:`1649190`.)

The :mod:`ctypes` string, buffer and array types have improved
support for extended slicing syntax,
where various combinations of ``(start, stop, step)`` are supplied.
(Implemented by Thomas Wouters.)

.. Revision 57769

All :mod:`ctypes` data types now support
:meth:`from_buffer` and :meth:`from_buffer_copy`
methods that create a ctypes instance based on a
provided buffer object.  :meth:`from_buffer_copy` copies
the contents of the object,
while :meth:`from_buffer` will share the same memory area.

A new calling convention tells :mod:`ctypes` to clear the ``errno`` or
Win32 LastError variables at the outset of each wrapped call.
(Implemented by Thomas Heller; :issue:`1798`.)

You can now retrieve the Unix ``errno`` variable after a function
call.  When creating a wrapped function, you can supply
``use_errno=True`` as a keyword parameter to the :func:`DLL` function
and then call the module-level methods :meth:`set_errno` and
:meth:`get_errno` to set and retrieve the error value.

The Win32 LastError variable is similarly supported by
the :func:`DLL`, :func:`OleDLL`, and :func:`WinDLL` functions.
You supply ``use_last_error=True`` as a keyword parameter
and then call the module-level methods :meth:`set_last_error`
and :meth:`get_last_error`.

The :func:`byref` function, used to retrieve a pointer to a ctypes
instance, now has an optional *offset* parameter that is a byte
count that will be added to the returned pointer.

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

Improved SSL Support
--------------------------------------------------

Bill Janssen made extensive improvements to Python 2.6's support for
the Secure Sockets Layer by adding a new module, :mod:`ssl`, that's
built atop the `OpenSSL <http://www.openssl.org/>`__ library.
This new module provides more control over the protocol negotiated,
the X.509 certificates used, and has better support for writing SSL
servers (as opposed to clients) in Python.  The existing SSL support
in the :mod:`socket` module hasn't been removed and continues to work,
though it will be removed in Python 3.0.

To use the new module, you must first create a TCP connection in the
usual way and then pass it to the :func:`ssl.wrap_socket` function.
It's possible to specify whether a certificate is required, and to
obtain certificate info by calling the :meth:`getpeercert` method.

.. seealso::

   The documentation for the :mod:`ssl` module.

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


Build and C API Changes
=======================

Changes to Python's build process and to the C API include:

* Python now must be compiled with C89 compilers (after 19
  years!).  This means that the Python source tree has dropped its
  own implementations of :cfunc:`memmove` and :cfunc:`strerror`, which
  are in the C89 standard library.

* Python 2.6 can be built with Microsoft Visual Studio 2008 (version
  9.0), and this is the new default compiler.  See the
  :file:`PCbuild` directory for the build files.  (Implemented by
  Christian Heimes.)

* On Mac OS X, Python 2.6 can be compiled as a 4-way universal build.
  The :program:`configure` script
  can take a :option:`--with-universal-archs=[32-bit|64-bit|all]`
  switch, controlling whether the binaries are built for 32-bit
  architectures (x86, PowerPC), 64-bit (x86-64 and PPC-64), or both.
  (Contributed by Ronald Oussoren.)

* The BerkeleyDB module now has a C API object, available as
  ``bsddb.db.api``.   This object can be used by other C extensions
  that wish to use the :mod:`bsddb` module for their own purposes.
  (Contributed by Duncan Grisby; :issue:`1551895`.)

* The new buffer interface, previously described in
  `the PEP 3118 section <#pep-3118-revised-buffer-protocol>`__,
  adds :cfunc:`PyObject_GetBuffer` and :cfunc:`PyBuffer_Release`,
  as well as a few other functions.

* Python's use of the C stdio library is now thread-safe, or at least
  as thread-safe as the underlying library is.  A long-standing potential
  bug occurred if one thread closed a file object while another thread
  was reading from or writing to the object.  In 2.6 file objects
  have a reference count, manipulated by the
  :cfunc:`PyFile_IncUseCount` and :cfunc:`PyFile_DecUseCount`
  functions.  File objects can't be closed unless the reference count
  is zero.  :cfunc:`PyFile_IncUseCount` should be called while the GIL
  is still held, before carrying out an I/O operation using the
  ``FILE *`` pointer, and :cfunc:`PyFile_DecUseCount` should be called
  immediately after the GIL is re-acquired.
  (Contributed by Antoine Pitrou and Gregory P. Smith.)

* Importing modules simultaneously in two different threads no longer
  deadlocks; it will now raise an :exc:`ImportError`.  A new API
  function, :cfunc:`PyImport_ImportModuleNoBlock`, will look for a
  module in ``sys.modules`` first, then try to import it after
  acquiring an import lock.  If the import lock is held by another
  thread, an :exc:`ImportError` is raised.
  (Contributed by Christian Heimes.)

* Several functions return information about the platform's
  floating-point support.  :cfunc:`PyFloat_GetMax` returns
  the maximum representable floating point value,
  and :cfunc:`PyFloat_GetMin` returns the minimum
  positive value.  :cfunc:`PyFloat_GetInfo` returns an object
  containing more information from the :file:`float.h` file, such as
  ``"mant_dig"`` (number of digits in the mantissa), ``"epsilon"``
  (smallest difference between 1.0 and the next largest value
  representable), and several others.
  (Contributed by Christian Heimes; :issue:`1534`.)

* C functions and methods that use
  :cfunc:`PyComplex_AsCComplex` will now accept arguments that
  have a :meth:`__complex__` method.  In particular, the functions in the
  :mod:`cmath` module will now accept objects with this method.
  This is a backport of a Python 3.0 change.
  (Contributed by Mark Dickinson; :issue:`1675423`.)

* Python's C API now includes two functions for case-insensitive string
  comparisons, ``PyOS_stricmp(char*, char*)``
  and ``PyOS_strnicmp(char*, char*, Py_ssize_t)``.
  (Contributed by Christian Heimes; :issue:`1635`.)

* Many C extensions define their own little macro for adding
  integers and strings to the module's dictionary in the
  ``init*`` function.  Python 2.6 finally defines standard macros
  for adding values to a module, :cmacro:`PyModule_AddStringMacro`
  and :cmacro:`PyModule_AddIntMacro()`.  (Contributed by
  Christian Heimes.)

* Some macros were renamed in both 3.0 and 2.6 to make it clearer that
  they are macros,
  not functions.  :cmacro:`Py_Size()` became :cmacro:`Py_SIZE()`,
  :cmacro:`Py_Type()` became :cmacro:`Py_TYPE()`, and
  :cmacro:`Py_Refcnt()` became :cmacro:`Py_REFCNT()`.
  The mixed-case macros are still available
  in Python 2.6 for backward compatibility.
  (:issue:`1629`)

* Distutils now places C extensions it builds in a
  different directory when running on a debug version of Python.
  (Contributed by Collin Winter; :issue:`1530959`.)

* Several basic data types, such as integers and strings, maintain
  internal free lists of objects that can be re-used.  The data
  structures for these free lists now follow a naming convention: the
  variable is always named ``free_list``, the counter is always named
  ``numfree``, and a macro ``Py<typename>_MAXFREELIST`` is
  always defined.

* A new Makefile target, "make patchcheck", prepares the Python source tree
  for making a patch: it fixes trailing whitespace in all modified
  ``.py`` files, checks whether the documentation has been changed,
  and reports whether the :file:`Misc/ACKS` and :file:`Misc/NEWS` files
  have been updated.
  (Contributed by Brett Cannon.)

  Another new target, "make profile-opt", compiles a Python binary
  using GCC's profile-guided optimization.  It compiles Python with
  profiling enabled, runs the test suite to obtain a set of profiling
  results, and then compiles using these results for optimization.
  (Contributed by Gregory P. Smith.)

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

Port-Specific Changes: Windows
-----------------------------------

* The support for Windows 95, 98, ME and NT4 has been dropped.
  Python 2.6 requires at least Windows 2000 SP4.

* The new default compiler on Windows is Visual Studio 2008 (version
  9.0). The build directories for Visual Studio 2003 (version 7.1) and
  2005 (version 8.0) were moved into the PC/ directory. The new
  :file:`PCbuild` directory supports cross compilation for X64, debug
  builds and Profile Guided Optimization (PGO). PGO builds are roughly
  10% faster than normal builds.  (Contributed by Christian Heimes
  with help from Amaury Forgeot d'Arc and Martin von Loewis.)

* The :mod:`msvcrt` module now supports
  both the normal and wide char variants of the console I/O
  API.  The :func:`getwch` function reads a keypress and returns a Unicode
  value, as does the :func:`getwche` function.  The :func:`putwch` function
  takes a Unicode character and writes it to the console.
  (Contributed by Christian Heimes.)

* :func:`os.path.expandvars` will now expand environment variables in
  the form "%var%", and "~user" will be expanded into the user's home
  directory path.  (Contributed by Josiah Carlson; :issue:`957650`.)

* The :mod:`socket` module's socket objects now have an
  :meth:`ioctl` method that provides a limited interface to the
  :cfunc:`WSAIoctl` system interface.

* The :mod:`_winreg` module now has a function,
  :func:`ExpandEnvironmentStrings`,
  that expands environment variable references such as ``%NAME%``
  in an input string.  The handle objects provided by this
  module now support the context protocol, so they can be used
  in :keyword:`with` statements. (Contributed by Christian Heimes.)

  :mod:`_winreg` also has better support for x64 systems,
  exposing the :func:`DisableReflectionKey`, :func:`EnableReflectionKey`,
  and :func:`QueryReflectionKey` functions, which enable and disable
  registry reflection for 32-bit processes running on 64-bit systems.
  (:issue:`1753245`)

* The :mod:`msilib` module's :class:`Record` object
  gained :meth:`GetInteger` and :meth:`GetString` methods that
  return field values as an integer or a string.
  (Contributed by Floris Bruynooghe; :issue:`2125`.)

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

Port-Specific Changes: Mac OS X
-----------------------------------

* When compiling a framework build of Python, you can now specify the
  framework name to be used by providing the
  :option:`--with-framework-name=` option to the
  :program:`configure` script.

* The :mod:`macfs` module has been removed.  This in turn required the
  :func:`macostools.touched` function to be removed because it depended on the
  :mod:`macfs` module.  (:issue:`1490190`)

* Many other Mac OS modules have been deprecated and will removed in
  Python 3.0:
  :mod:`_builtinSuites`,
  :mod:`aepack`,
  :mod:`aetools`,
  :mod:`aetypes`,
  :mod:`applesingle`,
  :mod:`appletrawmain`,
  :mod:`appletrunner`,
  :mod:`argvemulator`,
  :mod:`Audio_mac`,
  :mod:`autoGIL`,
  :mod:`Carbon`,
  :mod:`cfmfile`,
  :mod:`CodeWarrior`,
  :mod:`ColorPicker`,
  :mod:`EasyDialogs`,
  :mod:`Explorer`,
  :mod:`Finder`,
  :mod:`FrameWork`,
  :mod:`findertools`,
  :mod:`ic`,
  :mod:`icglue`,
  :mod:`icopen`,
  :mod:`macerrors`,
  :mod:`MacOS`,
  :mod:`macfs`,
  :mod:`macostools`,
  :mod:`macresource`,
  :mod:`MiniAEFrame`,
  :mod:`Nav`,
  :mod:`Netscape`,
  :mod:`OSATerminology`,
  :mod:`pimp`,
  :mod:`PixMapWrapper`,
  :mod:`StdSuites`,
  :mod:`SystemEvents`,
  :mod:`Terminal`, and
  :mod:`terminalcommand`.

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

Port-Specific Changes: IRIX
-----------------------------------

A number of old IRIX-specific modules were deprecated and will
be removed in Python 3.0:
:mod:`al` and :mod:`AL`,
:mod:`cd`,
:mod:`cddb`,
:mod:`cdplayer`,
:mod:`CL` and :mod:`cl`,
:mod:`DEVICE`,
:mod:`ERRNO`,
:mod:`FILE`,
:mod:`FL` and :mod:`fl`,
:mod:`flp`,
:mod:`fm`,
:mod:`GET`,
:mod:`GLWS`,
:mod:`GL` and :mod:`gl`,
:mod:`IN`,
:mod:`IOCTL`,
:mod:`jpeg`,
:mod:`panelparser`,
:mod:`readcd`,
:mod:`SV` and :mod:`sv`,
:mod:`torgb`,
:mod:`videoreader`, and
:mod:`WAIT`.

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


Porting to Python 2.6
=====================

This section lists previously described changes and other bugfixes
that may require changes to your code:

* Classes that aren't supposed to be hashable should
  set ``__hash__ = None`` in their definitions to indicate
  the fact.

* String exceptions have been removed.  Attempting to use them raises a
  :exc:`TypeError`.

* The :meth:`__init__` method of :class:`collections.deque`
  now clears any existing contents of the deque
  before adding elements from the iterable.  This change makes the
  behavior match ``list.__init__()``.

* :meth:`object.__init__` previously accepted arbitrary arguments and
  keyword arguments, ignoring them.  In Python 2.6, this is no longer
  allowed and will result in a :exc:`TypeError`.  This will affect
  :meth:`__init__` methods that end up calling the corresponding
  method on :class:`object` (perhaps through using :func:`super`).
  See :issue:`1683368` for discussion.

* The :class:`Decimal` constructor now accepts leading and trailing
  whitespace when passed a string.  Previously it would raise an
  :exc:`InvalidOperation` exception.  On the other hand, the
  :meth:`create_decimal` method of :class:`Context` objects now
  explicitly disallows extra whitespace, raising a
  :exc:`ConversionSyntax` exception.

* Due to an implementation accident, if you passed a file path to
  the built-in  :func:`__import__` function, it would actually import
  the specified file.  This was never intended to work, however, and
  the implementation now explicitly checks for this case and raises
  an :exc:`ImportError`.

* C API: the :cfunc:`PyImport_Import` and :cfunc:`PyImport_ImportModule`
  functions now default to absolute imports, not relative imports.
  This will affect C extensions that import other modules.

* C API: extension data types that shouldn't be hashable
  should define their ``tp_hash`` slot to
  :cfunc:`PyObject_HashNotImplemented`.

* The :mod:`socket` module exception :exc:`socket.error` now inherits
  from :exc:`IOError`.  Previously it wasn't a subclass of
  :exc:`StandardError` but now it is, through :exc:`IOError`.
  (Implemented by Gregory P. Smith; :issue:`1706815`.)

* The :mod:`xmlrpclib` module no longer automatically converts
  :class:`datetime.date` and :class:`datetime.time` to the
  :class:`xmlrpclib.DateTime` type; the conversion semantics were
  not necessarily correct for all applications.  Code using
  :mod:`xmlrpclib` should convert :class:`date` and :class:`time`
  instances. (:issue:`1330538`)

* (3.0-warning mode) The :class:`Exception` class now warns
  when accessed using slicing or index access; having
  :class:`Exception` behave like a tuple is being phased out.

* (3.0-warning mode) inequality comparisons between two dictionaries
  or two objects that don't implement comparison methods are reported
  as warnings.  ``dict1 == dict2`` still works, but ``dict1 < dict2``
  is being phased out.

  Comparisons between cells, which are an implementation detail of Python's
  scoping rules, also cause warnings because such comparisons are forbidden
  entirely in 3.0.

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


.. _26acks:

Acknowledgements
================

The author would like to thank the following people for offering
suggestions, corrections and assistance with various drafts of this
article: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy,
Jim Jewett, Kent Johnson, Chris Lambacher,  Martin Michlmayr,
Antoine Pitrou, Brian Warner.

