****************************
  What's New in Python 2.7
****************************

:Author: A.M. Kuchling (amk at amk.ca)

..  hyperlink all the methods & functions.

.. T_STRING_INPLACE not described in main docs

.. $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.7.  Python 2.7 was released
on July 3, 2010.

Numeric handling has been improved in many ways, for both
floating-point numbers and for the :class:`~decimal.Decimal` class.
There are some useful additions to the standard library, such as a
greatly enhanced :mod:`unittest` module, the :mod:`argparse` module
for parsing command-line options, convenient :class:`~collections.OrderedDict`
and :class:`~collections.Counter` classes in the :mod:`collections` module,
and many other improvements.

Python 2.7 is planned to be the last of the 2.x releases, so we worked
on making it a good release for the long term.  To help with porting
to Python 3, several new features from the Python 3.x series have been
included in 2.7.

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.7 at
https://docs.python.org. If you want to understand the rationale for
the design and implementation, refer to the PEP for a particular new
feature or the issue on https://bugs.python.org in which a change was
discussed.  Whenever possible, "What's New in Python" links to the
bug/patch item for each change.

.. _whatsnew27-python31:

The Future for Python 2.x
=========================

Python 2.7 is the last major release in the 2.x series, as the Python
maintainers have shifted the focus of their new feature development efforts
to the Python 3.x series. This means that while Python 2 continues to
receive bug fixes, and to be updated to build correctly on new hardware and
versions of supported operated systems, there will be no new full feature
releases for the language or standard library.

However, while there is a large common subset between Python 2.7 and Python
3, and many of the changes involved in migrating to that common subset, or
directly to Python 3, can be safely automated, some other changes (notably
those associated with Unicode handling) may require careful consideration,
and preferably robust automated regression test suites, to migrate
effectively.

This means that Python 2.7 will remain in place for a long time, providing a
stable and supported base platform for production systems that have not yet
been ported to Python 3. The full expected lifecycle of the Python 2.7
series is detailed in :pep:`373`.

Some key consequences of the long-term significance of 2.7 are:

* As noted above, the 2.7 release has a much longer period of maintenance
  when compared to earlier 2.x versions. Python 2.7 is currently expected to
  remain supported by the core development team (receiving security updates
  and other bug fixes) until at least 2020 (10 years after its initial
  release, compared to the more typical support period of 18--24 months).

* As the Python 2.7 standard library ages, making effective use of the
  Python Package Index (either directly or via a redistributor) becomes
  more important for Python 2 users. In addition to a wide variety of third
  party packages for various tasks, the available packages include backports
  of new modules and features from the Python 3 standard library that are
  compatible with Python 2, as well as various tools and libraries that can
  make it easier to migrate to Python 3. The `Python Packaging User Guide
  <https://packaging.python.org>`__ provides guidance on downloading and
  installing software from the Python Package Index.

* While the preferred approach to enhancing Python 2 is now the publication
  of new packages on the Python Package Index, this approach doesn't
  necessarily work in all cases, especially those related to network
  security. In exceptional cases that cannot be handled adequately by
  publishing new or updated packages on PyPI, the Python Enhancement
  Proposal process may be used to make the case for adding new features
  directly to the Python 2 standard library. Any such additions, and the
  maintenance releases where they were added, will be noted in the
  :ref:`py27-maintenance-enhancements` section below.

For projects wishing to migrate from Python 2 to Python 3, or for library
and framework developers wishing to support users on both Python 2 and
Python 3, there are a variety of tools and guides available to help decide
on a suitable approach and manage some of the technical details involved.
The recommended starting point is the :ref:`pyporting-howto` HOWTO guide.


Changes to the Handling of Deprecation Warnings
===============================================

For Python 2.7, a policy decision was made to silence warnings only of
interest to developers by default.  :exc:`DeprecationWarning` and its
descendants are now ignored unless otherwise requested, preventing
users from seeing warnings triggered by an application.  This change
was also made in the branch that became Python 3.2. (Discussed
on stdlib-sig and carried out in :issue:`7319`.)

In previous releases, :exc:`DeprecationWarning` messages were
enabled by default, providing Python developers with a clear
indication of where their code may break in a future major version
of Python.

However, there are increasingly many users of Python-based
applications who are not directly involved in the development of
those applications.  :exc:`DeprecationWarning` messages are
irrelevant to such users, making them worry about an application
that's actually working correctly and burdening application developers
with responding to these concerns.

You can re-enable display of :exc:`DeprecationWarning` messages by
running Python with the :option:`-Wdefault <-W>` (short form:
:option:`-Wd <-W>`) switch, or by setting the :envvar:`PYTHONWARNINGS`
environment variable to ``"default"`` (or ``"d"``) before running
Python.  Python code can also re-enable them
by calling ``warnings.simplefilter('default')``.

The ``unittest`` module also automatically reenables deprecation warnings
when running tests.


Python 3.1 Features
=======================

Much as Python 2.6 incorporated features from Python 3.0,
version 2.7 incorporates some of the new features
in Python 3.1.  The 2.x series continues to provide tools
for migrating to the 3.x series.

A partial list of 3.1 features that were backported to 2.7:

* The syntax for set literals (``{1,2,3}`` is a mutable set).
* Dictionary and set comprehensions (``{i: i*2 for i in range(3)}``).
* Multiple context managers in a single :keyword:`with` statement.
* A new version of the :mod:`io` library, rewritten in C for performance.
* The ordered-dictionary type described in :ref:`pep-0372`.
* The new ``","`` format specifier described in :ref:`pep-0378`.
* The :class:`memoryview` object.
* A small subset of the :mod:`importlib` module,
  `described below <#importlib-section>`__.
* The :func:`repr` of a float ``x`` is shorter in many cases: it's now
  based on the shortest decimal string that's guaranteed to round back
  to ``x``.  As in previous versions of Python, it's guaranteed that
  ``float(repr(x))`` recovers ``x``.
* Float-to-string and string-to-float conversions are correctly rounded.
  The :func:`round` function is also now correctly rounded.
* The :c:type:`PyCapsule` type, used to provide a C API for extension modules.
* The :c:func:`PyLong_AsLongAndOverflow` C API function.

Other new Python3-mode warnings include:

* :func:`operator.isCallable` and :func:`operator.sequenceIncludes`,
  which are not supported in 3.x, now trigger warnings.
* The :option:`!-3` switch now automatically
  enables the :option:`!-Qwarn` switch that causes warnings
  about using classic division with integers and long integers.



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

.. _pep-0372:

PEP 372: Adding an Ordered Dictionary to collections
====================================================

Regular Python dictionaries iterate over key/value pairs in arbitrary order.
Over the years, a number of authors have written alternative implementations
that remember the order that the keys were originally inserted.  Based on
the experiences from those implementations, 2.7 introduces a new
:class:`~collections.OrderedDict` class in the :mod:`collections` module.

The :class:`~collections.OrderedDict` API provides the same interface as regular
dictionaries but iterates over keys and values in a guaranteed order
depending on when a key was first inserted::

    >>> from collections import OrderedDict
    >>> d = OrderedDict([('first', 1),
    ...                  ('second', 2),
    ...                  ('third', 3)])
    >>> d.items()
    [('first', 1), ('second', 2), ('third', 3)]

If a new entry overwrites an existing entry, the original insertion
position is left unchanged::

    >>> d['second'] = 4
    >>> d.items()
    [('first', 1), ('second', 4), ('third', 3)]

Deleting an entry and reinserting it will move it to the end::

    >>> del d['second']
    >>> d['second'] = 5
    >>> d.items()
    [('first', 1), ('third', 3), ('second', 5)]

The :meth:`~collections.OrderedDict.popitem` method has an optional *last*
argument that defaults to ``True``.  If *last* is true, the most recently
added key is returned and removed; if it's false, the
oldest key is selected::

    >>> od = OrderedDict([(x,0) for x in range(20)])
    >>> od.popitem()
    (19, 0)
    >>> od.popitem()
    (18, 0)
    >>> od.popitem(last=False)
    (0, 0)
    >>> od.popitem(last=False)
    (1, 0)

Comparing two ordered dictionaries checks both the keys and values,
and requires that the insertion order was the same::

    >>> od1 = OrderedDict([('first', 1),
    ...                    ('second', 2),
    ...                    ('third', 3)])
    >>> od2 = OrderedDict([('third', 3),
    ...                    ('first', 1),
    ...                    ('second', 2)])
    >>> od1 == od2
    False
    >>> # Move 'third' key to the end
    >>> del od2['third']; od2['third'] = 3
    >>> od1 == od2
    True

Comparing an :class:`~collections.OrderedDict` with a regular dictionary
ignores the insertion order and just compares the keys and values.

How does the :class:`~collections.OrderedDict` work?  It maintains a
doubly-linked list of keys, appending new keys to the list as they're inserted.
A secondary dictionary maps keys to their corresponding list node, so
deletion doesn't have to traverse the entire linked list and therefore
remains O(1).

The standard library now supports use of ordered dictionaries in several
modules.

* The :mod:`ConfigParser` module uses them by default, meaning that
  configuration files can now be read, modified, and then written back
  in their original order.

* The :meth:`~collections.somenamedtuple._asdict()` method for
  :func:`collections.namedtuple` now returns an ordered dictionary with the
  values appearing in the same order as the underlying tuple indices.

* The :mod:`json` module's :class:`~json.JSONDecoder` class
  constructor was extended with an *object_pairs_hook* parameter to
  allow :class:`OrderedDict` instances to be built by the decoder.
  Support was also added for third-party tools like
  `PyYAML <http://pyyaml.org/>`_.

.. seealso::

   :pep:`372` - Adding an ordered dictionary to collections
     PEP written by Armin Ronacher and Raymond Hettinger;
     implemented by Raymond Hettinger.

.. _pep-0378:

PEP 378: Format Specifier for Thousands Separator
=================================================

To make program output more readable, it can be useful to add
separators to large numbers, rendering them as
18,446,744,073,709,551,616 instead of 18446744073709551616.

The fully general solution for doing this is the :mod:`locale` module,
which can use different separators ("," in North America, "." in
Europe) and different grouping sizes, but :mod:`locale` is complicated
to use and unsuitable for multi-threaded applications where different
threads are producing output for different locales.

Therefore, a simple comma-grouping mechanism has been added to the
mini-language used by the :meth:`str.format` method.  When
formatting a floating-point number, simply include a comma between the
width and the precision::

   >>> '{:20,.2f}'.format(18446744073709551616.0)
   '18,446,744,073,709,551,616.00'

When formatting an integer, include the comma after the width:

   >>> '{:20,d}'.format(18446744073709551616)
   '18,446,744,073,709,551,616'

This mechanism is not adaptable at all; commas are always used as the
separator and the grouping is always into three-digit groups.  The
comma-formatting mechanism isn't as general as the :mod:`locale`
module, but it's easier to use.

.. seealso::

   :pep:`378` - Format Specifier for Thousands Separator
     PEP written by Raymond Hettinger; implemented by Eric Smith.

PEP 389: The argparse Module for Parsing Command Lines
======================================================

The :mod:`argparse` module for parsing command-line arguments was
added as a more powerful replacement for the
:mod:`optparse` module.

This means Python now supports three different modules for parsing
command-line arguments: :mod:`getopt`, :mod:`optparse`, and
:mod:`argparse`.  The :mod:`getopt` module closely resembles the C
library's :c:func:`getopt` function, so it remains useful if you're writing a
Python prototype that will eventually be rewritten in C.
:mod:`optparse` becomes redundant, but there are no plans to remove it
because there are many scripts still using it, and there's no
automated way to update these scripts.  (Making the :mod:`argparse`
API consistent with :mod:`optparse`'s interface was discussed but
rejected as too messy and difficult.)

In short, if you're writing a new script and don't need to worry
about compatibility with earlier versions of Python, use
:mod:`argparse` instead of :mod:`optparse`.

Here's an example::

    import argparse

    parser = argparse.ArgumentParser(description='Command-line example.')

    # Add optional switches
    parser.add_argument('-v', action='store_true', dest='is_verbose',
                        help='produce verbose output')
    parser.add_argument('-o', action='store', dest='output',
                        metavar='FILE',
                        help='direct output to FILE instead of stdout')
    parser.add_argument('-C', action='store', type=int, dest='context',
                        metavar='NUM', default=0,
                        help='display NUM lines of added context')

    # Allow any number of additional arguments.
    parser.add_argument(nargs='*', action='store', dest='inputs',
                        help='input filenames (default is stdin)')

    args = parser.parse_args()
    print args.__dict__

Unless you override it, :option:`!-h` and :option:`!--help` switches
are automatically added, and produce neatly formatted output::

    -> ./python.exe argparse-example.py --help
    usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]

    Command-line example.

    positional arguments:
      inputs      input filenames (default is stdin)

    optional arguments:
      -h, --help  show this help message and exit
      -v          produce verbose output
      -o FILE     direct output to FILE instead of stdout
      -C NUM      display NUM lines of added context

As with :mod:`optparse`, the command-line switches and arguments
are returned as an object with attributes named by the *dest* parameters::

    -> ./python.exe argparse-example.py -v
    {'output': None,
     'is_verbose': True,
     'context': 0,
     'inputs': []}

    -> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
    {'output': '/tmp/output',
     'is_verbose': True,
     'context': 4,
     'inputs': ['file1', 'file2']}

:mod:`argparse` has much fancier validation than :mod:`optparse`; you
can specify an exact number of arguments as an integer, 0 or more
arguments by passing ``'*'``, 1 or more by passing ``'+'``, or an
optional argument with ``'?'``.  A top-level parser can contain
sub-parsers to define subcommands that have different sets of
switches, as in ``svn commit``, ``svn checkout``, etc.  You can
specify an argument's type as :class:`~argparse.FileType`, which will
automatically open files for you and understands that ``'-'`` means
standard input or output.

.. seealso::

   :mod:`argparse` documentation
     The documentation page of the argparse module.

   :ref:`upgrading-optparse-code`
     Part of the Python documentation, describing how to convert
     code that uses :mod:`optparse`.

   :pep:`389` - argparse - New Command Line Parsing Module
     PEP written and implemented by Steven Bethard.

PEP 391: Dictionary-Based Configuration For Logging
====================================================

The :mod:`logging` module is very flexible; applications can define
a tree of logging subsystems, and each logger in this tree can filter
out certain messages, format them differently, and direct messages to
a varying number of handlers.

All this flexibility can require a lot of configuration.  You can
write Python statements to create objects and set their properties,
but a complex set-up requires verbose but boring code.
:mod:`logging` also supports a :func:`~logging.fileConfig`
function that parses a file, but the file format doesn't support
configuring filters, and it's messier to generate programmatically.

Python 2.7 adds a :func:`~logging.dictConfig` function that
uses a dictionary to configure logging.  There are many ways to
produce a dictionary from different sources: construct one with code;
parse a file containing JSON; or use a YAML parsing library if one is
installed.  For more information see :ref:`logging-config-api`.

The following example configures two loggers, the root logger and a
logger named "network".  Messages sent to the root logger will be
sent to the system log using the syslog protocol, and messages
to the "network" logger will be written to a :file:`network.log` file
that will be rotated once the log reaches 1MB.

::

    import logging
    import logging.config

    configdict = {
     'version': 1,    # Configuration schema in use; must be 1 for now
     'formatters': {
         'standard': {
             'format': ('%(asctime)s %(name)-15s '
                        '%(levelname)-8s %(message)s')}},

     'handlers': {'netlog': {'backupCount': 10,
                         'class': 'logging.handlers.RotatingFileHandler',
                         'filename': '/logs/network.log',
                         'formatter': 'standard',
                         'level': 'INFO',
                         'maxBytes': 1000000},
                  'syslog': {'class': 'logging.handlers.SysLogHandler',
                             'formatter': 'standard',
                             'level': 'ERROR'}},

     # Specify all the subordinate loggers
     'loggers': {
                 'network': {
                             'handlers': ['netlog']
                 }
     },
     # Specify properties of the root logger
     'root': {
              'handlers': ['syslog']
     },
    }

    # Set up configuration
    logging.config.dictConfig(configdict)

    # As an example, log two error messages
    logger = logging.getLogger('/')
    logger.error('Database not found')

    netlogger = logging.getLogger('network')
    netlogger.error('Connection failed')

Three smaller enhancements to the :mod:`logging` module, all
implemented by Vinay Sajip, are:

.. rev79293

* The :class:`~logging.handlers.SysLogHandler` class now supports
  syslogging over TCP.  The constructor has a *socktype* parameter
  giving the type of socket to use, either :const:`socket.SOCK_DGRAM`
  for UDP or :const:`socket.SOCK_STREAM` for TCP.  The default
  protocol remains UDP.

* :class:`~logging.Logger` instances gained a :meth:`~logging.Logger.getChild`
  method that retrieves a descendant logger using a relative path.
  For example, once you retrieve a logger by doing ``log = getLogger('app')``,
  calling ``log.getChild('network.listen')`` is equivalent to
  ``getLogger('app.network.listen')``.

* The :class:`~logging.LoggerAdapter` class gained an
  :meth:`~logging.LoggerAdapter.isEnabledFor` method that takes a
  *level* and returns whether the underlying logger would
  process a message of that level of importance.

.. XXX: Logger objects don't have a class declaration so the link don't work

.. seealso::

   :pep:`391` - Dictionary-Based Configuration For Logging
     PEP written and implemented by Vinay Sajip.

PEP 3106: Dictionary Views
====================================================

The dictionary methods :meth:`~dict.keys`, :meth:`~dict.values`, and
:meth:`~dict.items` are different in Python 3.x.  They return an object
called a :dfn:`view` instead of a fully materialized list.

It's not possible to change the return values of :meth:`~dict.keys`,
:meth:`~dict.values`, and :meth:`~dict.items` in Python 2.7 because
too much code would break.  Instead the 3.x versions were added
under the new names :meth:`~dict.viewkeys`, :meth:`~dict.viewvalues`,
and :meth:`~dict.viewitems`.

::

    >>> d = dict((i*10, chr(65+i)) for i in range(26))
    >>> d
    {0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
    >>> d.viewkeys()
    dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])

Views can be iterated over, but the key and item views also behave
like sets.  The ``&`` operator performs intersection, and ``|``
performs a union::

    >>> d1 = dict((i*10, chr(65+i)) for i in range(26))
    >>> d2 = dict((i**.5, i) for i in range(1000))
    >>> d1.viewkeys() & d2.viewkeys()
    set([0.0, 10.0, 20.0, 30.0])
    >>> d1.viewkeys() | range(0, 30)
    set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])

The view keeps track of the dictionary and its contents change as the
dictionary is modified::

    >>> vk = d.viewkeys()
    >>> vk
    dict_keys([0, 130, 10, ..., 250])
    >>> d[260] = '&'
    >>> vk
    dict_keys([0, 130, 260, 10, ..., 250])

However, note that you can't add or remove keys while you're iterating
over the view::

    >>> for k in vk:
    ...     d[k*2] = k
    ...
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    RuntimeError: dictionary changed size during iteration

You can use the view methods in Python 2.x code, and the 2to3
converter will change them to the standard :meth:`~dict.keys`,
:meth:`~dict.values`, and :meth:`~dict.items` methods.

.. seealso::

   :pep:`3106` - Revamping dict.keys(), .values() and .items()
     PEP written by Guido van Rossum.
     Backported to 2.7 by Alexandre Vassalotti; :issue:`1967`.


PEP 3137: The memoryview Object
====================================================

The :class:`memoryview` object provides a view of another object's
memory content that matches the :class:`bytes` type's interface.

.. doctest::
    :options: +SKIP

    >>> import string
    >>> m = memoryview(string.letters)
    >>> m
    <memory at 0x37f850>
    >>> len(m)           # Returns length of underlying object
    52
    >>> m[0], m[25], m[26]   # Indexing returns one byte
    ('a', 'z', 'A')
    >>> m2 = m[0:26]         # Slicing returns another memoryview
    >>> m2
    <memory at 0x37f080>

The content of the view can be converted to a string of bytes or
a list of integers:

.. doctest::
    :options: +SKIP

    >>> m2.tobytes()
    'abcdefghijklmnopqrstuvwxyz'
    >>> m2.tolist()
    [97, 98, 99, 100, 101, 102, 103, ... 121, 122]
    >>>

:class:`memoryview` objects allow modifying the underlying object if
it's a mutable object.

.. doctest::
    :options: +SKIP

    >>> m2[0] = 75
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: cannot modify read-only memory
    >>> b = bytearray(string.letters)  # Creating a mutable object
    >>> b
    bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
    >>> mb = memoryview(b)
    >>> mb[0] = '*'         # Assign to view, changing the bytearray.
    >>> b[0:5]              # The bytearray has been changed.
    bytearray(b'*bcde')
    >>>

.. seealso::

   :pep:`3137` - Immutable Bytes and Mutable Buffer
     PEP written by Guido van Rossum.
     Implemented by Travis Oliphant, Antoine Pitrou and others.
     Backported to 2.7 by Antoine Pitrou; :issue:`2396`.



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

Some smaller changes made to the core Python language are:

* The syntax for set literals has been backported from Python 3.x.
  Curly brackets are used to surround the contents of the resulting
  mutable set; set literals are
  distinguished from dictionaries by not containing colons and values.
  ``{}`` continues to represent an empty dictionary; use
  ``set()`` for an empty set.

  .. doctest::
    :options: +SKIP

    >>> {1, 2, 3, 4, 5}
    set([1, 2, 3, 4, 5])
    >>> set() # empty set
    set([])
    >>> {}    # empty dict
    {}

  Backported by Alexandre Vassalotti; :issue:`2335`.

* Dictionary and set comprehensions are another feature backported from
  3.x, generalizing list/generator comprehensions to use
  the literal syntax for sets and dictionaries.

  .. doctest::
    :options: +SKIP

    >>> {x: x*x for x in range(6)}
    {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
    >>> {('a'*x) for x in range(6)}
    set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])

  Backported by Alexandre Vassalotti; :issue:`2333`.

* The :keyword:`with` statement can now use multiple context managers
  in one statement.  Context managers are processed from left to right
  and each one is treated as beginning a new :keyword:`with` statement.
  This means that::

   with A() as a, B() as b:
       ... suite of statements ...

  is equivalent to::

   with A() as a:
       with B() as b:
           ... suite of statements ...

  The :func:`contextlib.nested` function provides a very similar
  function, so it's no longer necessary and has been deprecated.

  (Proposed in https://codereview.appspot.com/53094; implemented by
  Georg Brandl.)

* Conversions between floating-point numbers and strings are
  now correctly rounded on most platforms.  These conversions occur
  in many different places: :func:`str` on
  floats and complex numbers; the :class:`float` and :class:`complex`
  constructors;
  numeric formatting; serializing and
  deserializing floats and complex numbers using the
  :mod:`marshal`, :mod:`pickle`
  and :mod:`json` modules;
  parsing of float and imaginary literals in Python code;
  and :class:`~decimal.Decimal`-to-float conversion.

  Related to this, the :func:`repr` of a floating-point number *x*
  now returns a result based on the shortest decimal string that's
  guaranteed to round back to *x* under correct rounding (with
  round-half-to-even rounding mode).  Previously it gave a string
  based on rounding x to 17 decimal digits.

  .. maybe add an example?

  The rounding library responsible for this improvement works on
  Windows and on Unix platforms using the gcc, icc, or suncc
  compilers.  There may be a small number of platforms where correct
  operation of this code cannot be guaranteed, so the code is not
  used on such systems.  You can find out which code is being used
  by checking :data:`sys.float_repr_style`,  which will be ``short``
  if the new code is in use and ``legacy`` if it isn't.

  Implemented by Eric Smith and Mark Dickinson, using David Gay's
  :file:`dtoa.c` library; :issue:`7117`.

* Conversions from long integers and regular integers to floating
  point now round differently, returning the floating-point number
  closest to the number.  This doesn't matter for small integers that
  can be converted exactly, but for large numbers that will
  unavoidably lose precision, Python 2.7 now approximates more
  closely.  For example, Python 2.6 computed the following::

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935283e+20
    >>> n - long(float(n))
    65535L

  Python 2.7's floating-point result is larger, but much closer to the
  true value::

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935289e+20
    >>> n - long(float(n))
    -1L

  (Implemented by Mark Dickinson; :issue:`3166`.)

  Integer division is also more accurate in its rounding behaviours.  (Also
  implemented by Mark Dickinson; :issue:`1811`.)

* Implicit coercion for complex numbers has been removed; the interpreter
  will no longer ever attempt to call a :meth:`__coerce__` method on complex
  objects.  (Removed by Meador Inge and Mark Dickinson; :issue:`5211`.)

* The :meth:`str.format` method now supports automatic numbering of the replacement
  fields.  This makes using :meth:`str.format` more closely resemble using
  ``%s`` formatting::

    >>> '{}:{}:{}'.format(2009, 04, 'Sunday')
    '2009:4:Sunday'
    >>> '{}:{}:{day}'.format(2009, 4, day='Sunday')
    '2009:4:Sunday'

  The auto-numbering takes the fields from left to right, so the first ``{...}``
  specifier will use the first argument to :meth:`str.format`, the next
  specifier will use the next argument, and so on.  You can't mix auto-numbering
  and explicit numbering -- either number all of your specifier fields or none
  of them -- but you can mix auto-numbering and named fields, as in the second
  example above.  (Contributed by Eric Smith; :issue:`5237`.)

  Complex numbers now correctly support usage with :func:`format`,
  and default to being right-aligned.
  Specifying a precision or comma-separation applies to both the real
  and imaginary parts of the number, but a specified field width and
  alignment is applied to the whole of the resulting ``1.5+3j``
  output.  (Contributed by Eric Smith; :issue:`1588` and :issue:`7988`.)

  The 'F' format code now always formats its output using uppercase characters,
  so it will now produce 'INF' and 'NAN'.
  (Contributed by Eric Smith; :issue:`3382`.)

  A low-level change: the :meth:`object.__format__` method now triggers
  a :exc:`PendingDeprecationWarning` if it's passed a format string,
  because the :meth:`__format__` method for :class:`object` converts
  the object to a string representation and formats that.  Previously
  the method silently applied the format string to the string
  representation, but that could hide mistakes in Python code.  If
  you're supplying formatting information such as an alignment or
  precision, presumably you're expecting the formatting to be applied
  in some object-specific way.  (Fixed by Eric Smith; :issue:`7994`.)

* The :func:`int` and :func:`long` types gained a ``bit_length``
  method that returns the number of bits necessary to represent
  its argument in binary::

      >>> n = 37
      >>> bin(n)
      '0b100101'
      >>> n.bit_length()
      6
      >>> n = 2**123-1
      >>> n.bit_length()
      123
      >>> (n+1).bit_length()
      124

  (Contributed by Fredrik Johansson and Victor Stinner; :issue:`3439`.)

* The :keyword:`import` statement will no longer try an absolute import
  if a relative import (e.g. ``from .os import sep``) fails.  This
  fixes a bug, but could possibly break certain :keyword:`import`
  statements that were only working by accident.  (Fixed by Meador Inge;
  :issue:`7902`.)

* It's now possible for a subclass of the built-in :class:`unicode` type
  to override the :meth:`__unicode__` method.  (Implemented by
  Victor Stinner; :issue:`1583863`.)

* The :class:`bytearray` type's :meth:`~bytearray.translate` method now accepts
  ``None`` as its first argument.  (Fixed by Georg Brandl;
  :issue:`4759`.)

  .. XXX bytearray doesn't seem to be documented

* When using ``@classmethod`` and ``@staticmethod`` to wrap
  methods as class or static methods, the wrapper object now
  exposes the wrapped function as their :attr:`__func__` attribute.
  (Contributed by Amaury Forgeot d'Arc, after a suggestion by
  George Sakkis; :issue:`5982`.)

* When a restricted set of attributes were set using ``__slots__``,
  deleting an unset attribute would not raise :exc:`AttributeError`
  as you would expect.  Fixed by Benjamin Peterson; :issue:`7604`.)

* Two new encodings are now supported: "cp720", used primarily for
  Arabic text; and "cp858", a variant of CP 850 that adds the euro
  symbol.  (CP720 contributed by Alexander Belchenko and Amaury
  Forgeot d'Arc in :issue:`1616979`; CP858 contributed by Tim Hatch in
  :issue:`8016`.)

* The :class:`file` object will now set the :attr:`filename` attribute
  on the :exc:`IOError` exception when trying to open a directory
  on POSIX platforms (noted by Jan Kaliszewski; :issue:`4764`), and
  now explicitly checks for and forbids writing to read-only file objects
  instead of trusting the C library to catch and report the error
  (fixed by Stefan Krah; :issue:`5677`).

* The Python tokenizer now translates line endings itself, so the
  :func:`compile` built-in function now accepts code using any
  line-ending convention.  Additionally, it no longer requires that the
  code end in a newline.

* Extra parentheses in function definitions are illegal in Python 3.x,
  meaning that you get a syntax error from ``def f((x)): pass``.  In
  Python3-warning mode, Python 2.7 will now warn about this odd usage.
  (Noted by James Lingard; :issue:`7362`.)

* It's now possible to create weak references to old-style class
  objects.  New-style classes were always weak-referenceable.  (Fixed
  by Antoine Pitrou; :issue:`8268`.)

* When a module object is garbage-collected, the module's dictionary is
  now only cleared if no one else is holding a reference to the
  dictionary (:issue:`7140`).

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

.. _new-27-interpreter:

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

A new environment variable, :envvar:`PYTHONWARNINGS`,
allows controlling warnings.  It should be set to a string
containing warning settings, equivalent to those
used with the :option:`-W` switch, separated by commas.
(Contributed by Brian Curtin; :issue:`7301`.)

For example, the following setting will print warnings every time
they occur, but turn warnings from the :mod:`Cookie` module into an
error.  (The exact syntax for setting an environment variable varies
across operating systems and shells.)

::

  export PYTHONWARNINGS=all,error:::Cookie:0

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


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

Several performance enhancements have been added:

* A new opcode was added to perform the initial setup for
  :keyword:`with` statements, looking up the :meth:`__enter__` and
  :meth:`__exit__` methods.  (Contributed by Benjamin Peterson.)

* The garbage collector now performs better for one common usage
  pattern: when many objects are being allocated without deallocating
  any of them.  This would previously take quadratic
  time for garbage collection, but now the number of full garbage collections
  is reduced as the number of objects on the heap grows.
  The new logic only performs a full garbage collection pass when
  the middle generation has been collected 10 times and when the
  number of survivor objects from the middle generation exceeds 10% of
  the number of objects in the oldest generation.  (Suggested by Martin
  von Löwis and implemented by Antoine Pitrou; :issue:`4074`.)

* The garbage collector tries to avoid tracking simple containers
  which can't be part of a cycle. In Python 2.7, this is now true for
  tuples and dicts containing atomic types (such as ints, strings,
  etc.). Transitively, a dict containing tuples of atomic types won't
  be tracked either. This helps reduce the cost of each
  garbage collection by decreasing the number of objects to be
  considered and traversed by the collector.
  (Contributed by Antoine Pitrou; :issue:`4688`.)

* Long integers are now stored internally either in base 2**15 or in base
  2**30, the base being determined at build time.  Previously, they
  were always stored in base 2**15.  Using base 2**30 gives
  significant performance improvements on 64-bit machines, but
  benchmark results on 32-bit machines have been mixed.  Therefore,
  the default is to use base 2**30 on 64-bit machines and base 2**15
  on 32-bit machines; on Unix, there's a new configure option
  :option:`!--enable-big-digits` that can be used to override this default.

  Apart from the performance improvements this change should be
  invisible to end users, with one exception: for testing and
  debugging purposes there's a new structseq :data:`sys.long_info` that
  provides information about the internal format, giving the number of
  bits per digit and the size in bytes of the C type used to store
  each digit::

     >>> import sys
     >>> sys.long_info
     sys.long_info(bits_per_digit=30, sizeof_digit=4)

  (Contributed by Mark Dickinson; :issue:`4258`.)

  Another set of changes made long objects a few bytes smaller: 2 bytes
  smaller on 32-bit systems and 6 bytes on 64-bit.
  (Contributed by Mark Dickinson; :issue:`5260`.)

* The division algorithm for long integers has been made faster
  by tightening the inner loop, doing shifts instead of multiplications,
  and fixing an unnecessary extra iteration.
  Various benchmarks show speedups of between 50% and 150% for long
  integer divisions and modulo operations.
  (Contributed by Mark Dickinson; :issue:`5512`.)
  Bitwise operations are also significantly faster (initial patch by
  Gregory Smith; :issue:`1087418`).

* The implementation of ``%`` checks for the left-side operand being
  a Python string and special-cases it; this results in a 1--3%
  performance increase for applications that frequently use ``%``
  with strings, such as templating libraries.
  (Implemented by Collin Winter; :issue:`5176`.)

* List comprehensions with an ``if`` condition are compiled into
  faster bytecode.  (Patch by Antoine Pitrou, back-ported to 2.7
  by Jeffrey Yasskin; :issue:`4715`.)

* Converting an integer or long integer to a decimal string was made
  faster by special-casing base 10 instead of using a generalized
  conversion function that supports arbitrary bases.
  (Patch by Gawain Bolton; :issue:`6713`.)

* The :meth:`split`, :meth:`replace`, :meth:`rindex`,
  :meth:`rpartition`, and :meth:`rsplit` methods of string-like types
  (strings, Unicode strings, and :class:`bytearray` objects) now use a
  fast reverse-search algorithm instead of a character-by-character
  scan.  This is sometimes faster by a factor of 10.  (Added by
  Florent Xicluna; :issue:`7462` and :issue:`7622`.)

* The :mod:`pickle` and :mod:`cPickle` modules now automatically
  intern the strings used for attribute names, reducing memory usage
  of the objects resulting from unpickling.  (Contributed by Jake
  McGuire; :issue:`5084`.)

* The :mod:`cPickle` module now special-cases dictionaries,
  nearly halving the time required to pickle them.
  (Contributed by Collin Winter; :issue:`5670`.)

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

New and Improved 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.

* The :mod:`bdb` module's base debugging class :class:`~bdb.Bdb`
  gained a feature for skipping modules.  The constructor
  now takes an iterable containing glob-style patterns such as
  ``django.*``; the debugger will not step into stack frames
  from a module that matches one of these patterns.
  (Contributed by Maru Newby after a suggestion by
  Senthil Kumaran; :issue:`5142`.)

* The :mod:`binascii` module now supports the buffer API, so it can be
  used with :class:`memoryview` instances and other similar buffer objects.
  (Backported from 3.x by Florent Xicluna; :issue:`7703`.)

* Updated module: the :mod:`bsddb` module has been updated from 4.7.2devel9
  to version 4.8.4 of
  `the pybsddb package <https://www.jcea.es/programacion/pybsddb.htm>`__.
  The new version features better Python 3.x compatibility, various bug fixes,
  and adds several new BerkeleyDB flags and methods.
  (Updated by Jesús Cea Avión; :issue:`8156`.  The pybsddb
  changelog can be read at http://hg.jcea.es/pybsddb/file/tip/ChangeLog.)

* The :mod:`bz2` module's :class:`~bz2.BZ2File` now supports the context
  management protocol, so you can write ``with bz2.BZ2File(...) as f:``.
  (Contributed by Hagen Fürstenau; :issue:`3860`.)

* New class: the :class:`~collections.Counter` class in the :mod:`collections`
  module is useful for tallying data.  :class:`~collections.Counter` instances
  behave mostly like dictionaries but return zero for missing keys instead of
  raising a :exc:`KeyError`:

  .. doctest::
     :options: +NORMALIZE_WHITESPACE

     >>> from collections import Counter
     >>> c = Counter()
     >>> for letter in 'here is a sample of english text':
     ...   c[letter] += 1
     ...
     >>> c # doctest: +SKIP
     Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
     'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
     'p': 1, 'r': 1, 'x': 1})
     >>> c['e']
     5
     >>> c['z']
     0

  There are three additional :class:`~collections.Counter` methods.
  :meth:`~collections.Counter.most_common` returns the N most common
  elements and their counts.  :meth:`~collections.Counter.elements`
  returns an iterator over the contained elements, repeating each
  element as many times as its count.
  :meth:`~collections.Counter.subtract` takes an iterable and
  subtracts one for each element instead of adding; if the argument is
  a dictionary or another :class:`Counter`, the counts are
  subtracted. ::

    >>> c.most_common(5)
    [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)]
    >>> c.elements() ->
       'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ',
       'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i',
       'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's',
       's', 's', 'r', 't', 't', 'x'
    >>> c['e']
    5
    >>> c.subtract('very heavy on the letter e')
    >>> c['e']    # Count is now lower
    -1

  Contributed by Raymond Hettinger; :issue:`1696199`.

  .. revision 79660

  New class: :class:`~collections.OrderedDict` is described in the earlier
  section :ref:`pep-0372`.

  New method: The :class:`~collections.deque` data type now has a
  :meth:`~collections.deque.count` method that returns the number of
  contained elements equal to the supplied argument *x*, and a
  :meth:`~collections.deque.reverse` method that reverses the elements
  of the deque in-place.  :class:`~collections.deque` also exposes its maximum
  length as the read-only :attr:`~collections.deque.maxlen` attribute.
  (Both features added by Raymond Hettinger.)

  The :class:`~collections.namedtuple` class now has an optional *rename* parameter.
  If *rename* is true, field names that are invalid because they've
  been repeated or aren't legal Python identifiers will be
  renamed to legal names that are derived from the field's
  position within the list of fields:

     >>> from collections import namedtuple
     >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
     >>> T._fields
     ('field1', '_1', '_2', 'field2')

  (Added by Raymond Hettinger; :issue:`1818`.)

  Finally, the :class:`~collections.Mapping` abstract base class now
  returns :const:`NotImplemented` if a mapping is compared to
  another type that isn't a :class:`Mapping`.
  (Fixed by Daniel Stutzbach; :issue:`8729`.)

* Constructors for the parsing classes in the :mod:`ConfigParser` module now
  take an *allow_no_value* parameter, defaulting to false; if true,
  options without values will be allowed.  For example::

    >>> import ConfigParser, StringIO
    >>> sample_config = """
    ... [mysqld]
    ... user = mysql
    ... pid-file = /var/run/mysqld/mysqld.pid
    ... skip-bdb
    ... """
    >>> config = ConfigParser.RawConfigParser(allow_no_value=True)
    >>> config.readfp(StringIO.StringIO(sample_config))
    >>> config.get('mysqld', 'user')
    'mysql'
    >>> print config.get('mysqld', 'skip-bdb')
    None
    >>> print config.get('mysqld', 'unknown')
    Traceback (most recent call last):
      ...
    NoOptionError: No option 'unknown' in section: 'mysqld'

  (Contributed by Mats Kindahl; :issue:`7005`.)

* Deprecated function: :func:`contextlib.nested`, which allows
  handling more than one context manager with a single :keyword:`with`
  statement, has been deprecated, because the :keyword:`with` statement
  now supports multiple context managers.

* The :mod:`cookielib` module now ignores cookies that have an invalid
  version field, one that doesn't contain an integer value.  (Fixed by
  John J. Lee; :issue:`3924`.)

* The :mod:`copy` module's :func:`~copy.deepcopy` function will now
  correctly copy bound instance methods.  (Implemented by
  Robert Collins; :issue:`1515`.)

* The :mod:`ctypes` module now always converts ``None`` to a C NULL
  pointer for arguments declared as pointers.  (Changed by Thomas
  Heller; :issue:`4606`.)  The underlying `libffi library
  <https://sourceware.org/libffi/>`__ has been updated to version
  3.0.9, containing various fixes for different platforms.  (Updated
  by Matthias Klose; :issue:`8142`.)

* New method: the :mod:`datetime` module's :class:`~datetime.timedelta` class
  gained a :meth:`~datetime.timedelta.total_seconds` method that returns the
  number of seconds in the duration.  (Contributed by Brian Quinlan; :issue:`5788`.)

* New method: the :class:`~decimal.Decimal` class gained a
  :meth:`~decimal.Decimal.from_float` class method that performs an exact
  conversion of a floating-point number to a :class:`~decimal.Decimal`.
  This exact conversion strives for the
  closest decimal approximation to the floating-point representation's value;
  the resulting decimal value will therefore still include the inaccuracy,
  if any.
  For example, ``Decimal.from_float(0.1)`` returns
  ``Decimal('0.1000000000000000055511151231257827021181583404541015625')``.
  (Implemented by Raymond Hettinger; :issue:`4796`.)

  Comparing instances of :class:`~decimal.Decimal` with floating-point
  numbers now produces sensible results based on the numeric values
  of the operands.  Previously such comparisons would fall back to
  Python's default rules for comparing objects, which produced arbitrary
  results based on their type.  Note that you still cannot combine
  :class:`Decimal` and floating-point in other operations such as addition,
  since you should be explicitly choosing how to convert between float and
  :class:`~decimal.Decimal`.  (Fixed by Mark Dickinson; :issue:`2531`.)

  The constructor for :class:`~decimal.Decimal` now accepts
  floating-point numbers (added by Raymond Hettinger; :issue:`8257`)
  and non-European Unicode characters such as Arabic-Indic digits
  (contributed by Mark Dickinson; :issue:`6595`).

  Most of the methods of the :class:`~decimal.Context` class now accept integers
  as well as :class:`~decimal.Decimal` instances; the only exceptions are the
  :meth:`~decimal.Context.canonical` and :meth:`~decimal.Context.is_canonical`
  methods.  (Patch by Juan José Conti; :issue:`7633`.)

  When using :class:`~decimal.Decimal` instances with a string's
  :meth:`~str.format` method, the default alignment was previously
  left-alignment.  This has been changed to right-alignment, which is
  more sensible for numeric types.  (Changed by Mark Dickinson; :issue:`6857`.)

  Comparisons involving a signaling NaN value (or ``sNAN``) now signal
  :const:`InvalidOperation` instead of silently returning a true or
  false value depending on the comparison operator.  Quiet NaN values
  (or ``NaN``) are now hashable.  (Fixed by Mark Dickinson;
  :issue:`7279`.)

* The :mod:`difflib` module now produces output that is more
  compatible with modern :command:`diff`/:command:`patch` tools
  through one small change, using a tab character instead of spaces as
  a separator in the header giving the filename.  (Fixed by Anatoly
  Techtonik; :issue:`7585`.)

* The Distutils ``sdist`` command now always regenerates the
  :file:`MANIFEST` file, since even if the :file:`MANIFEST.in` or
  :file:`setup.py` files haven't been modified, the user might have
  created some new files that should be included.
  (Fixed by Tarek Ziadé; :issue:`8688`.)

* The :mod:`doctest` module's :const:`IGNORE_EXCEPTION_DETAIL` flag
  will now ignore the name of the module containing the exception
  being tested.  (Patch by Lennart Regebro; :issue:`7490`.)

* The :mod:`email` module's :class:`~email.message.Message` class will
  now accept a Unicode-valued payload, automatically converting the
  payload to the encoding specified by :attr:`output_charset`.
  (Added by R. David Murray; :issue:`1368247`.)

* The :class:`~fractions.Fraction` class now accepts a single float or
  :class:`~decimal.Decimal` instance, or two rational numbers, as
  arguments to its constructor.  (Implemented by Mark Dickinson;
  rationals added in :issue:`5812`, and float/decimal in
  :issue:`8294`.)

  Ordering comparisons (``<``, ``<=``, ``>``, ``>=``) between
  fractions and complex numbers now raise a :exc:`TypeError`.
  This fixes an oversight, making the :class:`~fractions.Fraction`
  match the other numeric types.

  .. revision 79455

* New class: :class:`~ftplib.FTP_TLS` in
  the :mod:`ftplib` module provides secure FTP
  connections using TLS encapsulation of authentication as well as
  subsequent control and data transfers.
  (Contributed by Giampaolo Rodola; :issue:`2054`.)

  The :meth:`~ftplib.FTP.storbinary` method for binary uploads can now restart
  uploads thanks to an added *rest* parameter (patch by Pablo Mouzo;
  :issue:`6845`.)

* New class decorator: :func:`~functools.total_ordering` in the :mod:`functools`
  module takes a class that defines an :meth:`__eq__` method and one of
  :meth:`__lt__`, :meth:`__le__`, :meth:`__gt__`, or :meth:`__ge__`,
  and generates the missing comparison methods.  Since the
  :meth:`__cmp__` method is being deprecated in Python 3.x,
  this decorator makes it easier to define ordered classes.
  (Added by Raymond Hettinger; :issue:`5479`.)

  New function: :func:`~functools.cmp_to_key` will take an old-style comparison
  function that expects two arguments and return a new callable that
  can be used as the *key* parameter to functions such as
  :func:`sorted`, :func:`min` and :func:`max`, etc.  The primary
  intended use is to help with making code compatible with Python 3.x.
  (Added by Raymond Hettinger.)

* New function: the :mod:`gc` module's :func:`~gc.is_tracked` returns
  true if a given instance is tracked by the garbage collector, false
  otherwise. (Contributed by Antoine Pitrou; :issue:`4688`.)

* The :mod:`gzip` module's :class:`~gzip.GzipFile` now supports the context
  management protocol, so you can write ``with gzip.GzipFile(...) as f:``
  (contributed by Hagen Fürstenau; :issue:`3860`), and it now implements
  the :class:`io.BufferedIOBase` ABC, so you can wrap it with
  :class:`io.BufferedReader` for faster processing
  (contributed by Nir Aides; :issue:`7471`).
  It's also now possible to override the modification time
  recorded in a gzipped file by providing an optional timestamp to
  the constructor.  (Contributed by Jacques Frechet; :issue:`4272`.)

  Files in gzip format can be padded with trailing zero bytes; the
  :mod:`gzip` module will now consume these trailing bytes.  (Fixed by
  Tadek Pietraszek and Brian Curtin; :issue:`2846`.)

* New attribute: the :mod:`hashlib` module now has an :attr:`~hashlib.hashlib.algorithms`
  attribute containing a tuple naming the supported algorithms.
  In Python 2.7, ``hashlib.algorithms`` contains
  ``('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')``.
  (Contributed by Carl Chenet; :issue:`7418`.)

* The default :class:`~httplib.HTTPResponse` class used by the :mod:`httplib` module now
  supports buffering, resulting in much faster reading of HTTP responses.
  (Contributed by Kristján Valur Jónsson; :issue:`4879`.)

  The :class:`~httplib.HTTPConnection` and :class:`~httplib.HTTPSConnection` classes
  now support a *source_address* parameter, a ``(host, port)`` 2-tuple
  giving the source address that will be used for the connection.
  (Contributed by Eldon Ziegler; :issue:`3972`.)

* The :mod:`ihooks` module now supports relative imports.  Note that
  :mod:`ihooks` is an older module for customizing imports,
  superseded by the :mod:`imputil` module added in Python 2.0.
  (Relative import support added by Neil Schemenauer.)

  .. revision 75423

* The :mod:`imaplib` module now supports IPv6 addresses.
  (Contributed by Derek Morr; :issue:`1655`.)

* New function: the :mod:`inspect` module's :func:`~inspect.getcallargs`
  takes a callable and its positional and keyword arguments,
  and figures out which of the callable's parameters will receive each argument,
  returning a dictionary mapping argument names to their values.  For example::

    >>> from inspect import getcallargs
    >>> def f(a, b=1, *pos, **named):
    ...     pass
    >>> getcallargs(f, 1, 2, 3)
    {'a': 1, 'b': 2, 'pos': (3,), 'named': {}}
    >>> getcallargs(f, a=2, x=4)
    {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}}
    >>> getcallargs(f)
    Traceback (most recent call last):
    ...
    TypeError: f() takes at least 1 argument (0 given)

  Contributed by George Sakkis; :issue:`3135`.

* Updated module: The :mod:`io` library has been upgraded to the version shipped with
  Python 3.1.  For 3.1, the I/O library was entirely rewritten in C
  and is 2 to 20 times faster depending on the task being performed.  The
  original Python version was renamed to the :mod:`_pyio` module.

  One minor resulting change: the :class:`io.TextIOBase` class now
  has an :attr:`errors` attribute giving the error setting
  used for encoding and decoding errors (one of ``'strict'``, ``'replace'``,
  ``'ignore'``).

  The :class:`io.FileIO` class now raises an :exc:`OSError` when passed
  an invalid file descriptor.  (Implemented by Benjamin Peterson;
  :issue:`4991`.)  The :meth:`~io.IOBase.truncate` method now preserves the
  file position; previously it would change the file position to the
  end of the new file.  (Fixed by Pascal Chambon; :issue:`6939`.)

* New function: ``itertools.compress(data, selectors)`` takes two
  iterators.  Elements of *data* are returned if the corresponding
  value in *selectors* is true::

    itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
      A, C, E, F

  .. maybe here is better to use >>> list(itertools.compress(...)) instead

  New function: ``itertools.combinations_with_replacement(iter, r)``
  returns all the possible *r*-length combinations of elements from the
  iterable *iter*.  Unlike :func:`~itertools.combinations`, individual elements
  can be repeated in the generated combinations::

    itertools.combinations_with_replacement('abc', 2) =>
      ('a', 'a'), ('a', 'b'), ('a', 'c'),
      ('b', 'b'), ('b', 'c'), ('c', 'c')

  Note that elements are treated as unique depending on their position
  in the input, not their actual values.

  The :func:`itertools.count` function now has a *step* argument that
  allows incrementing by values other than 1.  :func:`~itertools.count` also
  now allows keyword arguments, and using non-integer values such as
  floats or :class:`~decimal.Decimal` instances.  (Implemented by Raymond
  Hettinger; :issue:`5032`.)

  :func:`itertools.combinations` and :func:`itertools.product`
  previously raised :exc:`ValueError` for values of *r* larger than
  the input iterable.  This was deemed a specification error, so they
  now return an empty iterator.  (Fixed by Raymond Hettinger; :issue:`4816`.)

* Updated module: The :mod:`json` module was upgraded to version 2.0.9 of the
  simplejson package, which includes a C extension that makes
  encoding and decoding faster.
  (Contributed by Bob Ippolito; :issue:`4136`.)

  To support the new :class:`collections.OrderedDict` type, :func:`json.load`
  now has an optional *object_pairs_hook* parameter that will be called
  with any object literal that decodes to a list of pairs.
  (Contributed by Raymond Hettinger; :issue:`5381`.)

* The :mod:`mailbox` module's :class:`~mailbox.Maildir` class now records the
  timestamp on the directories it reads, and only re-reads them if the
  modification time has subsequently changed.  This improves
  performance by avoiding unneeded directory scans.  (Fixed by
  A.M. Kuchling and Antoine Pitrou; :issue:`1607951`, :issue:`6896`.)

* New functions: the :mod:`math` module gained
  :func:`~math.erf` and :func:`~math.erfc` for the error function and the complementary error function,
  :func:`~math.expm1` which computes ``e**x - 1`` with more precision than
  using :func:`~math.exp` and subtracting 1,
  :func:`~math.gamma` for the Gamma function, and
  :func:`~math.lgamma` for the natural log of the Gamma function.
  (Contributed by Mark Dickinson and nirinA raseliarison; :issue:`3366`.)

* The :mod:`multiprocessing` module's :class:`Manager*` classes
  can now be passed a callable that will be called whenever
  a subprocess is started, along with a set of arguments that will be
  passed to the callable.
  (Contributed by lekma; :issue:`5585`.)

  The :class:`~multiprocessing.Pool` class, which controls a pool of worker processes,
  now has an optional *maxtasksperchild* parameter.  Worker processes
  will perform the specified number of tasks and then exit, causing the
  :class:`~multiprocessing.Pool` to start a new worker.  This is useful if tasks may leak
  memory or other resources, or if some tasks will cause the worker to
  become very large.
  (Contributed by Charles Cazabon; :issue:`6963`.)

* The :mod:`nntplib` module now supports IPv6 addresses.
  (Contributed by Derek Morr; :issue:`1664`.)

* New functions: the :mod:`os` module wraps the following POSIX system
  calls: :func:`~os.getresgid` and :func:`~os.getresuid`, which return the
  real, effective, and saved GIDs and UIDs;
  :func:`~os.setresgid` and :func:`~os.setresuid`, which set
  real, effective, and saved GIDs and UIDs to new values;
  :func:`~os.initgroups`, which initialize the group access list
  for the current process.  (GID/UID functions
  contributed by Travis H.; :issue:`6508`.  Support for initgroups added
  by Jean-Paul Calderone; :issue:`7333`.)

  The :func:`os.fork` function now re-initializes the import lock in
  the child process; this fixes problems on Solaris when :func:`~os.fork`
  is called from a thread.  (Fixed by Zsolt Cserna; :issue:`7242`.)

* In the :mod:`os.path` module, the :func:`~os.path.normpath` and
  :func:`~os.path.abspath` functions now preserve Unicode; if their input path
  is a Unicode string, the return value is also a Unicode string.
  (:meth:`~os.path.normpath` fixed by Matt Giuca in :issue:`5827`;
  :meth:`~os.path.abspath` fixed by Ezio Melotti in :issue:`3426`.)

* The :mod:`pydoc` module now has help for the various symbols that Python
  uses.  You can now do ``help('<<')`` or ``help('@')``, for example.
  (Contributed by David Laban; :issue:`4739`.)

* The :mod:`re` module's :func:`~re.split`, :func:`~re.sub`, and :func:`~re.subn`
  now accept an optional *flags* argument, for consistency with the
  other functions in the module.  (Added by Gregory P. Smith.)

* New function: :func:`~runpy.run_path` in the :mod:`runpy` module
  will execute the code at a provided *path* argument.  *path* can be
  the path of a Python source file (:file:`example.py`), a compiled
  bytecode file (:file:`example.pyc`), a directory
  (:file:`./package/`), or a zip archive (:file:`example.zip`).  If a
  directory or zip path is provided, it will be added to the front of
  ``sys.path`` and the module :mod:`__main__` will be imported.  It's
  expected that the directory or zip contains a :file:`__main__.py`;
  if it doesn't, some other :file:`__main__.py` might be imported from
  a location later in ``sys.path``.  This makes more of the machinery
  of :mod:`runpy` available to scripts that want to mimic the way
  Python's command line processes an explicit path name.
  (Added by Nick Coghlan; :issue:`6816`.)

* New function: in the :mod:`shutil` module, :func:`~shutil.make_archive`
  takes a filename, archive type (zip or tar-format), and a directory
  path, and creates an archive containing the directory's contents.
  (Added by Tarek Ziadé.)

  :mod:`shutil`'s :func:`~shutil.copyfile` and :func:`~shutil.copytree`
  functions now raise a :exc:`~shutil.SpecialFileError` exception when
  asked to copy a named pipe.  Previously the code would treat
  named pipes like a regular file by opening them for reading, and
  this would block indefinitely.  (Fixed by Antoine Pitrou; :issue:`3002`.)

* The :mod:`signal` module no longer re-installs the signal handler
  unless this is truly necessary, which fixes a bug that could make it
  impossible to catch the EINTR signal robustly.  (Fixed by
  Charles-Francois Natali; :issue:`8354`.)

* New functions: in the :mod:`site` module, three new functions
  return various site- and user-specific paths.
  :func:`~site.getsitepackages` returns a list containing all
  global site-packages directories,
  :func:`~site.getusersitepackages` returns the path of the user's
  site-packages directory, and
  :func:`~site.getuserbase` returns the value of the :envvar:`USER_BASE`
  environment variable, giving the path to a directory that can be used
  to store data.
  (Contributed by Tarek Ziadé; :issue:`6693`.)

  The :mod:`site` module now reports exceptions occurring
  when the :mod:`sitecustomize` module is imported, and will no longer
  catch and swallow the :exc:`KeyboardInterrupt` exception.  (Fixed by
  Victor Stinner; :issue:`3137`.)

* The :func:`~socket.create_connection` function
  gained a *source_address* parameter, a ``(host, port)`` 2-tuple
  giving the source address that will be used for the connection.
  (Contributed by Eldon Ziegler; :issue:`3972`.)

  The :meth:`~socket.socket.recv_into` and :meth:`~socket.socket.recvfrom_into`
  methods will now write into objects that support the buffer API, most usefully
  the :class:`bytearray` and :class:`memoryview` objects.  (Implemented by
  Antoine Pitrou; :issue:`8104`.)

* The :mod:`SocketServer` module's :class:`~SocketServer.TCPServer` class now
  supports socket timeouts and disabling the Nagle algorithm.
  The :attr:`~SocketServer.TCPServer.disable_nagle_algorithm` class attribute
  defaults to ``False``; if overridden to be true,
  new request connections will have the TCP_NODELAY option set to
  prevent buffering many small sends into a single TCP packet.
  The :attr:`~SocketServer.BaseServer.timeout` class attribute can hold
  a timeout in seconds that will be applied to the request socket; if
  no request is received within that time, :meth:`~SocketServer.BaseServer.handle_timeout`
  will be called and :meth:`~SocketServer.BaseServer.handle_request` will return.
  (Contributed by Kristján Valur Jónsson; :issue:`6192` and :issue:`6267`.)

* Updated module: the :mod:`sqlite3` module has been updated to
  version 2.6.0 of the `pysqlite package <https://github.com/ghaering/pysqlite>`__. Version 2.6.0 includes a number of bugfixes, and adds
  the ability to load SQLite extensions from shared libraries.
  Call the ``enable_load_extension(True)`` method to enable extensions,
  and then call :meth:`~sqlite3.Connection.load_extension` to load a particular shared library.
  (Updated by Gerhard Häring.)

* The :mod:`ssl` module's :class:`~ssl.SSLSocket` objects now support the
  buffer API, which fixed a test suite failure (fix by Antoine Pitrou;
  :issue:`7133`) and automatically set
  OpenSSL's :c:macro:`SSL_MODE_AUTO_RETRY`, which will prevent an error
  code being returned from :meth:`recv` operations that trigger an SSL
  renegotiation (fix by Antoine Pitrou; :issue:`8222`).

  The :func:`ssl.wrap_socket` constructor function now takes a
  *ciphers* argument that's a string listing the encryption algorithms
  to be allowed; the format of the string is described
  `in the OpenSSL documentation
  <https://www.openssl.org/docs/manmaster/man1/ciphers.html#CIPHER-LIST-FORMAT>`__.
  (Added by Antoine Pitrou; :issue:`8322`.)

  Another change makes the extension load all of OpenSSL's ciphers and
  digest algorithms so that they're all available.  Some SSL
  certificates couldn't be verified, reporting an "unknown algorithm"
  error.  (Reported by Beda Kosata, and fixed by Antoine Pitrou;
  :issue:`8484`.)

  The version of OpenSSL being used is now available as the module
  attributes :data:`ssl.OPENSSL_VERSION` (a string),
  :data:`ssl.OPENSSL_VERSION_INFO` (a 5-tuple), and
  :data:`ssl.OPENSSL_VERSION_NUMBER` (an integer).  (Added by Antoine
  Pitrou; :issue:`8321`.)

* The :mod:`struct` module will no longer silently ignore overflow
  errors when a value is too large for a particular integer format
  code (one of ``bBhHiIlLqQ``); it now always raises a
  :exc:`struct.error` exception.  (Changed by Mark Dickinson;
  :issue:`1523`.)  The :func:`~struct.pack` function will also
  attempt to use :meth:`__index__` to convert and pack non-integers
  before trying the :meth:`__int__` method or reporting an error.
  (Changed by Mark Dickinson; :issue:`8300`.)

* New function: the :mod:`subprocess` module's
  :func:`~subprocess.check_output` runs a command with a specified set of arguments
  and returns the command's output as a string when the command runs without
  error, or raises a :exc:`~subprocess.CalledProcessError` exception otherwise.

  ::

    >>> subprocess.check_output(['df', '-h', '.'])
    'Filesystem     Size   Used  Avail Capacity  Mounted on\n
    /dev/disk0s2    52G    49G   3.0G    94%    /\n'

    >>> subprocess.check_output(['df', '-h', '/bogus'])
      ...
    subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1

  (Contributed by Gregory P. Smith.)

  The :mod:`subprocess` module will now retry its internal system calls
  on receiving an :const:`EINTR` signal.  (Reported by several people; final
  patch by Gregory P. Smith in :issue:`1068268`.)

* New function: :func:`~symtable.Symbol.is_declared_global` in the :mod:`symtable` module
  returns true for variables that are explicitly declared to be global,
  false for ones that are implicitly global.
  (Contributed by Jeremy Hylton.)

* The :mod:`syslog` module will now use the value of ``sys.argv[0]`` as the
  identifier instead of the previous default value of ``'python'``.
  (Changed by Sean Reifschneider; :issue:`8451`.)

* The ``sys.version_info`` value is now a named tuple, with attributes
  named :attr:`major`, :attr:`minor`, :attr:`micro`,
  :attr:`releaselevel`, and :attr:`serial`.  (Contributed by Ross
  Light; :issue:`4285`.)

  :func:`sys.getwindowsversion` also returns a named tuple,
  with attributes named :attr:`major`, :attr:`minor`, :attr:`build`,
  :attr:`platform`, :attr:`service_pack`, :attr:`service_pack_major`,
  :attr:`service_pack_minor`, :attr:`suite_mask`, and
  :attr:`product_type`.  (Contributed by Brian Curtin; :issue:`7766`.)

* The :mod:`tarfile` module's default error handling has changed, to
  no longer suppress fatal errors.  The default error level was previously 0,
  which meant that errors would only result in a message being written to the
  debug log, but because the debug log is not activated by default,
  these errors go unnoticed.  The default error level is now 1,
  which raises an exception if there's an error.
  (Changed by Lars Gustäbel; :issue:`7357`.)

  :mod:`tarfile` now supports filtering the :class:`~tarfile.TarInfo`
  objects being added to a tar file.  When you call :meth:`~tarfile.TarFile.add`,
  you may supply an optional *filter* argument
  that's a callable.  The *filter* callable will be passed the
  :class:`~tarfile.TarInfo` for every file being added, and can modify and return it.
  If the callable returns ``None``, the file will be excluded from the
  resulting archive.  This is more powerful than the existing
  *exclude* argument, which has therefore been deprecated.
  (Added by Lars Gustäbel; :issue:`6856`.)
  The :class:`~tarfile.TarFile` class also now supports the context management protocol.
  (Added by Lars Gustäbel; :issue:`7232`.)

* The :meth:`~threading.Event.wait` method of the :class:`threading.Event` class
  now returns the internal flag on exit.  This means the method will usually
  return true because :meth:`~threading.Event.wait` is supposed to block until the
  internal flag becomes true.  The return value will only be false if
  a timeout was provided and the operation timed out.
  (Contributed by Tim Lesher; :issue:`1674032`.)

* The Unicode database provided by the :mod:`unicodedata` module is
  now used internally to determine which characters are numeric,
  whitespace, or represent line breaks.  The database also
  includes information from the :file:`Unihan.txt` data file (patch
  by Anders Chrigström and Amaury Forgeot d'Arc; :issue:`1571184`)
  and has been updated to version 5.2.0 (updated by
  Florent Xicluna; :issue:`8024`).

* The :mod:`urlparse` module's :func:`~urlparse.urlsplit` now handles
  unknown URL schemes in a fashion compliant with :rfc:`3986`: if the
  URL is of the form ``"<something>://..."``, the text before the
  ``://`` is treated as the scheme, even if it's a made-up scheme that
  the module doesn't know about.  This change may break code that
  worked around the old behaviour.  For example, Python 2.6.4 or 2.5
  will return the following:

  .. doctest::
    :options: +SKIP

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')

  Python 2.7 (and Python 2.6.5) will return:

  .. doctest::
    :options: +SKIP

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')

  (Python 2.7 actually produces slightly different output, since it
  returns a named tuple instead of a standard tuple.)

  The :mod:`urlparse` module also supports IPv6 literal addresses as defined by
  :rfc:`2732` (contributed by Senthil Kumaran; :issue:`2987`).

  .. doctest::
    :options: +SKIP

    >>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
    ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',
                path='/foo', params='', query='', fragment='')

* New class: the :class:`~weakref.WeakSet` class in the :mod:`weakref`
  module is a set that only holds weak references to its elements; elements
  will be removed once there are no references pointing to them.
  (Originally implemented in Python 3.x by Raymond Hettinger, and backported
  to 2.7 by Michael Foord.)

* The ElementTree library, :mod:`xml.etree`, no longer escapes
  ampersands and angle brackets when outputting an XML processing
  instruction (which looks like ``<?xml-stylesheet href="#style1"?>``)
  or comment (which looks like ``<!-- comment -->``).
  (Patch by Neil Muller; :issue:`2746`.)

* The XML-RPC client and server, provided by the :mod:`xmlrpclib` and
  :mod:`SimpleXMLRPCServer` modules, have improved performance by
  supporting HTTP/1.1 keep-alive and by optionally using gzip encoding
  to compress the XML being exchanged.  The gzip compression is
  controlled by the :attr:`encode_threshold` attribute of
  :class:`SimpleXMLRPCRequestHandler`, which contains a size in bytes;
  responses larger than this will be compressed.
  (Contributed by Kristján Valur Jónsson; :issue:`6267`.)

* The :mod:`zipfile` module's :class:`~zipfile.ZipFile` now supports the context
  management protocol, so you can write ``with zipfile.ZipFile(...) as f:``.
  (Contributed by Brian Curtin; :issue:`5511`.)

  :mod:`zipfile` now also supports archiving empty directories and
  extracts them correctly.  (Fixed by Kuba Wieczorek; :issue:`4710`.)
  Reading files out of an archive is faster, and interleaving
  :meth:`~zipfile.ZipFile.read` and :meth:`~zipfile.ZipFile.readline` now works correctly.
  (Contributed by Nir Aides; :issue:`7610`.)

  The :func:`~zipfile.is_zipfile` function now
  accepts a file object, in addition to the path names accepted in earlier
  versions.  (Contributed by Gabriel Genellina; :issue:`4756`.)

  The :meth:`~zipfile.ZipFile.writestr` method now has an optional *compress_type* parameter
  that lets you override the default compression method specified in the
  :class:`~zipfile.ZipFile` constructor.  (Contributed by Ronald Oussoren;
  :issue:`6003`.)


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


.. _importlib-section:

New module: importlib
------------------------------

Python 3.1 includes the :mod:`importlib` package, a re-implementation
of the logic underlying Python's :keyword:`import` statement.
:mod:`importlib` is useful for implementors of Python interpreters and
to users who wish to write new importers that can participate in the
import process.  Python 2.7 doesn't contain the complete
:mod:`importlib` package, but instead has a tiny subset that contains
a single function, :func:`~importlib.import_module`.

``import_module(name, package=None)`` imports a module.  *name* is
a string containing the module or package's name.  It's possible to do
relative imports by providing a string that begins with a ``.``
character, such as ``..utils.errors``.  For relative imports, the
*package* argument must be provided and is the name of the package that
will be used as the anchor for
the relative import.  :func:`~importlib.import_module` both inserts the imported
module into ``sys.modules`` and returns the module object.

Here are some examples::

    >>> from importlib import import_module
    >>> anydbm = import_module('anydbm')  # Standard absolute import
    >>> anydbm
    <module 'anydbm' from '/p/python/Lib/anydbm.py'>
    >>> # Relative import
    >>> file_util = import_module('..file_util', 'distutils.command')
    >>> file_util
    <module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>

:mod:`importlib` was implemented by Brett Cannon and introduced in
Python 3.1.


New module: sysconfig
---------------------------------

The :mod:`sysconfig` module has been pulled out of the Distutils
package, becoming a new top-level module in its own right.
:mod:`sysconfig` provides functions for getting information about
Python's build process: compiler switches, installation paths, the
platform name, and whether Python is running from its source
directory.

Some of the functions in the module are:

* :func:`~sysconfig.get_config_var` returns variables from Python's
  Makefile and the :file:`pyconfig.h` file.
* :func:`~sysconfig.get_config_vars` returns a dictionary containing
  all of the configuration variables.
* :func:`~sysconfig.get_path` returns the configured path for
  a particular type of module: the standard library,
  site-specific modules, platform-specific modules, etc.
* :func:`~sysconfig.is_python_build` returns true if you're running a
  binary from a Python source tree, and false otherwise.

Consult the :mod:`sysconfig` documentation for more details and for
a complete list of functions.

The Distutils package and :mod:`sysconfig` are now maintained by Tarek
Ziadé, who has also started a Distutils2 package (source repository at
https://hg.python.org/distutils2/) for developing a next-generation
version of Distutils.


ttk: Themed Widgets for Tk
--------------------------

Tcl/Tk 8.5 includes a set of themed widgets that re-implement basic Tk
widgets but have a more customizable appearance and can therefore more
closely resemble the native platform's widgets.  This widget
set was originally called Tile, but was renamed to Ttk (for "themed Tk")
on being added to Tcl/Tck release 8.5.

To learn more, read the :mod:`ttk` module documentation.  You may also
wish to read the Tcl/Tk manual page describing the
Ttk theme engine, available at
https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.htm. Some
screenshots of the Python/Ttk code in use are at
https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.

The :mod:`ttk` module was written by Guilherme Polo and added in
:issue:`2983`.  An alternate version called ``Tile.py``, written by
Martin Franklin and maintained by Kevin Walzer, was proposed for
inclusion in :issue:`2618`, but the authors argued that Guilherme
Polo's work was more comprehensive.


.. _unittest-section:

Updated module: unittest
---------------------------------

The :mod:`unittest` module was greatly enhanced; many
new features were added.  Most of these features were implemented
by Michael Foord, unless otherwise noted.  The enhanced version of
the module is downloadable separately for use with Python versions 2.4 to 2.6,
packaged as the :mod:`unittest2` package, from
https://pypi.org/project/unittest2.

When used from the command line, the module can automatically discover
tests.  It's not as fancy as `py.test <http://pytest.org>`__ or
`nose <https://nose.readthedocs.io/>`__, but provides a
simple way to run tests kept within a set of package directories.  For example,
the following command will search the :file:`test/` subdirectory for
any importable test files named ``test*.py``::

   python -m unittest discover -s test

Consult the :mod:`unittest` module documentation for more details.
(Developed in :issue:`6001`.)

The :func:`~unittest.main` function supports some other new options:

* :option:`-b <unittest -b>` or :option:`!--buffer` will buffer the standard output
  and standard error streams during each test.  If the test passes,
  any resulting output will be discarded; on failure, the buffered
  output will be displayed.

* :option:`-c <unittest -c>` or :option:`!--catch` will cause the control-C interrupt
  to be handled more gracefully.  Instead of interrupting the test
  process immediately, the currently running test will be completed
  and then the partial results up to the interruption will be reported.
  If you're impatient, a second press of control-C will cause an immediate
  interruption.

  This control-C handler tries to avoid causing problems when the code
  being tested or the tests being run have defined a signal handler of
  their own, by noticing that a signal handler was already set and
  calling it.  If this doesn't work for you, there's a
  :func:`~unittest.removeHandler` decorator that can be used to mark tests that
  should have the control-C handling disabled.

* :option:`-f <unittest -f>` or :option:`!--failfast` makes
  test execution stop immediately when a test fails instead of
  continuing to execute further tests.  (Suggested by Cliff Dyer and
  implemented by Michael Foord; :issue:`8074`.)

The progress messages now show 'x' for expected failures
and 'u' for unexpected successes when run in verbose mode.
(Contributed by Benjamin Peterson.)

Test cases can raise the :exc:`~unittest.SkipTest` exception to skip a
test (:issue:`1034053`).

The error messages for :meth:`~unittest.TestCase.assertEqual`,
:meth:`~unittest.TestCase.assertTrue`, and :meth:`~unittest.TestCase.assertFalse`
failures now provide more information.  If you set the
:attr:`~unittest.TestCase.longMessage` attribute of your :class:`~unittest.TestCase` classes to
true, both the standard error message and any additional message you
provide will be printed for failures.  (Added by Michael Foord; :issue:`5663`.)

The :meth:`~unittest.TestCase.assertRaises` method now
returns a context handler when called without providing a callable
object to run.  For example, you can write this::

  with self.assertRaises(KeyError):
      {}['foo']

(Implemented by Antoine Pitrou; :issue:`4444`.)

.. rev 78774

Module- and class-level setup and teardown fixtures are now supported.
Modules can contain :func:`~unittest.setUpModule` and :func:`~unittest.tearDownModule`
functions.  Classes can have :meth:`~unittest.TestCase.setUpClass` and
:meth:`~unittest.TestCase.tearDownClass` methods that must be defined as class methods
(using ``@classmethod`` or equivalent).  These functions and
methods are invoked when the test runner switches to a test case in a
different module or class.

The methods :meth:`~unittest.TestCase.addCleanup` and
:meth:`~unittest.TestCase.doCleanups` were added.
:meth:`~unittest.TestCase.addCleanup` lets you add cleanup functions that
will be called unconditionally (after :meth:`~unittest.TestCase.setUp` if
:meth:`~unittest.TestCase.setUp` fails, otherwise after :meth:`~unittest.TestCase.tearDown`). This allows
for much simpler resource allocation and deallocation during tests
(:issue:`5679`).

A number of new methods were added that provide more specialized
tests.  Many of these methods were written by Google engineers
for use in their test suites; Gregory P. Smith, Michael Foord, and
GvR worked on merging them into Python's version of :mod:`unittest`.

* :meth:`~unittest.TestCase.assertIsNone` and :meth:`~unittest.TestCase.assertIsNotNone` take one
  expression and verify that the result is or is not ``None``.

* :meth:`~unittest.TestCase.assertIs` and :meth:`~unittest.TestCase.assertIsNot`
  take two values and check whether the two values evaluate to the same object or not.
  (Added by Michael Foord; :issue:`2578`.)

* :meth:`~unittest.TestCase.assertIsInstance` and
  :meth:`~unittest.TestCase.assertNotIsInstance` check whether
  the resulting object is an instance of a particular class, or of
  one of a tuple of classes.  (Added by Georg Brandl; :issue:`7031`.)

* :meth:`~unittest.TestCase.assertGreater`, :meth:`~unittest.TestCase.assertGreaterEqual`,
  :meth:`~unittest.TestCase.assertLess`, and :meth:`~unittest.TestCase.assertLessEqual` compare
  two quantities.

* :meth:`~unittest.TestCase.assertMultiLineEqual` compares two strings, and if they're
  not equal, displays a helpful comparison that highlights the
  differences in the two strings.  This comparison is now used by
  default when Unicode strings are compared with :meth:`~unittest.TestCase.assertEqual`.

* :meth:`~unittest.TestCase.assertRegexpMatches` and
  :meth:`~unittest.TestCase.assertNotRegexpMatches` checks whether the
  first argument is a string matching or not matching the regular
  expression provided as the second argument (:issue:`8038`).

* :meth:`~unittest.TestCase.assertRaisesRegexp` checks whether a particular exception
  is raised, and then also checks that the string representation of
  the exception matches the provided regular expression.

* :meth:`~unittest.TestCase.assertIn` and :meth:`~unittest.TestCase.assertNotIn`
  tests whether *first* is or is not in  *second*.

* :meth:`~unittest.TestCase.assertItemsEqual` tests whether two provided sequences
  contain the same elements.

* :meth:`~unittest.TestCase.assertSetEqual` compares whether two sets are equal, and
  only reports the differences between the sets in case of error.

* Similarly, :meth:`~unittest.TestCase.assertListEqual` and :meth:`~unittest.TestCase.assertTupleEqual`
  compare the specified types and explain any differences without necessarily
  printing their full values; these methods are now used by default
  when comparing lists and tuples using :meth:`~unittest.TestCase.assertEqual`.
  More generally, :meth:`~unittest.TestCase.assertSequenceEqual` compares two sequences
  and can optionally check whether both sequences are of a
  particular type.

* :meth:`~unittest.TestCase.assertDictEqual` compares two dictionaries and reports the
  differences; it's now used by default when you compare two dictionaries
  using :meth:`~unittest.TestCase.assertEqual`.  :meth:`~unittest.TestCase.assertDictContainsSubset` checks whether
  all of the key/value pairs in *first* are found in *second*.

* :meth:`~unittest.TestCase.assertAlmostEqual` and :meth:`~unittest.TestCase.assertNotAlmostEqual` test
  whether *first* and *second* are approximately equal.  This method
  can either round their difference to an optionally-specified number
  of *places* (the default is 7) and compare it to zero, or require
  the difference to be smaller than a supplied *delta* value.

* :meth:`~unittest.TestLoader.loadTestsFromName` properly honors the
  :attr:`~unittest.TestLoader.suiteClass` attribute of
  the :class:`~unittest.TestLoader`. (Fixed by Mark Roddy; :issue:`6866`.)

* A new hook lets you extend the :meth:`~unittest.TestCase.assertEqual` method to handle
  new data types.  The :meth:`~unittest.TestCase.addTypeEqualityFunc` method takes a type
  object and a function. The function will be used when both of the
  objects being compared are of the specified type.  This function
  should compare the two objects and raise an exception if they don't
  match; it's a good idea for the function to provide additional
  information about why the two objects aren't matching, much as the new
  sequence comparison methods do.

:func:`unittest.main` now takes an optional ``exit`` argument.  If
false, :func:`~unittest.main` doesn't call :func:`sys.exit`, allowing
:func:`~unittest.main` to be used from the interactive interpreter.
(Contributed by J. Pablo Fernández; :issue:`3379`.)

:class:`~unittest.TestResult` has new :meth:`~unittest.TestResult.startTestRun` and
:meth:`~unittest.TestResult.stopTestRun` methods that are called immediately before
and after a test run.  (Contributed by Robert Collins; :issue:`5728`.)

With all these changes, the :file:`unittest.py` was becoming awkwardly
large, so the module was turned into a package and the code split into
several files (by Benjamin Peterson).  This doesn't affect how the
module is imported or used.

.. seealso::

  http://www.voidspace.org.uk/python/articles/unittest2.shtml
    Describes the new features, how to use them, and the
    rationale for various design decisions.  (By Michael Foord.)

.. _elementtree-section:

Updated module: ElementTree 1.3
---------------------------------

The version of the ElementTree library included with Python was updated to
version 1.3.  Some of the new features are:

* The various parsing functions now take a *parser* keyword argument
  giving an :class:`~xml.etree.ElementTree.XMLParser` instance that will
  be used.  This makes it possible to override the file's internal encoding::

    p = ET.XMLParser(encoding='utf-8')
    t = ET.XML("""<root/>""", parser=p)

  Errors in parsing XML now raise a :exc:`ParseError` exception, whose
  instances have a :attr:`position` attribute
  containing a (*line*, *column*) tuple giving the location of the problem.

* ElementTree's code for converting trees to a string has been
  significantly reworked, making it roughly twice as fast in many
  cases.  The :meth:`ElementTree.write() <xml.etree.ElementTree.ElementTree.write>`
  and :meth:`Element.write` methods now have a *method* parameter that can be
  "xml" (the default), "html", or "text".  HTML mode will output empty
  elements as ``<empty></empty>`` instead of ``<empty/>``, and text
  mode will skip over elements and only output the text chunks.  If
  you set the :attr:`tag` attribute of an element to ``None`` but
  leave its children in place, the element will be omitted when the
  tree is written out, so you don't need to do more extensive rearrangement
  to remove a single element.

  Namespace handling has also been improved.  All ``xmlns:<whatever>``
  declarations are now output on the root element, not scattered throughout
  the resulting XML.  You can set the default namespace for a tree
  by setting the :attr:`default_namespace` attribute and can
  register new prefixes with :meth:`~xml.etree.ElementTree.register_namespace`.  In XML mode,
  you can use the true/false *xml_declaration* parameter to suppress the
  XML declaration.

* New :class:`~xml.etree.ElementTree.Element` method:
  :meth:`~xml.etree.ElementTree.Element.extend` appends the items from a
  sequence to the element's children.  Elements themselves behave like
  sequences, so it's easy to move children from one element to
  another::

    from xml.etree import ElementTree as ET

    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")
    new = ET.XML('<root/>')
    new.extend(t)

    # Outputs <root><item>1</item>...</root>
    print ET.tostring(new)

* New :class:`Element` method:
  :meth:`~xml.etree.ElementTree.Element.iter` yields the children of the
  element as a generator.  It's also possible to write ``for child in
  elem:`` to loop over an element's children.  The existing method
  :meth:`getiterator` is now deprecated, as is :meth:`getchildren`
  which constructs and returns a list of children.

* New :class:`Element` method:
  :meth:`~xml.etree.ElementTree.Element.itertext` yields all chunks of
  text that are descendants of the element.  For example::

    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")

    # Outputs ['\n  ', '1', ' ', '2', '  ', '3', '\n']
    print list(t.itertext())

* Deprecated: using an element as a Boolean (i.e., ``if elem:``) would
  return true if the element had any children, or false if there were
  no children.  This behaviour is confusing -- ``None`` is false, but
  so is a childless element? -- so it will now trigger a
  :exc:`FutureWarning`.  In your code, you should be explicit: write
  ``len(elem) != 0`` if you're interested in the number of children,
  or ``elem is not None``.

Fredrik Lundh develops ElementTree and produced the 1.3 version;
you can read his article describing 1.3 at
http://effbot.org/zone/elementtree-13-intro.htm.
Florent Xicluna updated the version included with
Python, after discussions on python-dev and in :issue:`6472`.)

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


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

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

* The latest release of the GNU Debugger, GDB 7, can be `scripted
  using Python
  <https://sourceware.org/gdb/current/onlinedocs/gdb/Python.html>`__.
  When you begin debugging an executable program P, GDB will look for
  a file named ``P-gdb.py`` and automatically read it.  Dave Malcolm
  contributed a :file:`python-gdb.py` that adds a number of
  commands useful when debugging Python itself.  For example,
  ``py-up`` and ``py-down`` go up or down one Python stack frame,
  which usually corresponds to several C stack frames.  ``py-print``
  prints the value of a Python variable, and ``py-bt`` prints the
  Python stack trace.  (Added as a result of :issue:`8032`.)

* If you use the :file:`.gdbinit` file provided with Python,
  the "pyo" macro in the 2.7 version now works correctly when the thread being
  debugged doesn't hold the GIL; the macro now acquires it before printing.
  (Contributed by Victor Stinner; :issue:`3632`.)

* :c:func:`Py_AddPendingCall` is now thread-safe, letting any
  worker thread submit notifications to the main Python thread.  This
  is particularly useful for asynchronous IO operations.
  (Contributed by Kristján Valur Jónsson; :issue:`4293`.)

* New function: :c:func:`PyCode_NewEmpty` creates an empty code object;
  only the filename, function name, and first line number are required.
  This is useful for extension modules that are attempting to
  construct a more useful traceback stack.  Previously such
  extensions needed to call :c:func:`PyCode_New`, which had many
  more arguments.  (Added by Jeffrey Yasskin.)

* New function: :c:func:`PyErr_NewExceptionWithDoc` creates a new
  exception class, just as the existing :c:func:`PyErr_NewException` does,
  but takes an extra ``char *`` argument containing the docstring for the
  new exception class.  (Added by 'lekma' on the Python bug tracker;
  :issue:`7033`.)

* New function: :c:func:`PyFrame_GetLineNumber` takes a frame object
  and returns the line number that the frame is currently executing.
  Previously code would need to get the index of the bytecode
  instruction currently executing, and then look up the line number
  corresponding to that address.  (Added by Jeffrey Yasskin.)

* New functions: :c:func:`PyLong_AsLongAndOverflow` and
  :c:func:`PyLong_AsLongLongAndOverflow`  approximates a Python long
  integer as a C :c:type:`long` or :c:type:`long long`.
  If the number is too large to fit into
  the output type, an *overflow* flag is set and returned to the caller.
  (Contributed by Case Van Horsen; :issue:`7528` and :issue:`7767`.)

* New function: stemming from the rewrite of string-to-float conversion,
  a new :c:func:`PyOS_string_to_double` function was added.  The old
  :c:func:`PyOS_ascii_strtod` and :c:func:`PyOS_ascii_atof` functions
  are now deprecated.

* New function: :c:func:`PySys_SetArgvEx` sets the value of
  ``sys.argv`` and can optionally update ``sys.path`` to include the
  directory containing the script named by ``sys.argv[0]`` depending
  on the value of an *updatepath* parameter.

  This function was added to close a security hole for applications
  that embed Python.  The old function, :c:func:`PySys_SetArgv`, would
  always update ``sys.path``, and sometimes it would add the current
  directory.  This meant that, if you ran an application embedding
  Python in a directory controlled by someone else, attackers could
  put a Trojan-horse module in the directory (say, a file named
  :file:`os.py`) that your application would then import and run.

  If you maintain a C/C++ application that embeds Python, check
  whether you're calling :c:func:`PySys_SetArgv` and carefully consider
  whether the application should be using :c:func:`PySys_SetArgvEx`
  with *updatepath* set to false.

  Security issue reported as `CVE-2008-5983
  <https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983>`_;
  discussed in :issue:`5753`, and fixed by Antoine Pitrou.

* New macros: the Python header files now define the following macros:
  :c:macro:`Py_ISALNUM`,
  :c:macro:`Py_ISALPHA`,
  :c:macro:`Py_ISDIGIT`,
  :c:macro:`Py_ISLOWER`,
  :c:macro:`Py_ISSPACE`,
  :c:macro:`Py_ISUPPER`,
  :c:macro:`Py_ISXDIGIT`,
  :c:macro:`Py_TOLOWER`, and :c:macro:`Py_TOUPPER`.
  All of these functions are analogous to the C
  standard macros for classifying characters, but ignore the current
  locale setting, because in
  several places Python needs to analyze characters in a
  locale-independent way.  (Added by Eric Smith;
  :issue:`5793`.)

  .. XXX these macros don't seem to be described in the c-api docs.

* Removed function: :c:macro:`PyEval_CallObject` is now only available
  as a macro.  A function version was being kept around to preserve
  ABI linking compatibility, but that was in 1997; it can certainly be
  deleted by now.  (Removed by Antoine Pitrou; :issue:`8276`.)

* New format codes: the :c:func:`PyFormat_FromString`,
  :c:func:`PyFormat_FromStringV`, and :c:func:`PyErr_Format` functions now
  accept ``%lld`` and ``%llu`` format codes for displaying
  C's :c:type:`long long` types.
  (Contributed by Mark Dickinson; :issue:`7228`.)

* The complicated interaction between threads and process forking has
  been changed.  Previously, the child process created by
  :func:`os.fork` might fail because the child is created with only a
  single thread running, the thread performing the :func:`os.fork`.
  If other threads were holding a lock, such as Python's import lock,
  when the fork was performed, the lock would still be marked as
  "held" in the new process.  But in the child process nothing would
  ever release the lock, since the other threads weren't replicated,
  and the child process would no longer be able to perform imports.

  Python 2.7 acquires the import lock before performing an
  :func:`os.fork`, and will also clean up any locks created using the
  :mod:`threading` module.  C extension modules that have internal
  locks, or that call :c:func:`fork()` themselves, will not benefit
  from this clean-up.

  (Fixed by Thomas Wouters; :issue:`1590864`.)

* The :c:func:`Py_Finalize` function now calls the internal
  :func:`threading._shutdown` function; this prevents some exceptions from
  being raised when an interpreter shuts down.
  (Patch by Adam Olsen; :issue:`1722344`.)

* When using the :c:type:`PyMemberDef` structure to define attributes
  of a type, Python will no longer let you try to delete or set a
  :const:`T_STRING_INPLACE` attribute.

  .. rev 79644

* Global symbols defined by the :mod:`ctypes` module are now prefixed
  with ``Py``, or with ``_ctypes``.  (Implemented by Thomas
  Heller; :issue:`3102`.)

* New configure option: the :option:`!--with-system-expat` switch allows
  building the :mod:`pyexpat` module to use the system Expat library.
  (Contributed by Arfrever Frehtes Taifersar Arahesis; :issue:`7609`.)

* New configure option: the
  :option:`!--with-valgrind` option will now disable the pymalloc
  allocator, which is difficult for the Valgrind memory-error detector
  to analyze correctly.
  Valgrind will therefore be better at detecting memory leaks and
  overruns. (Contributed by James Henstridge; :issue:`2422`.)

* New configure option: you can now supply an empty string to
  :option:`!--with-dbmliborder=` in order to disable all of the various
  DBM modules.  (Added by Arfrever Frehtes Taifersar Arahesis;
  :issue:`6491`.)

* The :program:`configure` script now checks for floating-point rounding bugs
  on certain 32-bit Intel chips and defines a :c:macro:`X87_DOUBLE_ROUNDING`
  preprocessor definition.  No code currently uses this definition,
  but it's available if anyone wishes to use it.
  (Added by Mark Dickinson; :issue:`2937`.)

  :program:`configure` also now sets a :envvar:`LDCXXSHARED` Makefile
  variable for supporting C++ linking.  (Contributed by Arfrever
  Frehtes Taifersar Arahesis; :issue:`1222585`.)

* The build process now creates the necessary files for pkg-config
  support.  (Contributed by Clinton Roy; :issue:`3585`.)

* The build process now supports Subversion 1.7.  (Contributed by
  Arfrever Frehtes Taifersar Arahesis; :issue:`6094`.)


.. _whatsnew27-capsules:

Capsules
-------------------

Python 3.1 adds a new C datatype, :c:type:`PyCapsule`, for providing a
C API to an extension module.  A capsule is essentially the holder of
a C ``void *`` pointer, and is made available as a module attribute; for
example, the :mod:`socket` module's API is exposed as ``socket.CAPI``,
and :mod:`unicodedata` exposes ``ucnhash_CAPI``.  Other extensions
can import the module, access its dictionary to get the capsule
object, and then get the ``void *`` pointer, which will usually point
to an array of pointers to the module's various API functions.

There is an existing data type already used for this,
:c:type:`PyCObject`, but it doesn't provide type safety.  Evil code
written in pure Python could cause a segmentation fault by taking a
:c:type:`PyCObject` from module A and somehow substituting it for the
:c:type:`PyCObject` in module B.   Capsules know their own name,
and getting the pointer requires providing the name:

.. code-block:: c

   void *vtable;

   if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
           PyErr_SetString(PyExc_ValueError, "argument type invalid");
           return NULL;
   }

   vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");

You are assured that ``vtable`` points to whatever you're expecting.
If a different capsule was passed in, :c:func:`PyCapsule_IsValid` would
detect the mismatched name and return false.  Refer to
:ref:`using-capsules` for more information on using these objects.

Python 2.7 now uses capsules internally to provide various
extension-module APIs, but the :c:func:`PyCObject_AsVoidPtr` was
modified to handle capsules, preserving compile-time compatibility
with the :c:type:`CObject` interface.  Use of
:c:func:`PyCObject_AsVoidPtr` will signal a
:exc:`PendingDeprecationWarning`, which is silent by default.

Implemented in Python 3.1 and backported to 2.7 by Larry Hastings;
discussed in :issue:`5630`.


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

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

* The :mod:`msvcrt` module now contains some constants from
  the :file:`crtassem.h` header file:
  :data:`CRT_ASSEMBLY_VERSION`,
  :data:`VC_ASSEMBLY_PUBLICKEYTOKEN`,
  and :data:`LIBRARIES_ASSEMBLY_NAME_PREFIX`.
  (Contributed by David Cournapeau; :issue:`4365`.)

* The :mod:`_winreg` module for accessing the registry now implements
  the :func:`~_winreg.CreateKeyEx` and :func:`~_winreg.DeleteKeyEx`
  functions, extended versions of previously-supported functions that
  take several extra arguments.  The :func:`~_winreg.DisableReflectionKey`,
  :func:`~_winreg.EnableReflectionKey`, and :func:`~_winreg.QueryReflectionKey`
  were also tested and documented.
  (Implemented by Brian Curtin: :issue:`7347`.)

* The new :c:func:`_beginthreadex` API is used to start threads, and
  the native thread-local storage functions are now used.
  (Contributed by Kristján Valur Jónsson; :issue:`3582`.)

* The :func:`os.kill` function now works on Windows.  The signal value
  can be the constants :const:`CTRL_C_EVENT`,
  :const:`CTRL_BREAK_EVENT`, or any integer.  The first two constants
  will send :kbd:`Control-C` and :kbd:`Control-Break` keystroke events to
  subprocesses; any other value will use the :c:func:`TerminateProcess`
  API.  (Contributed by Miki Tebeka; :issue:`1220212`.)

* The :func:`os.listdir` function now correctly fails
  for an empty path.  (Fixed by Hirokazu Yamamoto; :issue:`5913`.)

* The :mod:`mimelib` module will now read the MIME database from
  the Windows registry when initializing.
  (Patch by Gabriel Genellina; :issue:`4969`.)

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

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

* The path ``/Library/Python/2.7/site-packages`` is now appended to
  ``sys.path``, in order to share added packages between the system
  installation and a user-installed copy of the same version.
  (Changed by Ronald Oussoren; :issue:`4865`.)

   .. versionchanged:: 2.7.13

     As of 2.7.13, this change was removed.
     ``/Library/Python/2.7/site-packages``, the site-packages directory
     used by the Apple-supplied system Python 2.7 is no longer appended to
     ``sys.path`` for user-installed Pythons such as from the python.org
     installers.  As of macOS 10.12, Apple changed how the system
     site-packages directory is configured, which could cause installation
     of pip components, like setuptools, to fail.  Packages installed for
     the system Python will no longer be shared with user-installed
     Pythons. (:issue:`28440`)

Port-Specific Changes: FreeBSD
-----------------------------------

* FreeBSD 7.1's :const:`SO_SETFIB` constant, used with
  :func:`~socket.getsockopt`/:func:`~socket.setsockopt` to select an
  alternate routing table, is now available in the :mod:`socket`
  module.  (Added by Kyle VanderBeek; :issue:`8235`.)

Other Changes and Fixes
=======================

* Two benchmark scripts, :file:`iobench` and :file:`ccbench`, were
  added to the :file:`Tools` directory.  :file:`iobench` measures the
  speed of the built-in file I/O objects returned by :func:`open`
  while performing various operations, and :file:`ccbench` is a
  concurrency benchmark that tries to measure computing throughput,
  thread switching latency, and IO processing bandwidth when
  performing several tasks using a varying number of threads.

* The :file:`Tools/i18n/msgfmt.py` script now understands plural
  forms in :file:`.po` files.  (Fixed by Martin von Löwis;
  :issue:`5464`.)

* When importing a module from a :file:`.pyc` or :file:`.pyo` file
  with an existing :file:`.py` counterpart, the :attr:`co_filename`
  attributes of the resulting code objects are overwritten when the
  original filename is obsolete.  This can happen if the file has been
  renamed, moved, or is accessed through different paths.  (Patch by
  Ziga Seilnacht and Jean-Paul Calderone; :issue:`1180193`.)

* The :file:`regrtest.py` script now takes a :option:`!--randseed=`
  switch that takes an integer that will be used as the random seed
  for the :option:`!-r` option that executes tests in random order.
  The :option:`!-r` option also reports the seed that was used
  (Added by Collin Winter.)

* Another :file:`regrtest.py` switch is :option:`!-j`, which
  takes an integer specifying how many tests run in parallel. This
  allows reducing the total runtime on multi-core machines.
  This option is compatible with several other options, including the
  :option:`!-R` switch which is known to produce long runtimes.
  (Added by Antoine Pitrou, :issue:`6152`.)  This can also be used
  with a new :option:`!-F` switch that runs selected tests in a loop
  until they fail.  (Added by Antoine Pitrou; :issue:`7312`.)

* When executed as a script, the :file:`py_compile.py` module now
  accepts ``'-'`` as an argument, which will read standard input for
  the list of filenames to be compiled.  (Contributed by Piotr
  Ożarowski; :issue:`8233`.)

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

Porting to Python 2.7
=====================

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

* The :func:`range` function processes its arguments more
  consistently; it will now call :meth:`__int__` on non-float,
  non-integer arguments that are supplied to it.  (Fixed by Alexander
  Belopolsky; :issue:`1533`.)

* The string :meth:`format` method changed the default precision used
  for floating-point and complex numbers from 6 decimal
  places to 12, which matches the precision used by :func:`str`.
  (Changed by Eric Smith; :issue:`5920`.)

* Because of an optimization for the :keyword:`with` statement, the special
  methods :meth:`__enter__` and :meth:`__exit__` must belong to the object's
  type, and cannot be directly attached to the object's instance.  This
  affects new-style classes (derived from :class:`object`) and C extension
  types.  (:issue:`6101`.)

* Due to a bug in Python 2.6, the *exc_value* parameter to
  :meth:`__exit__` methods was often the string representation of the
  exception, not an instance.  This was fixed in 2.7, so *exc_value*
  will be an instance as expected.  (Fixed by Florent Xicluna;
  :issue:`7853`.)

* When a restricted set of attributes were set using ``__slots__``,
  deleting an unset attribute would not raise :exc:`AttributeError`
  as you would expect.  Fixed by Benjamin Peterson; :issue:`7604`.)

In the standard library:

* Operations with :class:`~datetime.datetime` instances that resulted in a year
  falling outside the supported range didn't always raise
  :exc:`OverflowError`.  Such errors are now checked more carefully
  and will now raise the exception. (Reported by Mark Leander, patch
  by Anand B. Pillai and Alexander Belopolsky; :issue:`7150`.)

* When using :class:`~decimal.Decimal` instances with a string's
  :meth:`format` method, the default alignment was previously
  left-alignment.  This has been changed to right-alignment, which might
  change the output of your programs.
  (Changed by Mark Dickinson; :issue:`6857`.)

  Comparisons involving a signaling NaN value (or ``sNAN``) now signal
  :const:`~decimal.InvalidOperation` instead of silently returning a true or
  false value depending on the comparison operator.  Quiet NaN values
  (or ``NaN``) are now hashable.  (Fixed by Mark Dickinson;
  :issue:`7279`.)

* The ElementTree library, :mod:`xml.etree`, no longer escapes
  ampersands and angle brackets when outputting an XML processing
  instruction (which looks like `<?xml-stylesheet href="#style1"?>`)
  or comment (which looks like `<!-- comment -->`).
  (Patch by Neil Muller; :issue:`2746`.)

* The :meth:`~StringIO.StringIO.readline` method of :class:`~StringIO.StringIO` objects now does
  nothing when a negative length is requested, as other file-like
  objects do.  (:issue:`7348`).

* The :mod:`syslog` module will now use the value of ``sys.argv[0]`` as the
  identifier instead of the previous default value of ``'python'``.
  (Changed by Sean Reifschneider; :issue:`8451`.)

* The :mod:`tarfile` module's default error handling has changed, to
  no longer suppress fatal errors.  The default error level was previously 0,
  which meant that errors would only result in a message being written to the
  debug log, but because the debug log is not activated by default,
  these errors go unnoticed.  The default error level is now 1,
  which raises an exception if there's an error.
  (Changed by Lars Gustäbel; :issue:`7357`.)

* The :mod:`urlparse` module's :func:`~urlparse.urlsplit` now handles
  unknown URL schemes in a fashion compliant with :rfc:`3986`: if the
  URL is of the form ``"<something>://..."``, the text before the
  ``://`` is treated as the scheme, even if it's a made-up scheme that
  the module doesn't know about.  This change may break code that
  worked around the old behaviour.  For example, Python 2.6.4 or 2.5
  will return the following:

  .. doctest::
    :options: +SKIP

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')

  Python 2.7 (and Python 2.6.5) will return:

  .. doctest::
    :options: +SKIP

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')

  (Python 2.7 actually produces slightly different output, since it
  returns a named tuple instead of a standard tuple.)

For C extensions:

* C extensions that use integer format codes with the ``PyArg_Parse*``
  family of functions will now raise a :exc:`TypeError` exception
  instead of triggering a :exc:`DeprecationWarning` (:issue:`5080`).

* Use the new :c:func:`PyOS_string_to_double` function instead of the old
  :c:func:`PyOS_ascii_strtod` and :c:func:`PyOS_ascii_atof` functions,
  which are now deprecated.

For applications that embed Python:

* The :c:func:`PySys_SetArgvEx` function was added, letting
  applications close a security hole when the existing
  :c:func:`PySys_SetArgv` function was used.  Check whether you're
  calling :c:func:`PySys_SetArgv` and carefully consider whether the
  application should be using :c:func:`PySys_SetArgvEx` with
  *updatepath* set to false.

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


.. _py27-maintenance-enhancements:

New Features Added to Python 2.7 Maintenance Releases
=====================================================

New features may be added to Python 2.7 maintenance releases when the
situation genuinely calls for it. Any such additions must go through
the Python Enhancement Proposal process, and make a compelling case for why
they can't be adequately addressed by either adding the new feature solely to
Python 3, or else by publishing it on the Python Package Index.

In addition to the specific proposals listed below, there is a general
exemption allowing new ``-3`` warnings to be added in any Python 2.7
maintenance release.


Two new environment variables for debug mode
--------------------------------------------

In debug mode, the ``[xxx refs]`` statistic is not written by default, the
:envvar:`PYTHONSHOWREFCOUNT` environment variable now must also be set.
(Contributed by Victor Stinner; :issue:`31733`.)

When Python is compiled with ``COUNT_ALLOC`` defined, allocation counts are no
longer dumped by default anymore: the :envvar:`PYTHONSHOWALLOCCOUNT` environment
variable must now also be set. Moreover, allocation counts are now dumped into
stderr, rather than stdout. (Contributed by Victor Stinner; :issue:`31692`.)

.. versionadded:: 2.7.15


PEP 434: IDLE Enhancement Exception for All Branches
----------------------------------------------------

:pep:`434` describes a general exemption for changes made to the IDLE
development environment shipped along with Python. This exemption makes it
possible for the IDLE developers to provide a more consistent user
experience across all supported versions of Python 2 and 3.

For details of any IDLE changes, refer to the NEWS file for the specific
release.


PEP 466: Network Security Enhancements for Python 2.7
-----------------------------------------------------

:pep:`466` describes a number of network security enhancement proposals
that have been approved for inclusion in Python 2.7 maintenance releases,
with the first of those changes appearing in the Python 2.7.7 release.

:pep:`466` related features added in Python 2.7.7:

* :func:`hmac.compare_digest` was backported from Python 3 to make a timing
  attack resistant comparison operation available to Python 2 applications.
  (Contributed by Alex Gaynor; :issue:`21306`.)

* OpenSSL 1.0.1g was upgraded in the official Windows installers published on
  python.org. (Contributed by Zachary Ware; :issue:`21462`.)

:pep:`466` related features added in Python 2.7.8:

* :func:`hashlib.pbkdf2_hmac` was backported from Python 3 to make a hashing
  algorithm suitable for secure password storage broadly available to Python
  2 applications. (Contributed by Alex Gaynor; :issue:`21304`.)

* OpenSSL 1.0.1h was upgraded for the official Windows installers published on
  python.org. (contributed by Zachary Ware in :issue:`21671` for CVE-2014-0224)

:pep:`466` related features added in Python 2.7.9:

* Most of Python 3.4's :mod:`ssl` module was backported. This means :mod:`ssl`
  now supports Server Name Indication, TLS1.x settings, access to the platform
  certificate store, the :class:`~ssl.SSLContext` class, and other
  features. (Contributed by Alex Gaynor and David Reid; :issue:`21308`.)

  Refer to the "Version added: 2.7.9" notes in the module documentation for
  specific details.

* :func:`os.urandom` was changed to cache a file descriptor to ``/dev/urandom``
  instead of reopening ``/dev/urandom`` on every call. (Contributed by Alex
  Gaynor; :issue:`21305`.)

* :data:`hashlib.algorithms_guaranteed` and
  :data:`hashlib.algorithms_available` were backported from Python 3 to make
  it easier for Python 2 applications to select the strongest available hash
  algorithm. (Contributed by Alex Gaynor in :issue:`21307`)


PEP 477: Backport ensurepip (PEP 453) to Python 2.7
---------------------------------------------------

:pep:`477` approves the inclusion of the :pep:`453` ensurepip module and the
improved documentation that was enabled by it in the Python 2.7 maintenance
releases, appearing first in the Python 2.7.9 release.


Bootstrapping pip By Default
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The new :mod:`ensurepip` module (defined in :pep:`453`) provides a standard
cross-platform mechanism to bootstrap the pip installer into Python
installations. The version of ``pip`` included with Python 2.7.9 is ``pip``
1.5.6, and future 2.7.x maintenance releases will update the bundled version to
the latest version of ``pip`` that is available at the time of creating the
release candidate.

By default, the commands ``pip``, ``pipX`` and ``pipX.Y`` will be installed on
all platforms (where X.Y stands for the version of the Python installation),
along with the ``pip`` Python package and its dependencies.

For CPython :ref:`source builds on POSIX systems <building-python-on-unix>`,
the ``make install`` and ``make altinstall`` commands do not bootstrap ``pip``
by default.  This behaviour can be controlled through configure options, and
overridden through Makefile options.

On Windows and Mac OS X, the CPython installers now default to installing
``pip`` along with CPython itself (users may opt out of installing it
during the installation process). Window users will need to opt in to the
automatic ``PATH`` modifications to have ``pip`` available from the command
line by default, otherwise it can still be accessed through the Python
launcher for Windows as ``py -m pip``.

As `discussed in the PEP`__, platform packagers may choose not to install
these commands by default, as long as, when invoked, they provide clear and
simple directions on how to install them on that platform (usually using
the system package manager).

__ https://www.python.org/dev/peps/pep-0477/#disabling-ensurepip-by-downstream-distributors


Documentation Changes
~~~~~~~~~~~~~~~~~~~~~

As part of this change, the :ref:`installing-index` and
:ref:`distributing-index` sections of the documentation have been
completely redesigned as short getting started and FAQ documents. Most
packaging documentation has now been moved out to the Python Packaging
Authority maintained `Python Packaging User Guide
<http://packaging.python.org>`__ and the documentation of the individual
projects.

However, as this migration is currently still incomplete, the legacy
versions of those guides remaining available as :ref:`install-index`
and :ref:`distutils-index`.

.. seealso::

   :pep:`453` -- Explicit bootstrapping of pip in Python installations
      PEP written by Donald Stufft and Nick Coghlan, implemented by
      Donald Stufft, Nick Coghlan, Martin von Löwis and Ned Deily.

PEP 476: Enabling certificate verification by default for stdlib http clients
-----------------------------------------------------------------------------

:pep:`476` updated :mod:`httplib` and modules which use it, such as
:mod:`urllib2` and :mod:`xmlrpclib`, to now verify that the server
presents a certificate which is signed by a Certificate Authority in the
platform trust store and whose hostname matches the hostname being requested
by default, significantly improving security for many applications. This
change was made in the Python 2.7.9 release.

For applications which require the old previous behavior, they can pass an
alternate context::

    import urllib2
    import ssl

    # This disables all verification
    context = ssl._create_unverified_context()

    # This allows using a specific certificate for the host, which doesn't need
    # to be in the trust store
    context = ssl.create_default_context(cafile="/path/to/file.crt")

    urllib2.urlopen("https://invalid-cert", context=context)


PEP 493: HTTPS verification migration tools for Python 2.7
----------------------------------------------------------

:pep:`493` provides additional migration tools to support a more incremental
infrastructure upgrade process for environments containing applications and
services relying on the historically permissive processing of server
certificates when establishing client HTTPS connections.  These additions were
made in the Python 2.7.12 release.

These tools are intended for use in cases where affected applications and
services can't be modified to explicitly pass a more permissive SSL context
when establishing the connection.

For applications and services which can't be modified at all, the new
``PYTHONHTTPSVERIFY`` environment variable may be set to ``0`` to revert an
entire Python process back to the default permissive behaviour of Python 2.7.8
and earlier.

For cases where the connection establishment code can't be modified, but the
overall application can be, the new :func:`ssl._https_verify_certificates`
function can be used to adjust the default behaviour at runtime.


New ``make regen-all`` build target
-----------------------------------

To simplify cross-compilation, and to ensure that CPython can reliably be
compiled without requiring an existing version of Python to already be
available, the autotools-based build system no longer attempts to implicitly
recompile generated files based on file modification times.

Instead, a new ``make regen-all`` command has been added to force regeneration
of these files when desired (e.g. after an initial version of Python has
already been built based on the pregenerated versions).

More selective regeneration targets are also defined - see
:source:`Makefile.pre.in` for details.

(Contributed by Victor Stinner in :issue:`23404`.)

.. versionadded:: 2.7.14


Removal of ``make touch`` build target
--------------------------------------

The ``make touch`` build target previously used to request implicit regeneration
of generated files by updating their modification times has been removed.

It has been replaced by the new ``make regen-all`` target.

(Contributed by Victor Stinner in :issue:`23404`.)

.. versionchanged:: 2.7.14

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

.. _acks27:

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

The author would like to thank the following people for offering
suggestions, corrections and assistance with various drafts of this
article: Nick Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray,
Hugh Secker-Walker.
