****************************
  What's New in Python 2.4
****************************

:Author: A.M. Kuchling

.. |release| replace:: 1.02

.. $Id: whatsnew24.tex 54632 2007-03-31 11:59:54Z georg.brandl $
.. Don't write extensive text for new sections; I'll do that.
.. Feel free to add commented-out reminders of things that need
.. to be covered.  --amk

This article explains the new features in Python 2.4.1, released on March 30,
2005.

Python 2.4 is a medium-sized release.  It doesn't introduce as many changes as
the radical Python 2.2, but introduces more features than the conservative 2.3
release.  The most significant new language features are function decorators and
generator expressions; most other changes are to the standard library.

According to the CVS change logs, there were 481 patches applied and 502 bugs
fixed between Python 2.3 and 2.4.  Both figures are likely to be underestimates.

This article doesn't attempt to provide a complete specification of every single
new feature, but instead provides a brief introduction to each feature.  For
full details, you should refer to the documentation for Python 2.4, such as the
Python Library Reference and the Python Reference Manual.  Often you will be
referred to the PEP for a particular new feature for explanations of the
implementation and design rationale.

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


PEP 218: Built-In Set Objects
=============================

Python 2.3 introduced the :mod:`sets` module.  C implementations of set data
types have now been added to the Python core as two new built-in types,
``set(iterable)`` and ``frozenset(iterable)``.  They provide high speed
operations for membership testing, for eliminating duplicates from sequences,
and for mathematical operations like unions, intersections, differences, and
symmetric differences. ::

   >>> a = set('abracadabra')              # form a set from a string
   >>> 'z' in a                            # fast membership testing
   False
   >>> a                                   # unique letters in a
   set(['a', 'r', 'b', 'c', 'd'])
   >>> ''.join(a)                          # convert back into a string
   'arbcd'

   >>> b = set('alacazam')                 # form a second set
   >>> a - b                               # letters in a but not in b
   set(['r', 'd', 'b'])
   >>> a | b                               # letters in either a or b
   set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
   >>> a & b                               # letters in both a and b
   set(['a', 'c'])
   >>> a ^ b                               # letters in a or b but not both
   set(['r', 'd', 'b', 'm', 'z', 'l'])

   >>> a.add('z')                          # add a new element
   >>> a.update('wxy')                     # add multiple new elements
   >>> a
   set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'x', 'z'])
   >>> a.remove('x')                       # take one element out
   >>> a
   set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'z'])

The :func:`frozenset` type is an immutable version of :func:`set`. Since it is
immutable and hashable, it may be used as a dictionary key or as a member of
another set.

The :mod:`sets` module remains in the standard library, and may be useful if you
wish to subclass the :class:`Set` or :class:`ImmutableSet` classes.  There are
currently no plans to deprecate the module.


.. seealso::

   :pep:`218` - Adding a Built-In Set Object Type
      Originally proposed by Greg Wilson and ultimately implemented by Raymond
      Hettinger.

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


PEP 237: Unifying Long Integers and Integers
============================================

The lengthy transition process for this PEP, begun in Python 2.2, takes another
step forward in Python 2.4.  In 2.3, certain integer operations that would
behave differently after int/long unification triggered :exc:`FutureWarning`
warnings and returned values limited to 32 or 64 bits (depending on your
platform).  In 2.4, these expressions no longer produce a warning and instead
produce a different result that's usually a long integer.

The problematic expressions are primarily left shifts and lengthy hexadecimal
and octal constants.  For example, ``2 << 32`` results in a warning in 2.3,
evaluating to 0 on 32-bit platforms.  In Python 2.4, this expression now returns
the correct answer, 8589934592.


.. seealso::

   :pep:`237` - Unifying Long Integers and Integers
      Original PEP written by Moshe Zadka and GvR.  The changes for 2.4 were
      implemented by  Kalle Svensson.

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


PEP 289: Generator Expressions
==============================

The iterator feature introduced in Python 2.2 and the :mod:`itertools` module
make it easier to write programs that loop through large data sets without
having the entire data set in memory at one time.  List comprehensions don't fit
into this picture very well because they produce a Python list object containing
all of the items.  This unavoidably pulls all of the objects into memory, which
can be a problem if your data set is very large.  When trying to write a
functionally-styled program, it would be natural to write something like::

   links = [link for link in get_all_links() if not link.followed]
   for link in links:
       ...

instead of  ::

   for link in get_all_links():
       if link.followed:
           continue
       ...

The first form is more concise and perhaps more readable, but if you're dealing
with a large number of link objects you'd have to write the second form to avoid
having all link objects in memory at the same time.

Generator expressions work similarly to list comprehensions but don't
materialize the entire list; instead they create a generator that will return
elements one by one.  The above example could be written as::

   links = (link for link in get_all_links() if not link.followed)
   for link in links:
       ...

Generator expressions always have to be written inside parentheses, as in the
above example.  The parentheses signalling a function call also count, so if you
want to create an iterator that will be immediately passed to a function you
could write::

   print sum(obj.count for obj in list_all_objects())

Generator expressions differ from list comprehensions in various small ways.
Most notably, the loop variable (*obj* in the above example) is not accessible
outside of the generator expression.  List comprehensions leave the variable
assigned to its last value; future versions of Python will change this, making
list comprehensions match generator expressions in this respect.


.. seealso::

   :pep:`289` - Generator Expressions
      Proposed by Raymond Hettinger and implemented by Jiwon Seo with early efforts
      steered by Hye-Shik Chang.

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


PEP 292: Simpler String Substitutions
=====================================

Some new classes in the standard library provide an alternative mechanism for
substituting variables into strings; this style of substitution may be better
for applications where untrained users need to edit templates.

The usual way of substituting variables by name is the ``%`` operator::

   >>> '%(page)i: %(title)s' % {'page':2, 'title': 'The Best of Times'}
   '2: The Best of Times'

When writing the template string, it can be easy to forget the ``i`` or ``s``
after the closing parenthesis.  This isn't a big problem if the template is in a
Python module, because you run the code, get an "Unsupported format character"
:exc:`ValueError`, and fix the problem.  However, consider an application such
as Mailman where template strings or translations are being edited by users who
aren't aware of the Python language.  The format string's syntax is complicated
to explain to such users, and if they make a mistake, it's difficult to provide
helpful feedback to them.

PEP 292 adds a :class:`Template` class to the :mod:`string` module that uses
``$`` to indicate a substitution::

   >>> import string
   >>> t = string.Template('$page: $title')
   >>> t.substitute({'page':2, 'title': 'The Best of Times'})
   '2: The Best of Times'

If a key is missing from the dictionary, the :meth:`substitute` method will
raise a :exc:`KeyError`.  There's also a :meth:`safe_substitute` method that
ignores missing keys::

   >>> t = string.Template('$page: $title')
   >>> t.safe_substitute({'page':3})
   '3: $title'


.. seealso::

   :pep:`292` - Simpler String Substitutions
      Written and implemented  by Barry Warsaw.

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


PEP 318: Decorators for Functions and Methods
=============================================

Python 2.2 extended Python's object model by adding static methods and class
methods, but it didn't extend Python's syntax to provide any new way of defining
static or class methods.  Instead, you had to write a :keyword:`def` statement
in the usual way, and pass the resulting method to a :func:`staticmethod` or
:func:`classmethod` function that would wrap up the function as a method of the
new type. Your code would look like this::

   class C:
      def meth (cls):
          ...

      meth = classmethod(meth)   # Rebind name to wrapped-up class method

If the method was very long, it would be easy to miss or forget the
:func:`classmethod` invocation after the function body.

The intention was always to add some syntax to make such definitions more
readable, but at the time of 2.2's release a good syntax was not obvious.  Today
a good syntax *still* isn't obvious but users are asking for easier access to
the feature; a new syntactic feature has been added to meet this need.

The new feature is called "function decorators".  The name comes from the idea
that :func:`classmethod`, :func:`staticmethod`, and friends are storing
additional information on a function object; they're *decorating* functions with
more details.

The notation borrows from Java and uses the ``'@'`` character as an indicator.
Using the new syntax, the example above would be written::

   class C:

      @classmethod
      def meth (cls):
          ...


The ``@classmethod`` is shorthand for the ``meth=classmethod(meth)`` assignment.
More generally, if you have the following::

   @A
   @B
   @C
   def f ():
       ...

It's equivalent to the following pre-decorator code::

   def f(): ...
   f = A(B(C(f)))

Decorators must come on the line before a function definition, one decorator per
line, and can't be on the same line as the def statement, meaning that ``@A def
f(): ...`` is illegal.  You can only decorate function definitions, either at
the module level or inside a class; you can't decorate class definitions.

A decorator is just a function that takes the function to be decorated as an
argument and returns either the same function or some new object.  The return
value of the decorator need not be callable (though it typically is), unless
further decorators will be applied to the result.  It's easy to write your own
decorators.  The following simple example just sets an attribute on the function
object::

   >>> def deco(func):
   ...    func.attr = 'decorated'
   ...    return func
   ...
   >>> @deco
   ... def f(): pass
   ...
   >>> f
   <function f at 0x402ef0d4>
   >>> f.attr
   'decorated'
   >>>

As a slightly more realistic example, the following decorator checks that the
supplied argument is an integer::

   def require_int (func):
       def wrapper (arg):
           assert isinstance(arg, int)
           return func(arg)

       return wrapper

   @require_int
   def p1 (arg):
       print arg

   @require_int
   def p2(arg):
       print arg*2

An example in :pep:`318` contains a fancier version of this idea that lets you
both specify the required type and check the returned type.

Decorator functions can take arguments.  If arguments are supplied, your
decorator function is called with only those arguments and must return a new
decorator function; this function must take a single function and return a
function, as previously described.  In other words, ``@A @B @C(args)`` becomes::

   def f(): ...
   _deco = C(args)
   f = A(B(_deco(f)))

Getting this right can be slightly brain-bending, but it's not too difficult.

A small related change makes the :attr:`func_name` attribute of functions
writable.  This attribute is used to display function names in tracebacks, so
decorators should change the name of any new function that's constructed and
returned.


.. seealso::

   :pep:`318` - Decorators for Functions, Methods and Classes
      Written  by Kevin D. Smith, Jim Jewett, and Skip Montanaro.  Several people
      wrote patches implementing function decorators, but the one that was actually
      checked in was patch #979728, written by Mark Russell.

   https://wiki.python.org/moin/PythonDecoratorLibrary
      This Wiki page contains several examples of decorators.

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


PEP 322: Reverse Iteration
==========================

A new built-in function, ``reversed(seq)``, takes a sequence and returns an
iterator that loops over the elements of the sequence  in reverse order.   ::

   >>> for i in reversed(xrange(1,4)):
   ...    print i
   ...
   3
   2
   1

Compared to extended slicing, such as ``range(1,4)[::-1]``, :func:`reversed` is
easier to read, runs faster, and uses substantially less memory.

Note that :func:`reversed` only accepts sequences, not arbitrary iterators.  If
you want to reverse an iterator, first convert it to  a list with :func:`list`.
::

   >>> input = open('/etc/passwd', 'r')
   >>> for line in reversed(list(input)):
   ...   print line
   ...
   root:*:0:0:System Administrator:/var/root:/bin/tcsh
     ...


.. seealso::

   :pep:`322` - Reverse Iteration
      Written and implemented by Raymond Hettinger.

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


PEP 324: New subprocess Module
==============================

The standard library provides a number of ways to execute a subprocess, offering
different features and different levels of complexity.
``os.system(command)`` is easy to use, but slow (it runs a shell process
which executes the command) and dangerous (you have to be careful about escaping
the shell's metacharacters).  The :mod:`popen2` module offers classes that can
capture standard output and standard error from the subprocess, but the naming
is confusing.  The :mod:`subprocess` module cleans  this up, providing a unified
interface that offers all the features you might need.

Instead of :mod:`popen2`'s collection of classes, :mod:`subprocess` contains a
single class called :class:`Popen`  whose constructor supports a number of
different keyword arguments. ::

   class Popen(args, bufsize=0, executable=None,
               stdin=None, stdout=None, stderr=None,
               preexec_fn=None, close_fds=False, shell=False,
               cwd=None, env=None, universal_newlines=False,
               startupinfo=None, creationflags=0):

*args* is commonly a sequence of strings that will be the arguments to the
program executed as the subprocess.  (If the *shell* argument is true, *args*
can be a string which will then be passed on to the shell for interpretation,
just as :func:`os.system` does.)

*stdin*, *stdout*, and *stderr* specify what the subprocess's input, output, and
error streams will be.  You can provide a file object or a file descriptor, or
you can use the constant ``subprocess.PIPE`` to create a pipe between the
subprocess and the parent.

.. index::
   single: universal newlines; What's new

The constructor has a number of handy options:

* *close_fds* requests that all file descriptors be closed before running the
  subprocess.

* *cwd* specifies the working directory in which the subprocess will be executed
  (defaulting to whatever the parent's working directory is).

* *env* is a dictionary specifying environment variables.

* *preexec_fn* is a function that gets called before the child is started.

* *universal_newlines* opens the child's input and output using Python's
  :term:`universal newlines` feature.

Once you've created the :class:`Popen` instance,  you can call its :meth:`wait`
method to pause until the subprocess has exited, :meth:`poll` to check if it's
exited without pausing,  or ``communicate(data)`` to send the string *data*
to the subprocess's standard input.   ``communicate(data)``  then reads any
data that the subprocess has sent to its standard output  or standard error,
returning a tuple ``(stdout_data, stderr_data)``.

:func:`call` is a shortcut that passes its arguments along to the :class:`Popen`
constructor, waits for the command to complete, and returns the status code of
the subprocess.  It can serve as a safer analog to :func:`os.system`::

   sts = subprocess.call(['dpkg', '-i', '/tmp/new-package.deb'])
   if sts == 0:
       # Success
       ...
   else:
       # dpkg returned an error
       ...

The command is invoked without use of the shell.  If you really do want to  use
the shell, you can add ``shell=True`` as a keyword argument and provide a string
instead of a sequence::

   sts = subprocess.call('dpkg -i /tmp/new-package.deb', shell=True)

The PEP takes various examples of shell and Python code and shows how they'd be
translated into Python code that uses :mod:`subprocess`.  Reading this section
of the PEP is highly recommended.


.. seealso::

   :pep:`324` - subprocess - New process module
      Written and implemented by Peter Åstrand, with assistance from Fredrik Lundh and
      others.

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


PEP 327: Decimal Data Type
==========================

Python has always supported floating-point (FP) numbers, based on the underlying
C :c:type:`double` type, as a data type.  However, while most programming
languages provide a floating-point type, many people (even programmers) are
unaware that floating-point numbers don't represent certain decimal fractions
accurately.  The new :class:`Decimal` type can represent these fractions
accurately, up to a user-specified precision limit.


Why is Decimal needed?
----------------------

The limitations arise from the representation used for floating-point numbers.
FP numbers are made up of three components:

* The sign, which is positive or negative.

* The mantissa, which is a single-digit binary number   followed by a fractional
  part.  For example, ``1.01`` in base-2 notation is ``1 + 0/2 + 1/4``, or 1.25 in
  decimal notation.

* The exponent, which tells where the decimal point is located in the number
  represented.

For example, the number 1.25 has positive sign, a mantissa value of 1.01 (in
binary), and an exponent of 0 (the decimal point doesn't need to be shifted).
The number 5 has the same sign and mantissa, but the exponent is 2 because the
mantissa is multiplied by 4 (2 to the power of the exponent 2); 1.25 \* 4 equals
5.

Modern systems usually provide floating-point support that conforms to a
standard called IEEE 754.  C's :c:type:`double` type is usually implemented as a
64-bit IEEE 754 number, which uses 52 bits of space for the mantissa.  This
means that numbers can only be specified to 52 bits of precision.  If you're
trying to represent numbers whose expansion repeats endlessly, the expansion is
cut off after 52 bits. Unfortunately, most software needs to produce output in
base 10, and common fractions in base 10 are often repeating decimals in binary.
For example, 1.1 decimal is binary ``1.0001100110011 ...``; .1 = 1/16 + 1/32 +
1/256 plus an infinite number of additional terms.  IEEE 754 has to chop off
that infinitely repeated decimal after 52 digits, so the representation is
slightly inaccurate.

Sometimes you can see this inaccuracy when the number is printed::

   >>> 1.1
   1.1000000000000001

The inaccuracy isn't always visible when you print the number because the FP-to-
decimal-string conversion is provided by the C library, and most C libraries try
to produce sensible output.  Even if it's not displayed, however, the inaccuracy
is still there and subsequent operations can magnify the error.

For many applications this doesn't matter.  If I'm plotting points and
displaying them on my monitor, the difference between 1.1 and 1.1000000000000001
is too small to be visible.  Reports often limit output to a certain number of
decimal places, and if you round the number to two or three or even eight
decimal places, the error is never apparent.  However, for applications where it
does matter,  it's a lot of work to implement your own custom arithmetic
routines.

Hence, the :class:`Decimal` type was created.


The :class:`Decimal` type
-------------------------

A new module, :mod:`decimal`, was added to Python's standard library.  It
contains two classes, :class:`Decimal` and :class:`Context`.  :class:`Decimal`
instances represent numbers, and :class:`Context` instances are used to wrap up
various settings such as the precision and default rounding mode.

:class:`Decimal` instances are immutable, like regular Python integers and FP
numbers; once it's been created, you can't change the value an instance
represents.  :class:`Decimal` instances can be created from integers or
strings::

   >>> import decimal
   >>> decimal.Decimal(1972)
   Decimal("1972")
   >>> decimal.Decimal("1.1")
   Decimal("1.1")

You can also provide tuples containing the sign, the mantissa represented  as a
tuple of decimal digits, and the exponent::

   >>> decimal.Decimal((1, (1, 4, 7, 5), -2))
   Decimal("-14.75")

Cautionary note: the sign bit is a Boolean value, so 0 is positive and 1 is
negative.

Converting from floating-point numbers poses a bit of a problem: should the FP
number representing 1.1 turn into the decimal number for exactly 1.1, or for 1.1
plus whatever inaccuracies are introduced? The decision was to dodge the issue
and leave such a conversion out of the API.  Instead, you should convert the
floating-point number into a string using the desired precision and pass the
string to the :class:`Decimal` constructor::

   >>> f = 1.1
   >>> decimal.Decimal(str(f))
   Decimal("1.1")
   >>> decimal.Decimal('%.12f' % f)
   Decimal("1.100000000000")

Once you have :class:`Decimal` instances, you can perform the usual mathematical
operations on them.  One limitation: exponentiation requires an integer
exponent::

   >>> a = decimal.Decimal('35.72')
   >>> b = decimal.Decimal('1.73')
   >>> a+b
   Decimal("37.45")
   >>> a-b
   Decimal("33.99")
   >>> a*b
   Decimal("61.7956")
   >>> a/b
   Decimal("20.64739884393063583815028902")
   >>> a ** 2
   Decimal("1275.9184")
   >>> a**b
   Traceback (most recent call last):
     ...
   decimal.InvalidOperation: x ** (non-integer)

You can combine :class:`Decimal` instances with integers, but not with floating-
point numbers::

   >>> a + 4
   Decimal("39.72")
   >>> a + 4.5
   Traceback (most recent call last):
     ...
   TypeError: You can interact Decimal only with int, long or Decimal data types.
   >>>

:class:`Decimal` numbers can be used with the :mod:`math` and :mod:`cmath`
modules, but note that they'll be immediately converted to  floating-point
numbers before the operation is performed, resulting in a possible loss of
precision and accuracy.  You'll also get back a regular floating-point number
and not a :class:`Decimal`.   ::

   >>> import math, cmath
   >>> d = decimal.Decimal('123456789012.345')
   >>> math.sqrt(d)
   351364.18288201344
   >>> cmath.sqrt(-d)
   351364.18288201344j

:class:`Decimal` instances have a :meth:`sqrt` method that returns a
:class:`Decimal`, but if you need other things such as trigonometric functions
you'll have to implement them. ::

   >>> d.sqrt()
   Decimal("351364.1828820134592177245001")


The :class:`Context` type
-------------------------

Instances of the :class:`Context` class encapsulate several settings for
decimal operations:

* :attr:`prec` is the precision, the number of decimal places.

* :attr:`rounding` specifies the rounding mode.  The :mod:`decimal` module has
  constants for the various possibilities: :const:`ROUND_DOWN`,
  :const:`ROUND_CEILING`,  :const:`ROUND_HALF_EVEN`, and various others.

* :attr:`traps` is a dictionary specifying what happens on encountering certain
  error conditions: either  an exception is raised or  a value is returned.  Some
  examples of error conditions are division by zero, loss of precision, and
  overflow.

There's a thread-local default context available by calling :func:`getcontext`;
you can change the properties of this context to alter the default precision,
rounding, or trap handling.  The following example shows the effect of changing
the precision of the default context::

   >>> decimal.getcontext().prec
   28
   >>> decimal.Decimal(1) / decimal.Decimal(7)
   Decimal("0.1428571428571428571428571429")
   >>> decimal.getcontext().prec = 9
   >>> decimal.Decimal(1) / decimal.Decimal(7)
   Decimal("0.142857143")

The default action for error conditions is selectable; the module can either
return a special value such as infinity or not-a-number, or exceptions can be
raised::

   >>> decimal.Decimal(1) / decimal.Decimal(0)
   Traceback (most recent call last):
     ...
   decimal.DivisionByZero: x / 0
   >>> decimal.getcontext().traps[decimal.DivisionByZero] = False
   >>> decimal.Decimal(1) / decimal.Decimal(0)
   Decimal("Infinity")
   >>>

The :class:`Context` instance also has various methods for formatting  numbers
such as :meth:`to_eng_string` and :meth:`to_sci_string`.

For more information, see the documentation for the :mod:`decimal` module, which
includes a quick-start tutorial and a reference.


.. seealso::

   :pep:`327` - Decimal Data Type
      Written by Facundo Batista and implemented by Facundo Batista, Eric Price,
      Raymond Hettinger, Aahz, and Tim Peters.

   http://www.lahey.com/float.htm
      The article uses Fortran code to illustrate many of the problems that floating-
      point inaccuracy can cause.

   http://speleotrove.com/decimal/
      A description of a decimal-based representation.  This representation is being
      proposed as a standard, and underlies the new Python decimal type.  Much of this
      material was written by Mike Cowlishaw, designer of the Rexx language.

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


PEP 328: Multi-line Imports
===========================

One language change is a small syntactic tweak aimed at making it easier to
import many names from a module.  In a ``from module import names`` statement,
*names* is a sequence of names separated by commas.  If the sequence is  very
long, you can either write multiple imports from the same module, or you can use
backslashes to escape the line endings like this::

   from SimpleXMLRPCServer import SimpleXMLRPCServer,\
               SimpleXMLRPCRequestHandler,\
               CGIXMLRPCRequestHandler,\
               resolve_dotted_attribute

The syntactic change in Python 2.4 simply allows putting the names within
parentheses.  Python ignores newlines within a parenthesized expression, so the
backslashes are no longer needed::

   from SimpleXMLRPCServer import (SimpleXMLRPCServer,
                                   SimpleXMLRPCRequestHandler,
                                   CGIXMLRPCRequestHandler,
                                   resolve_dotted_attribute)

The PEP also proposes that all :keyword:`import` statements be absolute imports,
with a leading ``.`` character to indicate a relative import.  This part of the
PEP was not implemented for Python 2.4, but was completed for Python 2.5.


.. seealso::

   :pep:`328` - Imports: Multi-Line and Absolute/Relative
      Written by Aahz.  Multi-line imports were implemented by Dima Dorfman.

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


PEP 331: Locale-Independent Float/String Conversions
====================================================

The :mod:`locale` modules lets Python software select various conversions and
display conventions that are localized to a particular country or language.
However, the module was careful to not change the numeric locale because various
functions in Python's implementation required that the numeric locale remain set
to the ``'C'`` locale.  Often this was because the code was using the C
library's :c:func:`atof` function.

Not setting the numeric locale caused trouble for extensions that used third-
party C libraries, however, because they wouldn't have the correct locale set.
The motivating example was GTK+, whose user interface widgets weren't displaying
numbers in the current locale.

The solution described in the PEP is to add three new functions to the Python
API that perform ASCII-only conversions, ignoring the locale setting:

* ``PyOS_ascii_strtod(str, ptr)``  and ``PyOS_ascii_atof(str, ptr)``
  both convert a string to a C :c:type:`double`.

* ``PyOS_ascii_formatd(buffer, buf_len, format, d)`` converts a
  :c:type:`double` to an ASCII string.

The code for these functions came from the GLib library
(https://developer.gnome.org/glib/stable/), whose developers kindly
relicensed the relevant functions and donated them to the Python Software
Foundation.  The :mod:`locale` module  can now change the numeric locale,
letting extensions such as GTK+  produce the correct results.


.. seealso::

   :pep:`331` - Locale-Independent Float/String Conversions
      Written by Christian R. Reis, and implemented by Gustavo Carneiro.

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


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

Here are all of the changes that Python 2.4 makes to the core Python language.

* Decorators for functions and methods were added (:pep:`318`).

* Built-in :func:`set` and :func:`frozenset` types were  added (:pep:`218`).
  Other new built-ins include the ``reversed(seq)`` function (:pep:`322`).

* Generator expressions were added (:pep:`289`).

* Certain numeric expressions no longer return values restricted to 32 or 64
  bits (:pep:`237`).

* You can now put parentheses around the list of names in a ``from module import
  names`` statement (:pep:`328`).

* The :meth:`dict.update` method now accepts the same argument forms as the
  :class:`dict` constructor.  This includes any mapping, any iterable of key/value
  pairs, and keyword arguments. (Contributed by Raymond Hettinger.)

* The string methods :meth:`ljust`, :meth:`rjust`, and :meth:`center` now take
  an optional argument for specifying a fill character other than a space.
  (Contributed by Raymond Hettinger.)

* Strings also gained an :meth:`rsplit` method that works like the :meth:`split`
  method but splits from the end of the string.   (Contributed by Sean
  Reifschneider.) ::

     >>> 'www.python.org'.split('.', 1)
     ['www', 'python.org']
     'www.python.org'.rsplit('.', 1)
     ['www.python', 'org']

* Three keyword parameters, *cmp*, *key*, and *reverse*, were added to the
  :meth:`sort` method of lists. These parameters make some common usages of
  :meth:`sort` simpler. All of these parameters are optional.

  For the *cmp* parameter, the value should be a comparison function that takes
  two parameters and returns -1, 0, or +1 depending on how the parameters compare.
  This function will then be used to sort the list.  Previously this was the only
  parameter that could be provided to :meth:`sort`.

  *key* should be a single-parameter function that takes a list element and
  returns a comparison key for the element.  The list is then sorted using the
  comparison keys.  The following example sorts a list case-insensitively::

     >>> L = ['A', 'b', 'c', 'D']
     >>> L.sort()                 # Case-sensitive sort
     >>> L
     ['A', 'D', 'b', 'c']
     >>> # Using 'key' parameter to sort list
     >>> L.sort(key=lambda x: x.lower())
     >>> L
     ['A', 'b', 'c', 'D']
     >>> # Old-fashioned way
     >>> L.sort(cmp=lambda x,y: cmp(x.lower(), y.lower()))
     >>> L
     ['A', 'b', 'c', 'D']

  The last example, which uses the *cmp* parameter, is the old way to perform a
  case-insensitive sort.  It works but is slower than using a *key* parameter.
  Using *key* calls :meth:`lower` method once for each element in the list while
  using *cmp* will call it twice for each comparison, so using *key* saves on
  invocations of the :meth:`lower` method.

  For simple key functions and comparison functions, it is often possible to avoid
  a :keyword:`lambda` expression by using an unbound method instead.  For example,
  the above case-insensitive sort is best written as::

     >>> L.sort(key=str.lower)
     >>> L
     ['A', 'b', 'c', 'D']

  Finally, the *reverse* parameter takes a Boolean value.  If the value is true,
  the list will be sorted into reverse order. Instead of ``L.sort();
  L.reverse()``, you can now write ``L.sort(reverse=True)``.

  The results of sorting are now guaranteed to be stable.  This means that two
  entries with equal keys will be returned in the same order as they were input.
  For example, you can sort a list of people by name, and then sort the list by
  age, resulting in a list sorted by age where people with the same age are in
  name-sorted order.

  (All changes to :meth:`sort` contributed by Raymond Hettinger.)

* There is a new built-in function ``sorted(iterable)`` that works like the
  in-place :meth:`list.sort` method but can be used in expressions.  The
  differences are:

* the input may be any iterable;

* a newly formed copy is sorted, leaving the original intact; and

* the expression returns the new sorted copy

  ::

     >>> L = [9,7,8,3,2,4,1,6,5]
     >>> [10+i for i in sorted(L)]       # usable in a list comprehension
     [11, 12, 13, 14, 15, 16, 17, 18, 19]
     >>> L                               # original is left unchanged
     [9,7,8,3,2,4,1,6,5]
     >>> sorted('Monty Python')          # any iterable may be an input
     [' ', 'M', 'P', 'h', 'n', 'n', 'o', 'o', 't', 't', 'y', 'y']

     >>> # List the contents of a dict sorted by key values
     >>> colormap = dict(red=1, blue=2, green=3, black=4, yellow=5)
     >>> for k, v in sorted(colormap.iteritems()):
     ...     print k, v
     ...
     black 4
     blue 2
     green 3
     red 1
     yellow 5

  (Contributed by Raymond Hettinger.)

* Integer operations will no longer trigger an :exc:`OverflowWarning`. The
  :exc:`OverflowWarning` warning will disappear in Python 2.5.

* The interpreter gained a new switch, :option:`-m`, that takes a name, searches
  for the corresponding  module on ``sys.path``, and runs the module as a script.
  For example,  you can now run the Python profiler with ``python -m profile``.
  (Contributed by Nick Coghlan.)

* The ``eval(expr, globals, locals)`` and ``execfile(filename, globals,
  locals)`` functions and the ``exec`` statement now accept any mapping type
  for the *locals* parameter.  Previously this had to be a regular Python
  dictionary.  (Contributed by Raymond Hettinger.)

* The :func:`zip` built-in function and :func:`itertools.izip` now return an
  empty list if called with no arguments. Previously they raised a
  :exc:`TypeError` exception.  This makes them more suitable for use with variable
  length argument lists::

     >>> def transpose(array):
     ...    return zip(*array)
     ...
     >>> transpose([(1,2,3), (4,5,6)])
     [(1, 4), (2, 5), (3, 6)]
     >>> transpose([])
     []

  (Contributed by Raymond Hettinger.)

* Encountering a failure while importing a module no longer leaves a partially-
  initialized module object in ``sys.modules``.  The incomplete module object left
  behind would fool further imports of the same module into succeeding, leading to
  confusing errors.   (Fixed by Tim Peters.)

* :const:`None` is now a constant; code that binds a new value to  the name
  ``None`` is now a syntax error. (Contributed by Raymond Hettinger.)

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


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

* The inner loops for list and tuple slicing were optimized and now run about
  one-third faster.  The inner loops for dictionaries were also optimized,
  resulting in performance boosts for :meth:`keys`, :meth:`values`, :meth:`items`,
  :meth:`iterkeys`, :meth:`itervalues`, and :meth:`iteritems`. (Contributed by
  Raymond Hettinger.)

* The machinery for growing and shrinking lists was optimized for speed and for
  space efficiency.  Appending and popping from lists now runs faster due to more
  efficient code paths and less frequent use of the underlying system
  :c:func:`realloc`.  List comprehensions also benefit.   :meth:`list.extend` was
  also optimized and no longer converts its argument into a temporary list before
  extending the base list.  (Contributed by Raymond Hettinger.)

* :func:`list`, :func:`tuple`, :func:`map`, :func:`filter`, and :func:`zip` now
  run several times faster with non-sequence arguments that supply a
  :meth:`__len__` method.  (Contributed by Raymond Hettinger.)

* The methods :meth:`list.__getitem__`, :meth:`dict.__getitem__`, and
  :meth:`dict.__contains__` are now implemented as :class:`method_descriptor`
  objects rather than :class:`wrapper_descriptor` objects.  This form of  access
  doubles their performance and makes them more suitable for use as arguments to
  functionals: ``map(mydict.__getitem__, keylist)``. (Contributed by Raymond
  Hettinger.)

* Added a new opcode, ``LIST_APPEND``, that simplifies the generated bytecode
  for list comprehensions and speeds them up by about a third.  (Contributed by
  Raymond Hettinger.)

* The peephole bytecode optimizer has been improved to  produce shorter, faster
  bytecode; remarkably, the resulting bytecode is  more readable.  (Enhanced by
  Raymond Hettinger.)

* String concatenations in statements of the form ``s = s + "abc"`` and ``s +=
  "abc"`` are now performed more efficiently in certain circumstances.  This
  optimization won't be present in other Python implementations such as Jython, so
  you shouldn't rely on it; using the :meth:`join` method of strings is still
  recommended when you want to efficiently glue a large number of strings
  together. (Contributed by Armin Rigo.)

The net result of the 2.4 optimizations is that Python 2.4 runs the pystone
benchmark around 5% faster than Python 2.3 and 35% faster than Python 2.2.
(pystone is not a particularly good benchmark, but it's the most commonly used
measurement of Python's performance.  Your own applications may show greater or
smaller benefits from Python 2.4.)

.. pystone is almost useless for comparing different versions of Python;
   instead, it excels at predicting relative Python performance on different
   machines.  So, this section would be more informative if it used other tools
   such as pybench and parrotbench.  For a more application oriented benchmark,
   try comparing the timings of test_decimal.py under 2.3 and 2.4.

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


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

As usual, 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 CVS logs for all the details.

* The :mod:`asyncore` module's :func:`loop` function now has a *count* parameter
  that lets you perform a limited number of passes through the polling loop.  The
  default is still to loop forever.

* The :mod:`base64` module now has more complete RFC 3548 support for Base64,
  Base32, and Base16 encoding and decoding, including optional case folding and
  optional alternative alphabets. (Contributed by Barry Warsaw.)

* The :mod:`bisect` module now has an underlying C implementation for improved
  performance. (Contributed by Dmitry Vasiliev.)

* The CJKCodecs collections of East Asian codecs, maintained by Hye-Shik Chang,
  was integrated into 2.4.   The new encodings are:

* Chinese (PRC): gb2312, gbk, gb18030, big5hkscs, hz

* Chinese (ROC): big5, cp950

* Japanese: cp932, euc-jis-2004, euc-jp, euc-jisx0213, iso-2022-jp,
    iso-2022-jp-1, iso-2022-jp-2, iso-2022-jp-3, iso-2022-jp-ext, iso-2022-jp-2004,
    shift-jis, shift-jisx0213, shift-jis-2004

* Korean: cp949, euc-kr, johab, iso-2022-kr

* Some other new encodings were added: HP Roman8,  ISO_8859-11, ISO_8859-16,
  PCTP-154, and TIS-620.

* The UTF-8 and UTF-16 codecs now cope better with receiving partial input.
  Previously the :class:`StreamReader` class would try to read more data, making
  it impossible to resume decoding from the stream.  The :meth:`read` method will
  now return as much data as it can and future calls will resume decoding where
  previous ones left off.  (Implemented by Walter Dörwald.)

* There is a new :mod:`collections` module for  various specialized collection
  datatypes.   Currently it contains just one type, :class:`deque`,  a double-
  ended queue that supports efficiently adding and removing elements from either
  end::

     >>> from collections import deque
     >>> d = deque('ghi')        # make a new deque with three items
     >>> d.append('j')           # add a new entry to the right side
     >>> d.appendleft('f')       # add a new entry to the left side
     >>> d                       # show the representation of the deque
     deque(['f', 'g', 'h', 'i', 'j'])
     >>> d.pop()                 # return and remove the rightmost item
     'j'
     >>> d.popleft()             # return and remove the leftmost item
     'f'
     >>> list(d)                 # list the contents of the deque
     ['g', 'h', 'i']
     >>> 'h' in d                # search the deque
     True

  Several modules, such as the :mod:`Queue` and :mod:`threading` modules, now take
  advantage of :class:`collections.deque` for improved performance.  (Contributed
  by Raymond Hettinger.)

* The :mod:`ConfigParser` classes have been enhanced slightly. The :meth:`read`
  method now returns a list of the files that were successfully parsed, and the
  :meth:`set` method raises :exc:`TypeError` if passed a *value* argument that
  isn't a string.   (Contributed by John Belmonte and David Goodger.)

* The :mod:`curses` module now supports the ncurses extension
  :func:`use_default_colors`.  On platforms where the terminal supports
  transparency, this makes it possible to use a transparent background.
  (Contributed by Jörg Lehmann.)

* The :mod:`difflib` module now includes an :class:`HtmlDiff` class that creates
  an HTML table showing a side by side comparison of two versions of a text.
  (Contributed by Dan Gass.)

* The :mod:`email` package was updated to version 3.0,  which dropped various
  deprecated APIs and removes support for Python versions earlier than 2.3.  The
  3.0 version of the package uses a new incremental parser for MIME messages,
  available in the :mod:`email.FeedParser` module.  The new parser doesn't require
  reading the entire message into memory, and doesn't raise exceptions if a
  message is malformed; instead it records any problems in the  :attr:`defect`
  attribute of the message.  (Developed by Anthony Baxter, Barry Warsaw, Thomas
  Wouters, and others.)

* The :mod:`heapq` module has been converted to C.  The resulting tenfold
  improvement in speed makes the module suitable for handling high volumes of
  data.  In addition, the module has two new functions :func:`nlargest` and
  :func:`nsmallest` that use heaps to find the N largest or smallest values in a
  dataset without the expense of a full sort.  (Contributed by Raymond Hettinger.)

* The :mod:`httplib` module now contains constants for HTTP status codes defined
  in various HTTP-related RFC documents.  Constants have names such as
  :const:`OK`, :const:`CREATED`, :const:`CONTINUE`, and
  :const:`MOVED_PERMANENTLY`; use pydoc to get a full list.  (Contributed by
  Andrew Eland.)

* The :mod:`imaplib` module now supports IMAP's THREAD command (contributed by
  Yves Dionne) and new :meth:`deleteacl` and :meth:`myrights` methods (contributed
  by Arnaud Mazin).

* The :mod:`itertools` module gained a ``groupby(iterable[, *func*])``
  function. *iterable* is something that can be iterated over to return a stream
  of elements, and the optional *func* parameter is a function that takes an
  element and returns a key value; if omitted, the key is simply the element
  itself.  :func:`groupby` then groups the elements into subsequences which have
  matching values of the key, and returns a series of 2-tuples containing the key
  value and an iterator over the subsequence.

  Here's an example to make this clearer.  The *key* function simply returns
  whether a number is even or odd, so the result of :func:`groupby` is to return
  consecutive runs of odd or even numbers. ::

     >>> import itertools
     >>> L = [2, 4, 6, 7, 8, 9, 11, 12, 14]
     >>> for key_val, it in itertools.groupby(L, lambda x: x % 2):
     ...    print key_val, list(it)
     ...
     0 [2, 4, 6]
     1 [7]
     0 [8]
     1 [9, 11]
     0 [12, 14]
     >>>

  :func:`groupby` is typically used with sorted input.  The logic for
  :func:`groupby` is similar to the Unix ``uniq`` filter which makes it handy for
  eliminating, counting, or identifying duplicate elements::

     >>> word = 'abracadabra'
     >>> letters = sorted(word)   # Turn string into a sorted list of letters
     >>> letters
     ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'r', 'r']
     >>> for k, g in itertools.groupby(letters):
     ...    print k, list(g)
     ...
     a ['a', 'a', 'a', 'a', 'a']
     b ['b', 'b']
     c ['c']
     d ['d']
     r ['r', 'r']
     >>> # List unique letters
     >>> [k for k, g in groupby(letters)]
     ['a', 'b', 'c', 'd', 'r']
     >>> # Count letter occurrences
     >>> [(k, len(list(g))) for k, g in groupby(letters)]
     [('a', 5), ('b', 2), ('c', 1), ('d', 1), ('r', 2)]

  (Contributed by Hye-Shik Chang.)

* :mod:`itertools` also gained a function named ``tee(iterator, N)`` that
  returns *N* independent iterators that replicate *iterator*.  If *N* is omitted,
  the default is 2. ::

     >>> L = [1,2,3]
     >>> i1, i2 = itertools.tee(L)
     >>> i1,i2
     (<itertools.tee object at 0x402c2080>, <itertools.tee object at 0x402c2090>)
     >>> list(i1)               # Run the first iterator to exhaustion
     [1, 2, 3]
     >>> list(i2)               # Run the second iterator to exhaustion
     [1, 2, 3]

  Note that :func:`tee` has to keep copies of the values returned  by the
  iterator; in the worst case, it may need to keep all of them.   This should
  therefore be used carefully if the leading iterator can run far ahead of the
  trailing iterator in a long stream of inputs. If the separation is large, then
  you might as well use  :func:`list` instead.  When the iterators track closely
  with one another, :func:`tee` is ideal.  Possible applications include
  bookmarking, windowing, or lookahead iterators. (Contributed by Raymond
  Hettinger.)

* A number of functions were added to the :mod:`locale`  module, such as
  :func:`bind_textdomain_codeset` to specify a particular encoding and a family of
  :func:`l\*gettext` functions that return messages in the chosen encoding.
  (Contributed by Gustavo Niemeyer.)

* Some keyword arguments were added to the :mod:`logging` package's
  :func:`basicConfig` function to simplify log configuration.  The default
  behavior is to log messages to standard error, but various keyword arguments can
  be specified to log to a particular file, change the logging format, or set the
  logging level. For example::

     import logging
     logging.basicConfig(filename='/var/log/application.log',
         level=0,  # Log all messages
         format='%(levelname):%(process):%(thread):%(message)')

  Other additions to the :mod:`logging` package include a ``log(level, msg)``
  convenience method, as well as a :class:`TimedRotatingFileHandler` class that
  rotates its log files at a timed interval.  The module already had
  :class:`RotatingFileHandler`, which rotated logs once the file exceeded a
  certain size.  Both classes derive from a new :class:`BaseRotatingHandler` class
  that can be used to implement other rotating handlers.

  (Changes implemented by Vinay Sajip.)

* The :mod:`marshal` module now shares interned strings on unpacking a  data
  structure.  This may shrink the size of certain pickle strings, but the primary
  effect is to make :file:`.pyc` files significantly smaller. (Contributed by
  Martin von Löwis.)

* The :mod:`nntplib` module's :class:`NNTP` class gained :meth:`description` and
  :meth:`descriptions` methods to retrieve  newsgroup descriptions for a single
  group or for a range of groups. (Contributed by Jürgen A. Erhard.)

* Two new functions were added to the :mod:`operator` module,
  ``attrgetter(attr)`` and ``itemgetter(index)``. Both functions return
  callables that take a single argument and return the corresponding attribute or
  item; these callables make excellent data extractors when used with :func:`map`
  or :func:`sorted`.  For example::

     >>> L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)]
     >>> map(operator.itemgetter(0), L)
     ['c', 'd', 'a', 'b']
     >>> map(operator.itemgetter(1), L)
     [2, 1, 4, 3]
     >>> sorted(L, key=operator.itemgetter(1)) # Sort list by second tuple item
     [('d', 1), ('c', 2), ('b', 3), ('a', 4)]

  (Contributed by Raymond Hettinger.)

* The :mod:`optparse` module was updated in various ways.  The module now passes
  its messages through :func:`gettext.gettext`, making it possible to
  internationalize Optik's help and error messages.  Help messages for options can
  now include the string ``'%default'``, which will be replaced by the option's
  default value.  (Contributed by Greg Ward.)

* The long-term plan is to deprecate the :mod:`rfc822` module in some future
  Python release in favor of the :mod:`email` package. To this end, the
  :func:`email.Utils.formatdate` function has been changed to make it usable as a
  replacement for :func:`rfc822.formatdate`.  You may want to write new e-mail
  processing code with this in mind.  (Change implemented by Anthony Baxter.)

* A new ``urandom(n)`` function was added to the :mod:`os` module, returning
  a string containing *n* bytes of random data.  This function provides access to
  platform-specific sources of randomness such as :file:`/dev/urandom` on Linux or
  the Windows CryptoAPI.  (Contributed by Trevor Perrin.)

* Another new function: ``os.path.lexists(path)``  returns true if the file
  specified by *path* exists, whether or not it's a symbolic link.  This differs
  from the existing ``os.path.exists(path)`` function, which returns false if
  *path* is a symlink that points to a destination that doesn't exist.
  (Contributed by Beni Cherniavsky.)

* A new :func:`getsid` function was added to the :mod:`posix` module that
  underlies the :mod:`os` module. (Contributed by J. Raynor.)

* The :mod:`poplib` module now supports POP over SSL.  (Contributed by Hector
  Urtubia.)

* The :mod:`profile` module can now profile C extension functions. (Contributed
  by Nick Bastin.)

* The :mod:`random` module has a new method called ``getrandbits(N)`` that
  returns a long integer *N* bits in length.  The existing :meth:`randrange`
  method now uses :meth:`getrandbits` where appropriate, making generation of
  arbitrarily large random numbers more efficient.  (Contributed by Raymond
  Hettinger.)

* The regular expression language accepted by the :mod:`re` module was extended
  with simple conditional expressions, written as ``(?(group)A|B)``.  *group* is
  either a numeric group ID or a group name defined with ``(?P<group>...)``
  earlier in the expression.  If the specified group matched, the regular
  expression pattern *A* will be tested against the string; if the group didn't
  match, the pattern *B* will be used instead. (Contributed by Gustavo Niemeyer.)

* The :mod:`re` module is also no longer recursive, thanks to a massive amount
  of work by Gustavo Niemeyer.  In a recursive regular expression engine, certain
  patterns result in a large amount of C stack space being consumed, and it was
  possible to overflow the stack. For example, if you matched a 30000-byte string
  of ``a`` characters against the expression ``(a|b)+``, one stack frame was
  consumed per character.  Python 2.3 tried to check for stack overflow and raise
  a :exc:`RuntimeError` exception, but certain patterns could sidestep the
  checking and if you were unlucky Python could segfault. Python 2.4's regular
  expression engine can match this pattern without problems.

* The :mod:`signal` module now performs tighter error-checking on the parameters
  to the :func:`signal.signal` function.  For example, you can't set a handler on
  the :const:`SIGKILL` signal; previous versions of Python would quietly accept
  this, but 2.4 will raise a :exc:`RuntimeError` exception.

* Two new functions were added to the :mod:`socket` module. :func:`socketpair`
  returns a pair of connected sockets and ``getservbyport(port)`` looks up the
  service name for a given port number. (Contributed by Dave Cole and Barry
  Warsaw.)

* The :func:`sys.exitfunc` function has been deprecated.  Code should be using
  the existing :mod:`atexit` module, which correctly handles calling multiple exit
  functions.  Eventually :func:`sys.exitfunc` will become a purely internal
  interface, accessed only by :mod:`atexit`.

* The :mod:`tarfile` module now generates GNU-format tar files by default.
  (Contributed by Lars Gustäbel.)

* The :mod:`threading` module now has an elegantly simple way to support
  thread-local data.  The module contains a :class:`local` class whose attribute
  values are local to different threads. ::

     import threading

     data = threading.local()
     data.number = 42
     data.url = ('www.python.org', 80)

  Other threads can assign and retrieve their own values for the :attr:`number`
  and :attr:`url` attributes.  You can subclass :class:`local` to initialize
  attributes or to add methods. (Contributed by Jim Fulton.)

* The :mod:`timeit` module now automatically disables periodic garbage
  collection during the timing loop.  This change makes consecutive timings more
  comparable.  (Contributed by Raymond Hettinger.)

* The :mod:`weakref` module now supports a wider variety of objects including
  Python functions, class instances, sets, frozensets, deques, arrays, files,
  sockets, and regular expression pattern objects. (Contributed by Raymond
  Hettinger.)

* The :mod:`xmlrpclib` module now supports a multi-call extension for
  transmitting multiple XML-RPC calls in a single HTTP operation. (Contributed by
  Brian Quinlan.)

* The :mod:`mpz`, :mod:`rotor`, and :mod:`xreadlines` modules have  been
  removed.

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


cookielib
---------

The :mod:`cookielib` library supports client-side handling for HTTP cookies,
mirroring the :mod:`Cookie` module's server-side cookie support. Cookies are
stored in cookie jars; the library transparently stores cookies offered by the
web server in the cookie jar, and fetches the cookie from the jar when
connecting to the server. As in web browsers, policy objects control whether
cookies are accepted or not.

In order to store cookies across sessions, two implementations of cookie jars
are provided: one that stores cookies in the Netscape format so applications can
use the Mozilla or Lynx cookie files, and one that stores cookies in the same
format as the Perl libwww library.

:mod:`urllib2` has been changed to interact with :mod:`cookielib`:
:class:`HTTPCookieProcessor` manages a cookie jar that is used when accessing
URLs.

This module was contributed by John J. Lee.

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


doctest
-------

The :mod:`doctest` module underwent considerable refactoring thanks to Edward
Loper and Tim Peters.  Testing can still be as simple as running
:func:`doctest.testmod`, but the refactorings allow customizing the module's
operation in various ways

The new :class:`DocTestFinder` class extracts the tests from a given  object's
docstrings::

   def f (x, y):
       """>>> f(2,2)
   4
   >>> f(3,2)
   6
       """
       return x*y

   finder = doctest.DocTestFinder()

   # Get list of DocTest instances
   tests = finder.find(f)

The new :class:`DocTestRunner` class then runs individual tests and can produce
a summary of the results::

   runner = doctest.DocTestRunner()
   for t in tests:
       tried, failed = runner.run(t)

   runner.summarize(verbose=1)

The above example produces the following output::

   1 items passed all tests:
      2 tests in f
   2 tests in 1 items.
   2 passed and 0 failed.
   Test passed.

:class:`DocTestRunner` uses an instance of the :class:`OutputChecker` class to
compare the expected output with the actual output.  This class takes a number
of different flags that customize its behaviour; ambitious users can also write
a completely new subclass of :class:`OutputChecker`.

The default output checker provides a number of handy features. For example,
with the :const:`doctest.ELLIPSIS` option flag, an ellipsis (``...``) in the
expected output matches any substring,  making it easier to accommodate outputs
that vary in minor ways::

   def o (n):
       """>>> o(1)
   <__main__.C instance at 0x...>
   >>>
   """

Another special string, ``<BLANKLINE>``, matches a blank line::

   def p (n):
       """>>> p(1)
   <BLANKLINE>
   >>>
   """

Another new capability is producing a diff-style display of the output by
specifying the :const:`doctest.REPORT_UDIFF` (unified diffs),
:const:`doctest.REPORT_CDIFF` (context diffs), or :const:`doctest.REPORT_NDIFF`
(delta-style) option flags.  For example::

   def g (n):
       """>>> g(4)
   here
   is
   a
   lengthy
   >>>"""
       L = 'here is a rather lengthy list of words'.split()
       for word in L[:n]:
           print word

Running the above function's tests with :const:`doctest.REPORT_UDIFF` specified,
you get the following output::

   **********************************************************************
   File "t.py", line 15, in g
   Failed example:
       g(4)
   Differences (unified diff with -expected +actual):
       @@ -2,3 +2,3 @@
        is
        a
       -lengthy
       +rather
   **********************************************************************

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


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

Some of the changes to Python's build process and to the C API are:

* Three new convenience macros were added for common return values from
  extension functions: :c:macro:`Py_RETURN_NONE`, :c:macro:`Py_RETURN_TRUE`, and
  :c:macro:`Py_RETURN_FALSE`. (Contributed by Brett Cannon.)

* Another new macro, :c:macro:`Py_CLEAR(obj)`,  decreases the reference count of
  *obj* and sets *obj* to the null pointer.  (Contributed by Jim Fulton.)

* A new function, ``PyTuple_Pack(N, obj1, obj2, ..., objN)``, constructs
  tuples from a variable length argument list of Python objects.  (Contributed by
  Raymond Hettinger.)

* A new function, ``PyDict_Contains(d, k)``, implements fast dictionary
  lookups without masking exceptions raised during the look-up process.
  (Contributed by Raymond Hettinger.)

* The :c:macro:`Py_IS_NAN(X)` macro returns 1 if  its float or double argument
  *X* is a NaN.   (Contributed by Tim Peters.)

* C code can avoid unnecessary locking by using the new
  :c:func:`PyEval_ThreadsInitialized` function to tell  if any thread operations
  have been performed.  If this function  returns false, no lock operations are
  needed. (Contributed by Nick Coghlan.)

* A new function, :c:func:`PyArg_VaParseTupleAndKeywords`, is the same as
  :c:func:`PyArg_ParseTupleAndKeywords` but takes a  :c:type:`va_list` instead of a
  number of arguments. (Contributed by Greg Chapman.)

* A new method flag, :const:`METH_COEXISTS`, allows a function defined in slots
  to co-exist with a :c:type:`PyCFunction` having the same name.  This can halve
  the access time for a method such as :meth:`set.__contains__`.  (Contributed by
  Raymond Hettinger.)

* Python can now be built with additional profiling for the interpreter itself,
  intended as an aid to people developing the Python core.  Providing
  :option:`----enable-profiling` to the :program:`configure` script will let you
  profile the interpreter with :program:`gprof`, and providing the
  :option:`----with-tsc` switch enables profiling using the Pentium's Time-Stamp-
  Counter register.  Note that the :option:`----with-tsc` switch is slightly
  misnamed, because the profiling feature also works on the PowerPC platform,
  though that processor architecture doesn't call that register "the TSC
  register".  (Contributed by Jeremy Hylton.)

* The :c:type:`tracebackobject` type has been renamed to
  :c:type:`PyTracebackObject`.

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


Port-Specific Changes
---------------------

* The Windows port now builds under MSVC++ 7.1 as well as version 6.
  (Contributed by Martin von Löwis.)

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


Porting to Python 2.4
=====================

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

* Left shifts and hexadecimal/octal constants that are too  large no longer
  trigger a :exc:`FutureWarning` and return  a value limited to 32 or 64 bits;
  instead they return a long integer.

* Integer operations will no longer trigger an :exc:`OverflowWarning`. The
  :exc:`OverflowWarning` warning will disappear in Python 2.5.

* The :func:`zip` built-in function and :func:`itertools.izip` now return  an
  empty list instead of raising a :exc:`TypeError` exception if called with no
  arguments.

* You can no longer compare the :class:`date` and :class:`datetime` instances
  provided by the :mod:`datetime` module.  Two  instances of different classes
  will now always be unequal, and  relative comparisons (``<``, ``>``) will raise
  a :exc:`TypeError`.

* :func:`dircache.listdir` now passes exceptions to the caller instead of
  returning empty lists.

* :func:`LexicalHandler.startDTD` used to receive the public and system IDs in
  the wrong order.  This has been corrected; applications relying on the wrong
  order need to be fixed.

* :func:`fcntl.ioctl` now warns if the *mutate*  argument is omitted and
  relevant.

* The :mod:`tarfile` module now generates GNU-format tar files by default.

* Encountering a failure while importing a module no longer leaves a partially-
  initialized module object in ``sys.modules``.

* :const:`None` is now a constant; code that binds a new value to  the name
  ``None`` is now a syntax error.

* The :func:`signals.signal` function now raises a :exc:`RuntimeError` exception
  for certain illegal values; previously these errors would pass silently.  For
  example, you can no longer set a handler on the :const:`SIGKILL` signal.

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


.. _24acks:

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

The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Koray Can,
Hye-Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson,
Fredrik Lundh, Sean Reifschneider, Sadruddin Rejeb.

