1547 lines
65 KiB
ReStructuredText
1547 lines
65 KiB
ReStructuredText
****************************
|
|
What's New in Python 2.7
|
|
****************************
|
|
|
|
:Author: A.M. Kuchling (amk at amk.ca)
|
|
:Release: |release|
|
|
:Date: |today|
|
|
|
|
.. Fix accents on Kristjan Valur Jonsson, Fuerstenau
|
|
|
|
.. Big jobs: argparse, ElementTree 1.3, pep 391, 3106, sysconfig
|
|
.. unittest test discovery
|
|
|
|
.. $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. The final
|
|
release of 2.7 is currently scheduled for June 2010; the detailed
|
|
schedule is described in :pep:`373`.
|
|
|
|
Python 2.7 is planned to be the last major release in the 2.x series.
|
|
Though more major releases have not been absolutely ruled out, it's
|
|
likely that the 2.7 release will have an extended period of
|
|
maintenance compared to earlier 2.x versions.
|
|
|
|
.. Compare with previous release in 2 - 3 sentences here.
|
|
add hyperlink when the documentation becomes available online.
|
|
|
|
.. _whatsnew27-python31:
|
|
|
|
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:
|
|
|
|
* A 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>`__.
|
|
* Float-to-string and string-to-float conversions now round their
|
|
results more correctly. And :func:`repr` of a floating-point
|
|
number *x* returns a result that's guaranteed to round back to the
|
|
same number when converted back to a string.
|
|
* The :cfunc:`PyLong_AsLongAndOverflow` C API function.
|
|
|
|
One porting change: the :option:`-3` switch now automatically
|
|
enables the :option:`-Qwarn` switch that causes warnings
|
|
about using classic division with integers and long integers.
|
|
|
|
Other new Python3-mode warnings include:
|
|
|
|
* :func:`operator.isCallable` and :func:`operator.sequenceIncludes`,
|
|
which are not supported in 3.x.
|
|
|
|
.. ========================================================================
|
|
.. 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, a new
|
|
:class:`collections.OrderedDict` class has been introduced.
|
|
|
|
The :class:`OrderedDict` API is substantially the same as regular dictionaries
|
|
but will iterate 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:`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(False)
|
|
(0, 0)
|
|
>>> od.popitem(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:`OrderedDict` with a regular dictionary
|
|
ignores the insertion order and just compares the keys and values.
|
|
|
|
How does the :class:`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).
|
|
|
|
.. XXX check O(1)-ness with Raymond
|
|
|
|
The standard library now supports use of ordered dictionaries in several
|
|
modules. The :mod:`configparser` module uses them by default. This lets
|
|
configuration files be read, modified, and then written back in their original
|
|
order. The *_asdict()* method for :func:`collections.namedtuple` now
|
|
returns an ordered dictionary with the values appearing in the same order as
|
|
the underlying tuple indicies. The :mod:`json` module is being built-out with
|
|
an *object_pairs_hook* to allow OrderedDicts 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 and render 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 string :meth:`format` method. When
|
|
formatting a floating-point number, simply include a comma between the
|
|
width and the precision::
|
|
|
|
>>> '{:20,.2}'.format(f)
|
|
'18,446,744,073,709,551,616.00'
|
|
|
|
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.
|
|
|
|
.. XXX "Format String Syntax" in string.rst could use many more examples.
|
|
|
|
.. 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
|
|
======================================================
|
|
|
|
XXX write this section.
|
|
|
|
.. seealso::
|
|
|
|
:pep:`389` - argparse - New Command Line Parsing Module
|
|
PEP written and implemented by Steven Bethard.
|
|
|
|
PEP 391: Dictionary-Based Configuration For Logging
|
|
====================================================
|
|
|
|
XXX write this section.
|
|
|
|
Two smaller enhancements to the logging module are:
|
|
|
|
.. rev79293
|
|
|
|
* :class:`Logger` instances gained a :meth:`getChild` 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:`LoggerAdapter` class gained a :meth:`isEnabledFor` method
|
|
that takes a *level* and returns whether the underlying logger would
|
|
process a message of that level of importance.
|
|
|
|
.. seealso::
|
|
|
|
:pep:`391` - Dictionary-Based Configuration For Logging
|
|
PEP written and implemented by Vinay Sajip.
|
|
|
|
PEP 3106: Dictionary Views
|
|
====================================================
|
|
|
|
XXX write this section.
|
|
|
|
.. seealso::
|
|
|
|
:pep:`3106` - Revamping dict.keys(), .values() and .items()
|
|
PEP written by Guido van Rossum.
|
|
Backported to 2.7 by Alexandre Vassalotti; :issue:`1967`.
|
|
|
|
|
|
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.
|
|
|
|
>>> {1,2,3,4,5}
|
|
set([1, 2, 3, 4, 5])
|
|
>>> set()
|
|
set([])
|
|
>>> {}
|
|
{}
|
|
|
|
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.
|
|
|
|
>>> {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 http://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; serialization and
|
|
deserialization of 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`-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.
|
|
|
|
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`.
|
|
|
|
* 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`.)
|
|
|
|
* 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(37)
|
|
'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`.)
|
|
|
|
* 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`.)
|
|
|
|
* 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:`translate` method now accepts
|
|
``None`` as its first argument. (Fixed by Georg Brandl;
|
|
:issue:`4759`.)
|
|
|
|
* 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`.)
|
|
|
|
* A new encoding named "cp720", used primarily for Arabic text, is now
|
|
supported. (Contributed by Alexander Belchenko and Amaury Forgeot
|
|
d'Arc; :issue:`1616979`.)
|
|
|
|
* 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 can now accept 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`.)
|
|
|
|
* 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`).
|
|
|
|
.. ======================================================================
|
|
|
|
|
|
Optimizations
|
|
-------------
|
|
|
|
Several performance enhancements have been added:
|
|
|
|
.. * A new :program:`configure` option, :option:`--with-computed-gotos`,
|
|
compiles the main bytecode interpreter loop using a new dispatch
|
|
mechanism that gives speedups of up to 20%, depending on the system
|
|
and benchmark. The new mechanism is only supported on certain
|
|
compilers, such as gcc, SunPro, and icc.
|
|
|
|
* 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 is to only perform 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 Loewis 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 ``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`
|
|
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 <http://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 Avion; :issue:`8156`. The pybsddb
|
|
changelog can be browsed at http://hg.jcea.es/pybsddb/file/tip/ChangeLog.)
|
|
|
|
* The :mod:`bz2` module's :class:`BZ2File` now supports the context
|
|
management protocol, so you can write ``with bz2.BZ2File(...) as f: ...``.
|
|
(Contributed by Hagen Fuerstenau; :issue:`3860`.)
|
|
|
|
* New class: the :class:`Counter` class in the :mod:`collections` module is
|
|
useful for tallying data. :class:`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
|
|
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 two additional :class:`Counter` methods: :meth:`most_common`
|
|
returns the N most common elements and their counts, and :meth:`elements`
|
|
returns an iterator over the contained element, repeating each element
|
|
as many times as its count::
|
|
|
|
>>> 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'
|
|
|
|
Contributed by Raymond Hettinger; :issue:`1696199`.
|
|
|
|
The new `~collections.OrderedDict` class is described in the earlier section
|
|
:ref:`pep-0372`.
|
|
|
|
The :class:`namedtuple` class now has an optional *rename* parameter.
|
|
If *rename* is true, field names that are invalid because they've
|
|
been repeated or that 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`.)
|
|
|
|
The :class:`deque` data type now exposes its maximum length as the
|
|
read-only :attr:`maxlen` attribute, and has a
|
|
:meth:`reverse` method that reverses the elements of the deque in-place.
|
|
(Added by Raymond Hettinger.)
|
|
|
|
* The :mod:`copy` module's :func:`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
|
|
<http://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:`timedelta` class
|
|
gained a :meth:`total_seconds` method that returns the number of seconds
|
|
in the duration. (Contributed by Brian Quinlan; :issue:`5788`.)
|
|
|
|
* New method: the :class:`Decimal` class gained a
|
|
:meth:`from_float` class method that performs an exact conversion
|
|
of a floating-point number to a :class:`Decimal`.
|
|
Note that this is an **exact** conversion that 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`.)
|
|
|
|
Most of the methods of the :class:`Context` class now accept integers
|
|
as well as :class:`Decimal` instances; the only exceptions are the
|
|
:meth:`canonical` and :meth:`is_canonical` methods. (Patch by
|
|
Juan José Conti; :issue:`7633`.)
|
|
|
|
The constructor for :class:`Decimal` now accepts non-European
|
|
Unicode characters, such as Arabic-Indic digits. (Contributed by
|
|
Mark Dickinson; :issue:`6595`.)
|
|
|
|
When using :class:`Decimal` instances with a string's
|
|
:meth:`format` method, the default alignment was previously
|
|
left-alignment. This has been changed to right-alignment, which seems
|
|
more sensible for numeric types. (Changed by Mark Dickinson; :issue:`6857`.)
|
|
|
|
* The :class:`Fraction` class now accepts two rational numbers
|
|
as arguments to its constructor.
|
|
(Implemented by Mark Dickinson; :issue:`5812`.)
|
|
|
|
* New class: a new :class:`ftplib.FTP_TLS` class 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:`storbinary` method for binary uploads can now restart
|
|
uploads thanks to an added *rest* parameter (patch by Pablo Mouzo;
|
|
:issue:`6845`.)
|
|
|
|
* New function: the :mod:`gc` module's :func:`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:`GzipFile` now supports the context
|
|
management protocol, so you can write ``with gzip.GzipFile(...) as f: ...``
|
|
(contributed by Hagen Fuerstenau; :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:`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:`HTTPResponse` class used by the :mod:`httplib` module now
|
|
supports buffering, resulting in much faster reading of HTTP responses.
|
|
(Contributed by Kristjan Valur Jonsson; :issue:`4879`.)
|
|
|
|
The :class:`HTTPConnection` and :class:`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:`imaplib` module now supports IPv6 addresses.
|
|
(Contributed by Derek Morr; :issue:`1655`.)
|
|
|
|
* 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:`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
|
|
|
|
New function: ``itertools.combinations_with_replacement(iter, r)``
|
|
returns all the possible *r*-length combinations of elements from the
|
|
iterable *iter*. Unlike :func:`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 :class:`itertools.count` function now has a *step* argument that
|
|
allows incrementing by values other than 1. :func:`count` also
|
|
now allows keyword arguments, and using non-integer values such as
|
|
floats or :class:`Decimal` instances. (Implemented by Raymond
|
|
Hettinger; :issue:`5032`.)
|
|
|
|
:func:`itertools.combinations` and :func:`itertools.product` were
|
|
previously raising :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:`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`.)
|
|
|
|
* New functions: the :mod:`math` module gained
|
|
:func:`erf` and :func:`erfc` for the error function and the complementary error function,
|
|
:func:`expm1` which computes ``e**x - 1`` with more precision than
|
|
using :func:`exp` and subtracting 1,
|
|
:func:`gamma` for the Gamma function, and
|
|
:func:`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:`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:`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:`getresgid` and :func:`getresuid`, which return the
|
|
real, effective, and saved GIDs and UIDs;
|
|
:func:`setresgid` and :func:`setresuid`, which set
|
|
real, effective, and saved GIDs and UIDs to new values;
|
|
:func:`initgroups`. (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:`fork`
|
|
is called from a thread. (Fixed by Zsolt Cserna; :issue:`7242`.)
|
|
|
|
* In the :mod:`os.path` module, the :func:`normpath` and
|
|
:func:`abspath` functions now preserve Unicode; if their input path
|
|
is a Unicode string, the return value is also a Unicode string.
|
|
(:meth:`normpath` fixed by Matt Giuca in :issue:`5827`;
|
|
:meth:`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:`split`, :func:`sub`, and :func:`subn`
|
|
now accept an optional *flags* argument, for consistency with the
|
|
other functions in the module. (Added by Gregory P. Smith.)
|
|
|
|
* New function: in the :mod:`shutil` module, :func:`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:`copyfile` and :func:`copytree`
|
|
functions now raise a :exc:`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`.)
|
|
|
|
* New functions: in the :mod:`site` module, three new functions
|
|
return various site- and user-specific paths.
|
|
:func:`getsitepackages` returns a list containing all
|
|
global site-packages directories, and
|
|
:func:`getusersitepackages` returns the path of the user's
|
|
site-packages directory.
|
|
:func:`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 :mod:`socket` module's :class:`SSL` objects now support the
|
|
buffer API, which fixed a test suite failure. (Fixed by Antoine
|
|
Pitrou; :issue:`7133`.)
|
|
|
|
The :func:`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:`recv_into` and :meth:`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:`TCPServer` class now
|
|
has a :attr:`disable_nagle_algorithm` class attribute.
|
|
The default value is 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.
|
|
(Contributed by Kristjan Valur Jonsson; :issue:`6192`.)
|
|
|
|
* Updated module: the :mod:`sqlite` module has been updated to
|
|
version 2.6.0 of the `pysqlite package <http://code.google.com/p/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:`load_extension` to load a particular shared library.
|
|
(Updated by Gerhard Häring.)
|
|
|
|
* 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`.)
|
|
|
|
* New function: the :mod:`subprocess` module's
|
|
:func:`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:`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:`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 ``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:`TarInfo`
|
|
objects being added to a tar file. When you call :meth:`TarFile.add`,
|
|
instance, you may supply an optional *filter* argument
|
|
that's a callable. The *filter* callable will be passed the
|
|
:class:`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` class also now supports the context manager protocol.
|
|
(Added by Lars Gustäbel; :issue:`7232`.)
|
|
|
|
* The :mod:`threading` module's :meth:`Event.wait` method now returns
|
|
the internal flag on exit. This means the method will usually
|
|
return true because :meth:`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 :class:`UserDict` class is now a new-style class. (Changed by
|
|
Benjamin Peterson.)
|
|
|
|
* 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 :mod:`zipfile` module's :class:`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 supports archiving empty directories and
|
|
extracts them correctly. (Fixed by Kuba Wieczorek; :issue:`4710`.)
|
|
Reading files out of an archive is now faster, and interleaving
|
|
:meth:`read` and :meth:`readline` now works correctly.
|
|
(Contributed by Nir Aides; :issue:`7610`.)
|
|
|
|
The :func:`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:`writestr` method now has an optional *compress_type* parameter
|
|
that lets you override the default compression method specified in the
|
|
:class:`ZipFile` constructor. (Contributed by Ronald Oussoren;
|
|
:issue:`6003`.)
|
|
|
|
|
|
New module: sysconfig
|
|
---------------------------------
|
|
|
|
XXX A new :mod:`sysconfig` module has been extracted from
|
|
:mod:`distutils` and put in the standard library.
|
|
|
|
The :mod:`sysconfig` module provides access to Python's configuration
|
|
information like the list of installation paths and the configuration
|
|
variables relevant for the current platform. (contributed by Tarek)
|
|
|
|
Updated module: ElementTree 1.3
|
|
---------------------------------
|
|
|
|
XXX write this.
|
|
|
|
.. ======================================================================
|
|
.. whole new modules get described in subsections here
|
|
|
|
|
|
Distutils Enhancements
|
|
---------------------------------
|
|
|
|
XXX all of this work has been moved to Distutils2
|
|
XXX Not sure what we should say here
|
|
|
|
Distutils is being more actively developed, thanks to Tarek Ziadé
|
|
who has taken over maintenance of the package, so there are a number
|
|
of fixes and improvements.
|
|
|
|
A new :file:`setup.py` subcommand, ``check``, will check that the
|
|
arguments being passed to the :func:`setup` function are complete
|
|
and correct (:issue:`5732`).
|
|
|
|
Byte-compilation by the ``install_lib`` subcommand is now only done
|
|
if the ``sys.dont_write_bytecode`` setting allows it (:issue:`7071`).
|
|
|
|
:func:`distutils.sdist.add_defaults` now uses
|
|
*package_dir* and *data_files* to create the MANIFEST file.
|
|
:mod:`distutils.sysconfig` now reads the :envvar:`AR` and
|
|
:envvar:`ARFLAGS` environment variables.
|
|
|
|
.. ARFLAGS done in #5941
|
|
|
|
It is no longer mandatory to store clear-text passwords in the
|
|
:file:`.pypirc` file when registering and uploading packages to PyPI. As long
|
|
as the username is present in that file, the :mod:`distutils` package will
|
|
prompt for the password if not present. (Added by Tarek Ziadé,
|
|
based on an initial contribution by Nathan Van Gheem; :issue:`4394`.)
|
|
|
|
A Distutils setup can now specify that a C extension is optional by
|
|
setting the *optional* option setting to true. If this optional is
|
|
supplied, failure to build the extension will not abort the build
|
|
process, but instead simply not install the failing extension.
|
|
(Contributed by Georg Brandl; :issue:`5583`.)
|
|
|
|
The :class:`distutils.dist.DistributionMetadata` class'
|
|
:meth:`read_pkg_file` method will read the contents of a package's
|
|
:file:`PKG-INFO` metadata file. For an example of its use, see
|
|
:ref:`reading-metadata`.
|
|
(Contributed by Tarek Ziadé; :issue:`7457`.)
|
|
|
|
:file:`setup.py` files will now accept a :option:`--no-user-cfg` switch
|
|
to skip reading the :file:`~/.pydistutils.cfg` file. (Suggested by
|
|
by Michael Hoffman, and implemented by Paul Winkler; :issue:`1180`.)
|
|
|
|
When creating a tar-format archive, the ``sdist`` subcommand now
|
|
allows specifying the user id and group that will own the files in the
|
|
archives using the :option:`--owner` and :option:`--group` switches
|
|
(:issue:`6516`).
|
|
|
|
|
|
Unit Testing Enhancements
|
|
---------------------------------
|
|
|
|
The :mod:`unittest` module was enhanced in several ways.
|
|
The progress messages now shows 'x' for expected failures
|
|
and 'u' for unexpected successes when run in verbose mode.
|
|
(Contributed by Benjamin Peterson.)
|
|
Test cases can raise the :exc:`SkipTest` exception to skip a test.
|
|
(:issue:`1034053`.)
|
|
|
|
.. XXX describe test discovery (Contributed by Michael Foord; :issue:`6001`.)
|
|
|
|
The error messages for :meth:`assertEqual`,
|
|
:meth:`assertTrue`, and :meth:`assertFalse`
|
|
failures now provide more information. If you set the
|
|
:attr:`longMessage` attribute of your :class:`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:`assertRaises` and :meth:`failUnlessRaises` methods now
|
|
return a context handler when called without providing a callable
|
|
object to run. For example, you can write this::
|
|
|
|
with self.assertRaises(KeyError):
|
|
raise ValueError
|
|
|
|
(Implemented by Antoine Pitrou; :issue:`4444`.)
|
|
|
|
.. rev 78774
|
|
|
|
Module- and class-level setup and teardown fixtures are now supported.
|
|
Modules can contain :func:`setUpModule` and :func:`tearDownModule`
|
|
functions. Classes can have :meth:`setUpClass` and
|
|
:meth:`tearDownClass` methods that must be defined as class methods
|
|
(using ``@classmethod`` or the 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:`addCleanup` and :meth:`doCleanups` were added.
|
|
:meth:`addCleanup` allows you to add cleanup functions that
|
|
will be called unconditionally (after :meth:`setUp` if
|
|
:meth:`setUp` fails, otherwise after :meth:`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:`assertIsNone` and :meth:`assertIsNotNone` take one
|
|
expression and verify that the result is or is not ``None``.
|
|
|
|
* :meth:`assertIs` and :meth:`assertIsNot` take two values and check
|
|
whether the two values evaluate to the same object or not.
|
|
(Added by Michael Foord; :issue:`2578`.)
|
|
|
|
* :meth:`assertIsInstance` and :meth:`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:`assertGreater`, :meth:`assertGreaterEqual`,
|
|
:meth:`assertLess`, and :meth:`assertLessEqual` compare
|
|
two quantities.
|
|
|
|
* :meth:`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:`assertEqual`.)
|
|
|
|
* :meth:`assertRegexpMatches` checks whether its first argument is a
|
|
string matching a regular expression provided as its second argument.
|
|
|
|
* :meth:`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:`assertIn` and :meth:`assertNotIn` tests whether
|
|
*first* is or is not in *second*.
|
|
|
|
* :meth:`assertItemsEqual` tests whether two provided sequences
|
|
contain the same elements.
|
|
|
|
* :meth:`assertSetEqual` compares whether two sets are equal, and
|
|
only reports the differences between the sets in case of error.
|
|
|
|
* Similarly, :meth:`assertListEqual` and :meth:`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:`assertEqual`.
|
|
More generally, :meth:`assertSequenceEqual` compares two sequences
|
|
and can optionally check whether both sequences are of a
|
|
particular type.
|
|
|
|
* :meth:`assertDictEqual` compares two dictionaries and reports the
|
|
differences; it's now used by default when you compare two dictionaries
|
|
using :meth:`assertEqual`. :meth:`assertDictContainsSubset` checks whether
|
|
all of the key/value pairs in *first* are found in *second*.
|
|
|
|
* :meth:`assertAlmostEqual` and :meth:`assertNotAlmostEqual` test
|
|
whether *first* and *second* are approximately equal by computing
|
|
their difference, rounding the result to an optionally-specified number
|
|
of *places* (the default is 7), and comparing to zero.
|
|
|
|
* :meth:`loadTestsFromName` properly honors the ``suiteClass`` attribute of
|
|
the :class:`TestLoader`. (Fixed by Mark Roddy; :issue:`6866`.)
|
|
|
|
* A new hook lets you extend the :meth:`assertEqual` method to handle
|
|
new data types. The :meth:`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 are matching, much as the new
|
|
sequence comparison methods do.
|
|
|
|
:func:`unittest.main` now takes an optional ``exit`` argument. If
|
|
false, :func:`main` doesn't call :func:`sys.exit`, allowing it to be
|
|
used from the interactive interpreter. (Contributed by J. Pablo
|
|
Fernández; :issue:`3379`.)
|
|
|
|
A new command-line switch, :option:`-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`.)
|
|
|
|
:class:`TestResult` has new :meth:`startTestRun` and
|
|
:meth:`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.
|
|
|
|
|
|
.. _importlib-section:
|
|
|
|
importlib: Importing Modules
|
|
------------------------------
|
|
|
|
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:`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:`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
|
|
>>> sysconfig = import_module('..sysconfig', 'distutils.command')
|
|
>>> sysconfig
|
|
<module 'distutils.sysconfig' from '/p/python/Lib/distutils/sysconfig.pyc'>
|
|
|
|
:mod:`importlib` was implemented by Brett Cannon and introduced in
|
|
Python 3.1.
|
|
|
|
|
|
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.
|
|
|
|
XXX write a brief discussion and an example here.
|
|
|
|
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.
|
|
|
|
|
|
Deprecations and Removals
|
|
=========================
|
|
|
|
* :func:`contextlib.nested`, which allows handling more than one context manager
|
|
with one :keyword:`with` statement, has been deprecated; :keyword:`with`
|
|
supports multiple context managers syntactically now.
|
|
|
|
.. ======================================================================
|
|
|
|
|
|
Build and C API Changes
|
|
=======================
|
|
|
|
Changes to Python's build process and to the C API include:
|
|
|
|
* 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`.)
|
|
|
|
* :cfunc:`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 Kristjan Valur Jonsson; :issue:`4293`.)
|
|
|
|
* New function: :cfunc:`PyCode_NewEmpty` creates an empty code object;
|
|
only the filename, function name, and first line number are required.
|
|
This is useful to extension modules that are attempting to
|
|
construct a more useful traceback stack. Previously such
|
|
extensions needed to call :cfunc:`PyCode_New`, which had many
|
|
more arguments. (Added by Jeffrey Yasskin.)
|
|
|
|
* New function: :cfunc:`PyErr_NewExceptionWithDoc` creates a new
|
|
exception class, just as the existing :cfunc:`PyErr_NewException` does,
|
|
but takes an extra ``char *`` argument containing the docstring for the
|
|
new exception class. (Added by the 'lekma' user on the Python bug tracker;
|
|
:issue:`7033`.)
|
|
|
|
* New function: :cfunc:`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: :cfunc:`PyLong_AsLongAndOverflow` and
|
|
:cfunc:`PyLong_AsLongLongAndOverflow` approximates a Python long
|
|
integer as a C :ctype:`long` or :ctype:`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 :cfunc:`PyOS_string_to_double` function was added. The old
|
|
:cfunc:`PyOS_ascii_strtod` and :cfunc:`PyOS_ascii_atof` functions
|
|
are now deprecated.
|
|
|
|
* New macros: the Python header files now define the following macros:
|
|
:cmacro:`Py_ISALNUM`,
|
|
:cmacro:`Py_ISALPHA`,
|
|
:cmacro:`Py_ISDIGIT`,
|
|
:cmacro:`Py_ISLOWER`,
|
|
:cmacro:`Py_ISSPACE`,
|
|
:cmacro:`Py_ISUPPER`,
|
|
:cmacro:`Py_ISXDIGIT`,
|
|
and :cmacro:`Py_TOLOWER`, :cmacro:`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.
|
|
|
|
* New format codes: the :cfunc:`PyFormat_FromString`,
|
|
:cfunc:`PyFormat_FromStringV`, and :cfunc:`PyErr_Format` now
|
|
accepts ``%lld`` and ``%llu`` format codes for displaying values of
|
|
C's :ctype:`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 now 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 :cfunc:`fork()` themselves, will not benefit
|
|
from this clean-up.
|
|
|
|
(Fixed by Thomas Wouters; :issue:`1590864`.)
|
|
|
|
* The :cfunc:`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`.)
|
|
|
|
* 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: Compiling Python with the
|
|
:option:`--with-valgrind` option will now disable the pymalloc
|
|
allocator, which is difficult for the Valgrind 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 no arguments to
|
|
:option:`--with-dbmliborder=` in order to build none 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 :cmacro:`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`.)
|
|
|
|
* 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`.)
|
|
|
|
|
|
.. ======================================================================
|
|
|
|
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 new :cfunc:`_beginthreadex` API is used to start threads, and
|
|
the native thread-local storage functions are now used.
|
|
(Contributed by Kristjan Valur Jonsson; :issue:`3582`.)
|
|
|
|
* 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`.)
|
|
|
|
|
|
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 built-in file I/O objects (as 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.
|
|
|
|
* 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`.)
|
|
|
|
.. ======================================================================
|
|
|
|
Porting to Python 2.7
|
|
=====================
|
|
|
|
This section lists previously described changes and other bugfixes
|
|
that may require changes to your code:
|
|
|
|
* When using :class:`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`.)
|
|
|
|
Another :meth:`format`-related change: the default precision used
|
|
for floating-point and complex numbers was changed 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`.)
|
|
|
|
* The :meth:`readline` method of :class:`StringIO` objects now does
|
|
nothing when a negative length is requested, as other file-like
|
|
objects do. (:issue:`7348`).
|
|
|
|
In the standard library:
|
|
|
|
* 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`.)
|
|
|
|
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 :cfunc:`PyOS_string_to_double` function instead of the old
|
|
:cfunc:`PyOS_ascii_strtod` and :cfunc:`PyOS_ascii_atof` functions,
|
|
which are now deprecated.
|
|
|
|
|
|
.. ======================================================================
|
|
|
|
|
|
.. _acks27:
|
|
|
|
Acknowledgements
|
|
================
|
|
|
|
The author would like to thank the following people for offering
|
|
suggestions, corrections and assistance with various drafts of this
|
|
article: Ryan Lovett, Hugh Secker-Walker.
|
|
|