Merged revisions 75264,75268,75293,75318,75391-75392,75436,75478,75971,76003,76058,76140-76141,76231,76380,76428-76429 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r75264 | andrew.kuchling | 2009-10-05 17:30:22 -0500 (Mon, 05 Oct 2009) | 1 line

  Add various items
........
  r75268 | andrew.kuchling | 2009-10-05 17:45:39 -0500 (Mon, 05 Oct 2009) | 1 line

  Remove two notes
........
  r75293 | kristjan.jonsson | 2009-10-09 09:32:19 -0500 (Fri, 09 Oct 2009) | 2 lines

  http://bugs.python.org/issue7029
  a non-default timer wasn't actually used by the individual Tests.
........
  r75318 | benjamin.peterson | 2009-10-10 16:15:58 -0500 (Sat, 10 Oct 2009) | 1 line

  remove script which uses long gone module
........
  r75391 | andrew.kuchling | 2009-10-13 10:49:33 -0500 (Tue, 13 Oct 2009) | 1 line

  Link to PEP
........
  r75392 | andrew.kuchling | 2009-10-13 11:11:49 -0500 (Tue, 13 Oct 2009) | 1 line

  Various link, textual, and markup fixes
........
  r75436 | benjamin.peterson | 2009-10-15 10:39:15 -0500 (Thu, 15 Oct 2009) | 1 line

  don't need to mess up sys.path
........
  r75478 | senthil.kumaran | 2009-10-17 20:58:45 -0500 (Sat, 17 Oct 2009) | 3 lines

  Fix a typo.
........
  r75971 | benjamin.peterson | 2009-10-30 22:56:15 -0500 (Fri, 30 Oct 2009) | 1 line

  add some checks for evaluation order with parenthesis #7210
........
  r76003 | antoine.pitrou | 2009-10-31 19:30:13 -0500 (Sat, 31 Oct 2009) | 6 lines

  Hopefully fix the buildbot problems on test_mailbox, by computing
  the maildir toc cache refresh date before actually refreshing the cache.

  (see #6896)
........
  r76058 | benjamin.peterson | 2009-11-02 10:14:19 -0600 (Mon, 02 Nov 2009) | 1 line

  grant list.index() a more informative error message #7252
........
  r76140 | nick.coghlan | 2009-11-07 02:13:55 -0600 (Sat, 07 Nov 2009) | 1 line

  Add test for runpy.run_module package execution and use something other than logging as the example of a non-executable package
........
  r76141 | nick.coghlan | 2009-11-07 02:15:01 -0600 (Sat, 07 Nov 2009) | 1 line

  Some minor cleanups to private runpy code and docstrings
........
  r76231 | benjamin.peterson | 2009-11-12 17:42:23 -0600 (Thu, 12 Nov 2009) | 1 line

  this main is much more useful
........
  r76380 | antoine.pitrou | 2009-11-18 14:20:46 -0600 (Wed, 18 Nov 2009) | 3 lines

  Mention Giampolo R's new FTP TLS support in the what's new file
........
  r76428 | benjamin.peterson | 2009-11-19 20:15:50 -0600 (Thu, 19 Nov 2009) | 1 line

  turn goto into do while loop
........
  r76429 | benjamin.peterson | 2009-11-19 20:56:43 -0600 (Thu, 19 Nov 2009) | 2 lines

  avoid doing an uneeded import in a function
........
This commit is contained in:
Benjamin Peterson 2009-11-25 17:46:26 +00:00
parent 5554993d37
commit f6489f941c
12 changed files with 693 additions and 257 deletions

View File

@ -1,2 +0,0 @@
# This is here so I can use 'wh' instead of 'which' in '~/bin/generic_python'
import which

View File

@ -25,27 +25,26 @@ For more info about Tk, including pointers to the source, see the Tcl/Tk home
page at http://www.tcl.tk. Tcl/Tk is fully portable to the MacOS, Windows, and page at http://www.tcl.tk. Tcl/Tk is fully portable to the MacOS, Windows, and
Unix platforms. Unix platforms.
wxWindows wxWidgets
''''''''' '''''''''
wxWindows is a portable GUI class library written in C++ that's a portable wxWidgets is a GUI class library written in C++ that's a portable
interface to various platform-specific libraries; wxWidgets is a Python interface to various platform-specific libraries, and that has a
interface to wxWindows. wxWindows supports Windows and MacOS; on Unix variants, Python interface called `wxPython <http://www.wxpython.org>`__.
it supports both GTk+ and Motif toolkits. wxWindows preserves the look and feel
of the underlying graphics toolkit, and there is quite a rich widget set and
collection of GDI classes. See `the wxWindows page <http://www.wxwindows.org>`_
for more details.
`wxWidgets <http://wxwidgets.org>`_ is an extension module that wraps many of wxWidgets preserves the look and feel of the
the wxWindows C++ classes, and is quickly gaining popularity amongst Python underlying graphics toolkit, and has a large set of widgets and
developers. You can get wxWidgets as part of the source or CVS distribution of collection of GDI classes. See `the wxWidgets page
wxWindows, or directly from its home page. <http://www.wxwidgets.org>`_ for more details.
wxWidgets supports Windows and MacOS; on Unix variants,
it supports both GTk+ and Motif toolkits.
Qt Qt
''' '''
There are bindings available for the Qt toolkit (`PyQt There are bindings available for the Qt toolkit (`PyQt
<http://www.riverbankcomputing.co.uk/software/pyqt/>`_) and for KDE (PyKDE). If <http://www.riverbankcomputing.co.uk/software/pyqt/>`_) and for KDE (`PyKDE <http://www.riverbankcomputing.co.uk/software/pykde/intro>`__). If
you're writing open source software, you don't need to pay for PyQt, but if you you're writing open source software, you don't need to pay for PyQt, but if you
want to write proprietary applications, you must buy a PyQt license from want to write proprietary applications, you must buy a PyQt license from
`Riverbank Computing <http://www.riverbankcomputing.co.uk>`_ and (up to Qt 4.4; `Riverbank Computing <http://www.riverbankcomputing.co.uk>`_ and (up to Qt 4.4;
@ -56,7 +55,7 @@ Gtk+
'''' ''''
PyGtk bindings for the `Gtk+ toolkit <http://www.gtk.org>`_ have been PyGtk bindings for the `Gtk+ toolkit <http://www.gtk.org>`_ have been
implemented by by James Henstridge; see ftp://ftp.gtk.org/pub/gtk/python/. implemented by James Henstridge; see <http://www.pygtk.org>.
FLTK FLTK
'''' ''''
@ -85,14 +84,15 @@ What platform-specific GUI toolkits exist for Python?
`The Mac port <http://python.org/download/mac>`_ by Jack Jansen has a rich and `The Mac port <http://python.org/download/mac>`_ by Jack Jansen has a rich and
ever-growing set of modules that support the native Mac toolbox calls. The port ever-growing set of modules that support the native Mac toolbox calls. The port
includes support for MacOS9 and MacOS X's Carbon libraries. By installing the supports MacOS X's Carbon libraries.
`PyObjc Objective-C bridge <http://pyobjc.sourceforge.net>`_, Python programs
can use MacOS X's Cocoa libraries. See the documentation that comes with the Mac By installing the `PyObjc Objective-C bridge
port. <http://pyobjc.sourceforge.net>`_, Python programs can use MacOS X's
Cocoa libraries. See the documentation that comes with the Mac port.
:ref:`Pythonwin <windows-faq>` by Mark Hammond includes an interface to the :ref:`Pythonwin <windows-faq>` by Mark Hammond includes an interface to the
Microsoft Foundation Classes and a Python programming environment using it Microsoft Foundation Classes and a Python programming environment
that's written mostly in Python. that's written mostly in Python using the MFC classes.
Tkinter questions Tkinter questions
@ -105,23 +105,26 @@ Freeze is a tool to create stand-alone applications. When freezing Tkinter
applications, the applications will not be truly stand-alone, as the application applications, the applications will not be truly stand-alone, as the application
will still need the Tcl and Tk libraries. will still need the Tcl and Tk libraries.
One solution is to ship the application with the tcl and tk libraries, and point One solution is to ship the application with the Tcl and Tk libraries, and point
to them at run-time using the :envvar:`TCL_LIBRARY` and :envvar:`TK_LIBRARY` to them at run-time using the :envvar:`TCL_LIBRARY` and :envvar:`TK_LIBRARY`
environment variables. environment variables.
To get truly stand-alone applications, the Tcl scripts that form the library To get truly stand-alone applications, the Tcl scripts that form the library
have to be integrated into the application as well. One tool supporting that is have to be integrated into the application as well. One tool supporting that is
SAM (stand-alone modules), which is part of the Tix distribution SAM (stand-alone modules), which is part of the Tix distribution
(http://tix.mne.com). Build Tix with SAM enabled, perform the appropriate call (http://tix.sourceforge.net/).
to Tclsam_init etc inside Python's Modules/tkappinit.c, and link with libtclsam
and libtksam (you might include the Tix libraries as well). Build Tix with SAM enabled, perform the appropriate call to
:cfunc:`Tclsam_init`, etc. inside Python's
:file:`Modules/tkappinit.c`, and link with libtclsam and libtksam (you
might include the Tix libraries as well).
Can I have Tk events handled while waiting for I/O? Can I have Tk events handled while waiting for I/O?
--------------------------------------------------- ---------------------------------------------------
Yes, and you don't even need threads! But you'll have to restructure your I/O Yes, and you don't even need threads! But you'll have to restructure your I/O
code a bit. Tk has the equivalent of Xt's XtAddInput() call, which allows you code a bit. Tk has the equivalent of Xt's :cfunc:`XtAddInput()` call, which allows you
to register a callback function which will be called from the Tk mainloop when to register a callback function which will be called from the Tk mainloop when
I/O is possible on a file descriptor. Here's what you need:: I/O is possible on a file descriptor. Here's what you need::

View File

@ -49,46 +49,195 @@
This saves the maintainer some effort going through the SVN logs This saves the maintainer some effort going through the SVN logs
when researching a change. when researching a change.
This article explains the new features in Python 2.7. This article explains the new features in Python 2.7. No release
No release schedule has been decided yet for 2.7. schedule has been decided yet for 2.7; the schedule will eventually be
described in :pep:`373`.
.. Compare with previous release in 2 - 3 sentences here. .. Compare with previous release in 2 - 3 sentences here.
add hyperlink when the documentation becomes available online. add hyperlink when the documentation becomes available online.
Python 3.1 .. _whatsnew27-python31:
================
Python 3.1 Features
=======================
Much as Python 2.6 incorporated features from Python 3.0, Much as Python 2.6 incorporated features from Python 3.0,
version 2.7 is influenced by features from 3.1. 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.
XXX mention importlib; anything else? 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 specified described in :ref:`pep-0378`.
* The :class:`memoryview` object.
* A small subset of the :mod:`importlib` module `described below <#importlib-section>`__.
One porting change: the :option:`-3` switch now automatically One porting change: the :option:`-3` switch now automatically
enables the :option:`-Qwarn` switch that causes warnings enables the :option:`-Qwarn` switch that causes warnings
about using classic division with integers and long integers. 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. .. Large, PEP-level features and changes should be described here.
.. ======================================================================== .. ========================================================================
.. _pep-0372:
PEP 372: Adding an ordered dictionary to collections PEP 372: Adding an ordered dictionary to collections
==================================================== ====================================================
XXX write this 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.
Several modules will now use :class:`OrderedDict` by default. The The :class:`OrderedDict` API is substantially the same as regular dictionaries
:mod:`ConfigParser` module uses :class:`OrderedDict` for the list but will iterate over keys and values in a guaranteed order depending on
of sections and the options within a section. when a key was first inserted::
The :meth:`namedtuple._asdict` method returns an :class:`OrderedDict`
as well.
>>> 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.
Other Language Changes Other Language Changes
====================== ======================
Some smaller changes made to the core Python language are: Some smaller changes made to the core Python language are:
* :meth:`str.format` method now supports automatic numbering of the replacement * 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.)
* The :meth:`str.format` method now supports automatic numbering of the replacement
fields. This makes using :meth:`str.format` more closely resemble using fields. This makes using :meth:`str.format` more closely resemble using
``%s`` formatting:: ``%s`` formatting::
@ -102,7 +251,13 @@ Some smaller changes made to the core Python language are:
specifier will use the next argument, and so on. You can't mix auto-numbering 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 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 of them -- but you can mix auto-numbering and named fields, as in the second
example above. (Contributed by Eric Smith; :issue`5237`.) example above. (Contributed by Eric Smith; :issue:`5237`.)
Complex numbers now correctly support usage with :func:`format`.
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`.)
* The :func:`int` and :func:`long` types gained a ``bit_length`` * The :func:`int` and :func:`long` types gained a ``bit_length``
method that returns the number of bits necessary to represent method that returns the number of bits necessary to represent
@ -125,7 +280,7 @@ Some smaller changes made to the core Python language are:
point now round differently, returning the floating-point number point now round differently, returning the floating-point number
closest to the number. This doesn't matter for small integers that closest to the number. This doesn't matter for small integers that
can be converted exactly, but for large numbers that will can be converted exactly, but for large numbers that will
unavoidably lose precision, Python 2.7 will now approximate more unavoidably lose precision, Python 2.7 now approximates more
closely. For example, Python 2.6 computed the following:: closely. For example, Python 2.6 computed the following::
>>> n = 295147905179352891391 >>> n = 295147905179352891391
@ -146,10 +301,20 @@ Some smaller changes made to the core Python language are:
(Implemented by Mark Dickinson; :issue:`3166`.) (Implemented by Mark Dickinson; :issue:`3166`.)
* The :class:`bytearray` type's :meth:`translate` method will * The :class:`bytearray` type's :meth:`translate` method now accepts
now accept ``None`` as its first argument. (Fixed by Georg Brandl; ``None`` as its first argument. (Fixed by Georg Brandl;
:issue:`4759`.) :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`.)
.. ====================================================================== .. ======================================================================
@ -164,6 +329,10 @@ Several performance enhancements have been added:
and benchmark. The new mechanism is only supported on certain and benchmark. The new mechanism is only supported on certain
compilers, such as gcc, SunPro, and icc. 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 when many objects are * The garbage collector now performs better when many objects are
being allocated without deallocating any. A full garbage collection being allocated without deallocating any. A full garbage collection
pass is only performed when the middle generation has been collected pass is only performed when the middle generation has been collected
@ -184,7 +353,7 @@ Several performance enhancements have been added:
considered and traversed by the collector. considered and traversed by the collector.
(Contributed by Antoine Pitrou; :issue:`4688`.) (Contributed by Antoine Pitrou; :issue:`4688`.)
* Integers are now stored internally either in base 2**15 or in base * 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 2**30, the base being determined at build time. Previously, they
were always stored in base 2**15. Using base 2**30 gives were always stored in base 2**15. Using base 2**30 gives
significant performance improvements on 64-bit machines, but significant performance improvements on 64-bit machines, but
@ -227,6 +396,21 @@ Several performance enhancements have been added:
faster bytecode. (Patch by Antoine Pitrou, back-ported to 2.7 faster bytecode. (Patch by Antoine Pitrou, back-ported to 2.7
by Jeffrey Yasskin; :issue:`4715`.) by Jeffrey Yasskin; :issue:`4715`.)
* 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`.)
* 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`.)
.. ====================================================================== .. ======================================================================
New and Improved Modules New and Improved Modules
@ -238,6 +422,14 @@ changes, sorted alphabetically by module name. Consult the
:file:`Misc/NEWS` file in the source tree for a more complete list of :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. 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:`bz2` module's :class:`BZ2File` now supports the context * The :mod:`bz2` module's :class:`BZ2File` now supports the context
management protocol, so you can write ``with bz2.BZ2File(...) as f: ...``. management protocol, so you can write ``with bz2.BZ2File(...) as f: ...``.
(Contributed by Hagen Fuerstenau; :issue:`3860`.) (Contributed by Hagen Fuerstenau; :issue:`3860`.)
@ -279,6 +471,9 @@ changes, or look through the Subversion logs for all the details.
Contributed by Raymond Hettinger; :issue:`1696199`. Contributed by Raymond Hettinger; :issue:`1696199`.
The new `OrderedDict` class is described in the earlier section
:ref:`pep-0372`.
The :class:`namedtuple` class now has an optional *rename* parameter. The :class:`namedtuple` class now has an optional *rename* parameter.
If *rename* is true, field names that are invalid because they've If *rename* is true, field names that are invalid because they've
been repeated or that aren't legal Python identifiers will be been repeated or that aren't legal Python identifiers will be
@ -295,10 +490,42 @@ changes, or look through the Subversion logs for all the details.
The :class:`deque` data type now exposes its maximum length as the The :class:`deque` data type now exposes its maximum length as the
read-only :attr:`maxlen` attribute. (Added by Raymond Hettinger.) read-only :attr:`maxlen` attribute. (Added by Raymond Hettinger.)
* In Distutils, :func:`distutils.sdist.add_defaults` now uses * The :mod:`ctypes` module now always converts ``None`` to a C NULL
pointer for arguments declared as pointers. (Changed by Thomas
Heller; :issue:`4606`.)
* 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`.)
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`.)
* Distutils is being more actively developed, thanks to Tarek Ziade
has taken over maintenance of the package. 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`).
:func:`distutils.sdist.add_defaults` now uses
*package_dir* and *data_files* to create the MANIFEST file. *package_dir* and *data_files* to create the MANIFEST file.
:mod:`distutils.sysconfig` will now read the :envvar:`AR` :mod:`distutils.sysconfig` now reads the :envvar:`AR` and
environment variable. :envvar:`ARFLAGS` environment variables.
.. ARFLAGS done in #5941
It is no longer mandatory to store clear-text passwords in the It is no longer mandatory to store clear-text passwords in the
:file:`.pypirc` file when registering and uploading packages to PyPI. As long :file:`.pypirc` file when registering and uploading packages to PyPI. As long
@ -312,18 +539,7 @@ changes, or look through the Subversion logs for all the details.
process, but instead simply not install the failing extension. process, but instead simply not install the failing extension.
(Contributed by Georg Brandl; :issue:`5583`.) (Contributed by Georg Brandl; :issue:`5583`.)
* New method: the :class:`Decimal` class gained a * The :class:`Fraction` class now accepts two rational numbers
: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`.)
* The :class:`Fraction` class will now accept two rational numbers
as arguments to its constructor. as arguments to its constructor.
(Implemented by Mark Dickinson; :issue:`5812`.) (Implemented by Mark Dickinson; :issue:`5812`.)
@ -338,7 +554,32 @@ changes, or look through the Subversion logs for all the details.
recorded in a gzipped file by providing an optional timestamp to recorded in a gzipped file by providing an optional timestamp to
the constructor. (Contributed by Jacques Frechet; :issue:`4272`.) the constructor. (Contributed by Jacques Frechet; :issue:`4272`.)
* The :class:`io.FileIO` class now raises an :exc:`OSError` when passed * The :mod:`hashlib` module was inconsistent about accepting
input as a Unicode object or an object that doesn't support
the buffer protocol. The behavior was different depending on
whether :mod:`hashlib` was using an external OpenSSL library
or its built-in implementations. Python 2.7 makes the
behavior consistent, always rejecting such objects by raising a
:exc:`TypeError`. (Fixed by Gregory P. Smith; :issue:`3745`.)
* 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 :mod:`imaplib` module now supports IPv6 addresses.
(Contributed by Derek Morr; :issue:`1655`.)
* 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 at hand. 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; an invalid file descriptor. (Implemented by Benjamin Peterson;
:issue:`4991`.) :issue:`4991`.)
@ -382,12 +623,19 @@ changes, or look through the Subversion logs for all the details.
with any object literal that decodes to a list of pairs. with any object literal that decodes to a list of pairs.
(Contributed by Raymond Hettinger; :issue:`5381`.) (Contributed by Raymond Hettinger; :issue:`5381`.)
* New functions: the :mod:`math` module now has
a :func:`gamma` function.
(Contributed by Mark Dickinson and nirinA raseliarison; :issue:`3366`.)
* The :mod:`multiprocessing` module's :class:`Manager*` classes * The :mod:`multiprocessing` module's :class:`Manager*` classes
can now be passed a callable that will be called whenever can now be passed a callable that will be called whenever
a subprocess is started, along with a set of arguments that will be a subprocess is started, along with a set of arguments that will be
passed to the callable. passed to the callable.
(Contributed by lekma; :issue:`5585`.) (Contributed by lekma; :issue:`5585`.)
* The :mod:`nntplib` module now supports IPv6 addresses.
(Contributed by Derek Morr; :issue:`1664`.)
* The :mod:`pydoc` module now has help for the various symbols that Python * The :mod:`pydoc` module now has help for the various symbols that Python
uses. You can now do ``help('<<')`` or ``help('@')``, for example. uses. You can now do ``help('<<')`` or ``help('@')``, for example.
(Contributed by David Laban; :issue:`4739`.) (Contributed by David Laban; :issue:`4739`.)
@ -396,6 +644,36 @@ changes, or look through the Subversion logs for all the details.
now accept an optional *flags* argument, for consistency with the now accept an optional *flags* argument, for consistency with the
other functions in the module. (Added by Gregory P. Smith.) other functions in the module. (Added by Gregory P. Smith.)
* The :mod:`shutil` module's :func:`copyfile` and :func:`copytree`
functions now raises 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 Ziade; :issue:`6693`.)
* 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`.)
* 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 * New function: the :mod:`subprocess` module's
:func:`check_output` runs a command with a specified set of arguments :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 and returns the command's output as a string when the command runs without
@ -422,122 +700,151 @@ changes, or look through the Subversion logs for all the details.
named ``major``, ``minor``, ``micro``, ``releaselevel``, and ``serial``. named ``major``, ``minor``, ``micro``, ``releaselevel``, and ``serial``.
(Contributed by Ross Light; :issue:`4285`.) (Contributed by Ross Light; :issue:`4285`.)
* The :mod:`tarfile` module 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 Gustaebel; :issue:`6856`.)
* The :mod:`threading` module's :meth:`Event.wait` method now returns * The :mod:`threading` module's :meth:`Event.wait` method now returns
the internal flag on exit. This means the method will usually the internal flag on exit. This means the method will usually
return true because :meth:`wait` is supposed to block until the return true because :meth:`wait` is supposed to block until the
internal flag becomes true. The return value will only be false if internal flag becomes true. The return value will only be false if
a timeout was provided and the operation timed out. a timeout was provided and the operation timed out.
(Contributed by XXX; :issue:`1674032`.) (Contributed by Tim Lesher; :issue:`1674032`.)
* The :mod:`unittest` module was enhanced in several ways. * The :func:`is_zipfile` function in the :mod:`zipfile` module now
The progress messages will now show 'x' for expected failures accepts a file object, in addition to the path names accepted in earlier
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`.)
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`.)
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:`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.
* :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:`assertSameElements` 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 the differences.
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. :meth:`assertDictContainsSubset` checks whether
all of the key/value pairs in *first* are found in *second*.
* :meth:`assertAlmostEqual` and :meth:`assertNotAlmostEqual` short-circuit
(automatically pass or fail without checking decimal places) if the objects
are equal.
* :meth:`loadTestsFromName` properly honors the ``suiteClass`` attribute of
the :class:`TestLoader`. (Fixed by Mark Roddy; :issue:`6866`.)
* A new hook, :meth:`addTypeEqualityFunc` takes a type object and a
function. The :meth:`assertEqual` method will use the function
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 ``main`` doesn't call :func:`sys.exit` allowing it to
be used from the interactive interpreter. :issue:`3379`.
:class:`TestResult` has new :meth:`startTestRun` and
:meth:`stopTestRun` methods; called immediately before
and after a test run. :issue:`5728` by Robert Collins.
* The :func:`is_zipfile` function in the :mod:`zipfile` module will now
accept a file object, in addition to the path names accepted in earlier
versions. (Contributed by Gabriel Genellina; :issue:`4756`.) versions. (Contributed by Gabriel Genellina; :issue:`4756`.)
:mod:`zipfile` now supports archiving empty directories and :mod:`zipfile` now supports archiving empty directories and
extracts them correctly. (Fixed by Kuba Wieczorek; :issue:`4710`.) extracts them correctly. (Fixed by Kuba Wieczorek; :issue:`4710`.)
* The :mod:`ftplib` module gains the ability to establish secure FTP
connections using TLS encapsulation of authentication as well as
subsequent control and data transfers. This is provided by the new
:class:`ftplib.FTP_TLS` class.
(Contributed by Giampaolo Rodola', :issue:`2054`.)
.. ====================================================================== .. ======================================================================
.. whole new modules get described in subsections here .. whole new modules get described in subsections here
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`.)
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:`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.
* :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:`assertSameElements` 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 the differences.
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. :meth:`assertDictContainsSubset` checks whether
all of the key/value pairs in *first* are found in *second*.
* :meth:`assertAlmostEqual` and :meth:`assertNotAlmostEqual` short-circuit
(automatically pass or fail without checking decimal places) if the objects
are equal.
* :meth:`loadTestsFromName` properly honors the ``suiteClass`` attribute of
the :class:`TestLoader`. (Fixed by Mark Roddy; :issue:`6866`.)
* A new hook, :meth:`addTypeEqualityFunc` takes a type object and a
function. The :meth:`assertEqual` method will use the function
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 ``main`` doesn't call :func:`sys.exit` allowing it to
be used from the interactive interpreter. :issue:`3379`.
:class:`TestResult` has new :meth:`startTestRun` and
:meth:`stopTestRun` methods; called immediately before
and after a test run. :issue:`5728` by Robert Collins.
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 importlib: Importing Modules
------------------------------ ------------------------------
@ -549,7 +856,7 @@ import process. Python 2.7 doesn't contain the complete
:mod:`importlib` package, but instead has a tiny subset that contains :mod:`importlib` package, but instead has a tiny subset that contains
a single function, :func:`import_module`. a single function, :func:`import_module`.
``import_module(*name*, *package*=None)`` imports a module. *name* is ``import_module(name, package=None)`` imports a module. *name* is
a string containing the module or package's name. It's possible to do a string containing the module or package's name. It's possible to do
relative imports by providing a string that begins with a ``.`` relative imports by providing a string that begins with a ``.``
character, such as ``..utils.errors``. For relative imports, the character, such as ``..utils.errors``. For relative imports, the
@ -607,8 +914,8 @@ Build and C API Changes
Changes to Python's build process and to the C API include: Changes to Python's build process and to the C API include:
* If you use the :file:`.gdbinit` file provided with Python, * If you use the :file:`.gdbinit` file provided with Python,
the "pyo" macro in the 2.7 version will now work when the thread being the "pyo" macro in the 2.7 version now works correctly when the thread being
debugged doesn't hold the GIL; the macro will now acquire it before printing. debugged doesn't hold the GIL; the macro now acquires it before printing.
(Contributed by Victor Stinner; :issue:`3632`.) (Contributed by Victor Stinner; :issue:`3632`.)
* :cfunc:`Py_AddPendingCall` is now thread-safe, letting any * :cfunc:`Py_AddPendingCall` is now thread-safe, letting any
@ -616,8 +923,57 @@ Changes to Python's build process and to the C API include:
is particularly useful for asynchronous IO operations. is particularly useful for asynchronous IO operations.
(Contributed by Kristjan Valur Jonsson; :issue:`4293`.) (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:`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 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.
* 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`.)
* Global symbols defined by the :mod:`ctypes` module are now prefixed * Global symbols defined by the :mod:`ctypes` module are now prefixed
with ``Py`, or with ``_ctypes``. (Implemented by Thomas with ``Py``, or with ``_ctypes``. (Implemented by Thomas
Heller; :issue:`3102`.) Heller; :issue:`3102`.)
* The :program:`configure` script now checks for floating-point rounding bugs * The :program:`configure` script now checks for floating-point rounding bugs
@ -626,6 +982,12 @@ Changes to Python's build process and to the C API include:
but it's available if anyone wishes to use it. but it's available if anyone wishes to use it.
(Added by Mark Dickinson; :issue:`2937`.) (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 Port-Specific Changes: Windows
@ -642,12 +1004,15 @@ Port-Specific Changes: Windows
the native thread-local storage functions are now used. the native thread-local storage functions are now used.
(Contributed by Kristjan Valur Jonsson; :issue:`3582`.) (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`.)
.. ====================================================================== .. ======================================================================
Port-Specific Changes: Mac OS X Port-Specific Changes: Mac OS X
----------------------------------- -----------------------------------
* The ``/Library/Python/2.7/site-packages`` is now appended to * The path ``/Library/Python/2.7/site-packages`` is now appended to
``sys.path``, in order to share added packages between the system ``sys.path``, in order to share added packages between the system
installation and a user-installed copy of the same version. installation and a user-installed copy of the same version.
(Changed by Ronald Oussoren; :issue:`4865`.) (Changed by Ronald Oussoren; :issue:`4865`.)
@ -666,12 +1031,12 @@ Other Changes and Fixes
* The :file:`regrtest.py` script now takes a :option:`--randseed=` * The :file:`regrtest.py` script now takes a :option:`--randseed=`
switch that takes an integer that will be used as the random seed switch that takes an integer that will be used as the random seed
for the :option:`-r` option that executes tests in random order. for the :option:`-r` option that executes tests in random order.
The :option:`-r` option also now reports the seed that was used The :option:`-r` option also reports the seed that was used
(Added by Collin Winter.) (Added by Collin Winter.)
* The :file:`regrtest.py` script now takes a :option:`-j` switch * The :file:`regrtest.py` script now takes a :option:`-j` switch
that takes an integer specifying how many tests run in parallel. This that takes an integer specifying how many tests run in parallel. This
allows to shorten the total runtime on multi-core machines. allows reducing the total runtime on multi-core machines.
This option is compatible with several other options, including the This option is compatible with several other options, including the
:option:`-R` switch which is known to produce long runtimes. :option:`-R` switch which is known to produce long runtimes.
(Added by Antoine Pitrou, :issue:`6152`.) (Added by Antoine Pitrou, :issue:`6152`.)
@ -684,6 +1049,17 @@ Porting to Python 2.7
This section lists previously described changes and other bugfixes This section lists previously described changes and other bugfixes
that may require changes to your code: 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 * Because of an optimization for the :keyword:`with` statement, the special
methods :meth:`__enter__` and :meth:`__exit__` must belong to the object's methods :meth:`__enter__` and :meth:`__exit__` must belong to the object's
type, and cannot be directly attached to the object's instance. This type, and cannot be directly attached to the object's instance. This

View File

@ -287,6 +287,5 @@ def interact(banner=None, readfunc=None, local=None):
console.interact(banner) console.interact(banner)
if __name__ == '__main__': if __name__ == "__main__":
import pdb interact()
pdb.run("interact()\n")

View File

@ -469,12 +469,21 @@ class Maildir(Mailbox):
def _refresh(self): def _refresh(self):
"""Update table of contents mapping.""" """Update table of contents mapping."""
new_mtime = os.path.getmtime(os.path.join(self._path, 'new')) if self._last_read is not None:
cur_mtime = os.path.getmtime(os.path.join(self._path, 'cur')) for subdir in ('new', 'cur'):
mtime = os.path.getmtime(os.path.join(self._path, subdir))
if mtime > self._last_read:
break
else:
return
if (self._last_read is not None and # We record the current time - 1sec so that, if _refresh() is called
new_mtime <= self._last_read and cur_mtime <= self._last_read): # again in the same second, we will always re-read the mailbox
return # just in case it's been modified. (os.path.mtime() only has
# 1sec resolution.) This results in a few unnecessary re-reads
# when _refresh() is called multiple times in the same second,
# but once the clock ticks over, we will only re-read as needed.
now = time.time() - 1
self._toc = {} self._toc = {}
def update_dir (subdir): def update_dir (subdir):
@ -489,14 +498,7 @@ class Maildir(Mailbox):
update_dir('new') update_dir('new')
update_dir('cur') update_dir('cur')
# We record the current time - 1sec so that, if _refresh() is called self._last_read = now
# again in the same second, we will always re-read the mailbox
# just in case it's been modified. (os.path.mtime() only has
# 1sec resolution.) This results in a few unnecessary re-reads
# when _refresh() is called multiple times in the same second,
# but once the clock ticks over, we will only re-read as needed.
now = int(time.time() - 1)
self._last_read = time.time() - 1
def _lookup(self, key): def _lookup(self, key):
"""Use TOC to return subpath for given key, or raise a KeyError.""" """Use TOC to return subpath for given key, or raise a KeyError."""

View File

@ -249,7 +249,7 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
dirs.remove('CVS') # don't visit CVS directories dirs.remove('CVS') # don't visit CVS directories
""" """
from os.path import join, isdir, islink islink, join, isdir = path.islink, path.join, path.isdir
# We may not have read permission for top, in which case we can't # We may not have read permission for top, in which case we can't
# get a list of the files the directory contains. os.walk # get a list of the files the directory contains. os.walk
@ -275,9 +275,9 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
if topdown: if topdown:
yield top, dirs, nondirs yield top, dirs, nondirs
for name in dirs: for name in dirs:
path = join(top, name) new_path = join(top, name)
if followlinks or not islink(path): if followlinks or not islink(new_path):
for x in walk(path, topdown, onerror, followlinks): for x in walk(new_path, topdown, onerror, followlinks):
yield x yield x
if not topdown: if not topdown:
yield top, dirs, nondirs yield top, dirs, nondirs

View File

@ -62,7 +62,7 @@ class _ModifiedArgv0(object):
def _run_code(code, run_globals, init_globals=None, def _run_code(code, run_globals, init_globals=None,
mod_name=None, mod_fname=None, mod_name=None, mod_fname=None,
mod_loader=None, pkg_name=None): mod_loader=None, pkg_name=None):
"""Helper for _run_module_code""" """Helper to run code in nominated namespace"""
if init_globals is not None: if init_globals is not None:
run_globals.update(init_globals) run_globals.update(init_globals)
run_globals.update(__name__ = mod_name, run_globals.update(__name__ = mod_name,
@ -75,7 +75,7 @@ def _run_code(code, run_globals, init_globals=None,
def _run_module_code(code, init_globals=None, def _run_module_code(code, init_globals=None,
mod_name=None, mod_fname=None, mod_name=None, mod_fname=None,
mod_loader=None, pkg_name=None): mod_loader=None, pkg_name=None):
"""Helper for run_module""" """Helper to run code in new namespace with sys modified"""
with _TempModule(mod_name) as temp_module, _ModifiedArgv0(mod_fname): with _TempModule(mod_name) as temp_module, _ModifiedArgv0(mod_fname):
mod_globals = temp_module.module.__dict__ mod_globals = temp_module.module.__dict__
_run_code(code, mod_globals, init_globals, _run_code(code, mod_globals, init_globals,
@ -103,7 +103,7 @@ def _get_module_details(mod_name):
raise ImportError("No module named %s" % mod_name) raise ImportError("No module named %s" % mod_name)
if loader.is_package(mod_name): if loader.is_package(mod_name):
if mod_name == "__main__" or mod_name.endswith(".__main__"): if mod_name == "__main__" or mod_name.endswith(".__main__"):
raise ImportError(("Cannot use package as __main__ module")) raise ImportError("Cannot use package as __main__ module")
try: try:
pkg_main_name = mod_name + ".__main__" pkg_main_name = mod_name + ".__main__"
return _get_module_details(pkg_main_name) return _get_module_details(pkg_main_name)
@ -116,29 +116,22 @@ def _get_module_details(mod_name):
filename = _get_filename(loader, mod_name) filename = _get_filename(loader, mod_name)
return mod_name, loader, code, filename return mod_name, loader, code, filename
# XXX ncoghlan: Should this be documented and made public?
def _get_main_module_details(): # (Current thoughts: don't repeat the mistake that lead to its
# Helper that gives a nicer error message when attempting to # creation when run_module() no longer met the needs of
# execute a zipfile or directory by invoking __main__.py # mainmodule.c, but couldn't be changed because it was public)
main_name = "__main__"
try:
return _get_module_details(main_name)
except ImportError as exc:
if main_name in str(exc):
raise ImportError("can't find %r module in %r" %
(main_name, sys.path[0]))
raise
# This function is the actual implementation of the -m switch and direct
# execution of zipfiles and directories and is deliberately kept private.
# This avoids a repeat of the situation where run_module() no longer met the
# needs of mainmodule.c, but couldn't be changed because it was public
def _run_module_as_main(mod_name, alter_argv=True): def _run_module_as_main(mod_name, alter_argv=True):
"""Runs the designated module in the __main__ namespace """Runs the designated module in the __main__ namespace
These __*__ magic variables will be overwritten: Note that the executed module will have full access to the
__main__ namespace. If this is not desirable, the run_module()
function sbould be used to run the module code in a fresh namespace.
At the very least, these variables in __main__ will be overwritten:
__name__
__file__ __file__
__loader__ __loader__
__package__
""" """
try: try:
if alter_argv or mod_name != "__main__": # i.e. -m switch if alter_argv or mod_name != "__main__": # i.e. -m switch
@ -146,7 +139,16 @@ def _run_module_as_main(mod_name, alter_argv=True):
else: # i.e. directory or zipfile execution else: # i.e. directory or zipfile execution
mod_name, loader, code, fname = _get_main_module_details() mod_name, loader, code, fname = _get_main_module_details()
except ImportError as exc: except ImportError as exc:
msg = "%s: %s" % (sys.executable, str(exc)) # Try to provide a good error message
# for directories, zip files and the -m switch
if alter_argv:
# For -m switch, just display the exception
info = str(exc)
else:
# For directories/zipfiles, let the user
# know what the code was looking for
info = "can't find '__main__.py' in %r" % sys.argv[0]
msg = "%s: %s" % (sys.executable, info)
sys.exit(msg) sys.exit(msg)
pkg_name = mod_name.rpartition('.')[0] pkg_name = mod_name.rpartition('.')[0]
main_globals = sys.modules["__main__"].__dict__ main_globals = sys.modules["__main__"].__dict__
@ -173,6 +175,18 @@ def run_module(mod_name, init_globals=None,
return _run_code(code, {}, init_globals, run_name, return _run_code(code, {}, init_globals, run_name,
fname, loader, pkg_name) fname, loader, pkg_name)
def _get_main_module_details():
# Helper that gives a nicer error message when attempting to
# execute a zipfile or directory by invoking __main__.py
main_name = "__main__"
try:
return _get_module_details(main_name)
except ImportError as exc:
if main_name in str(exc):
raise ImportError("can't find %r module in %r" %
(main_name, sys.path[0]))
raise
# XXX (ncoghlan): Perhaps expose the C API function # XXX (ncoghlan): Perhaps expose the C API function
# as imp.get_importer instead of reimplementing it in Python? # as imp.get_importer instead of reimplementing it in Python?

View File

@ -915,6 +915,14 @@ class GrammarTests(unittest.TestCase):
self.assertEqual((6 / 2 if 1 else 3), 3) self.assertEqual((6 / 2 if 1 else 3), 3)
self.assertEqual((6 < 4 if 0 else 2), 2) self.assertEqual((6 < 4 if 0 else 2), 2)
def test_paren_evaluation(self):
self.assertEqual(16 // (4 // 2), 8)
self.assertEqual((16 // 4) // 2, 2)
self.assertEqual(16 // 4 // 2, 2)
self.assertTrue(False is (2 is 3))
self.assertFalse((False is 2) is 3)
self.assertFalse(False is 2 is 3)
def test_main(): def test_main():
run_unittest(TokenTests, GrammarTests) run_unittest(TokenTests, GrammarTests)

View File

@ -100,8 +100,8 @@ class RunModuleTest(unittest.TestCase):
self.expect_import_error("a.bee") self.expect_import_error("a.bee")
self.expect_import_error(".howard") self.expect_import_error(".howard")
self.expect_import_error("..eaten") self.expect_import_error("..eaten")
# Package # Package without __main__.py
self.expect_import_error("logging") self.expect_import_error("multiprocessing")
def test_library_module(self): def test_library_module(self):
run_module("runpy") run_module("runpy")
@ -113,9 +113,9 @@ class RunModuleTest(unittest.TestCase):
pkg_file.close() pkg_file.close()
return pkg_fname return pkg_fname
def _make_pkg(self, source, depth): def _make_pkg(self, source, depth, mod_base="runpy_test"):
pkg_name = "__runpy_pkg__" pkg_name = "__runpy_pkg__"
test_fname = "runpy_test.py" test_fname = mod_base+os.extsep+"py"
pkg_dir = sub_dir = tempfile.mkdtemp() pkg_dir = sub_dir = tempfile.mkdtemp()
if verbose: print(" Package tree in:", sub_dir) if verbose: print(" Package tree in:", sub_dir)
sys.path.insert(0, pkg_dir) sys.path.insert(0, pkg_dir)
@ -130,7 +130,7 @@ class RunModuleTest(unittest.TestCase):
mod_file.write(source) mod_file.write(source)
mod_file.close() mod_file.close()
if verbose: print(" Created:", mod_fname) if verbose: print(" Created:", mod_fname)
mod_name = (pkg_name+".")*depth + "runpy_test" mod_name = (pkg_name+".")*depth + mod_base
return pkg_dir, mod_fname, mod_name return pkg_dir, mod_fname, mod_name
def _del_pkg(self, top, depth, mod_name): def _del_pkg(self, top, depth, mod_name):
@ -179,6 +179,28 @@ class RunModuleTest(unittest.TestCase):
self._del_pkg(pkg_dir, depth, mod_name) self._del_pkg(pkg_dir, depth, mod_name)
if verbose: print("Module executed successfully") if verbose: print("Module executed successfully")
def _check_package(self, depth):
pkg_dir, mod_fname, mod_name = (
self._make_pkg("x=1\n", depth, "__main__"))
pkg_name, _, _ = mod_name.rpartition(".")
forget(mod_name)
try:
if verbose: print("Running from source:", pkg_name)
d1 = run_module(pkg_name) # Read from source
self.assertTrue("x" in d1)
self.assertTrue(d1["x"] == 1)
del d1 # Ensure __loader__ entry doesn't keep file open
__import__(mod_name)
os.remove(mod_fname)
if verbose: print("Running from compiled:", pkg_name)
d2 = run_module(pkg_name) # Read from bytecode
self.assertTrue("x" in d2)
self.assertTrue(d2["x"] == 1)
del d2 # Ensure __loader__ entry doesn't keep file open
finally:
self._del_pkg(pkg_dir, depth, pkg_name)
if verbose: print("Package executed successfully")
def _add_relative_modules(self, base_dir, source, depth): def _add_relative_modules(self, base_dir, source, depth):
if depth <= 1: if depth <= 1:
raise ValueError("Relative module test needs depth > 1") raise ValueError("Relative module test needs depth > 1")
@ -240,6 +262,11 @@ from ..uncle.cousin import nephew
if verbose: print("Testing package depth:", depth) if verbose: print("Testing package depth:", depth)
self._check_module(depth) self._check_module(depth)
def test_run_package(self):
for depth in range(1, 4):
if verbose: print("Testing package depth:", depth)
self._check_package(depth)
def test_explicit_relative_import(self): def test_explicit_relative_import(self):
for depth in range(2, 5): for depth in range(2, 5):
if verbose: print("Testing relative imports at depth:", depth) if verbose: print("Testing relative imports at depth:", depth)

View File

@ -2098,7 +2098,8 @@ static PyObject *
listindex(PyListObject *self, PyObject *args) listindex(PyListObject *self, PyObject *args)
{ {
Py_ssize_t i, start=0, stop=Py_SIZE(self); Py_ssize_t i, start=0, stop=Py_SIZE(self);
PyObject *v; PyObject *v, *format_tuple, *err_string;
static PyObject *err_format = NULL;
if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &start,
@ -2121,7 +2122,20 @@ listindex(PyListObject *self, PyObject *args)
else if (cmp < 0) else if (cmp < 0)
return NULL; return NULL;
} }
PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list"); if (err_format == NULL) {
err_format = PyUnicode_FromString("%r is not in list");
if (err_format == NULL)
return NULL;
}
format_tuple = PyTuple_Pack(1, v);
if (format_tuple == NULL)
return NULL;
err_string = PyUnicode_Format(err_format, format_tuple);
Py_DECREF(format_tuple);
if (err_string == NULL)
return NULL;
PyErr_SetObject(PyExc_ValueError, err_string);
Py_DECREF(err_string);
return NULL; return NULL;
} }

View File

@ -3802,49 +3802,47 @@ static void
assemble_jump_offsets(struct assembler *a, struct compiler *c) assemble_jump_offsets(struct assembler *a, struct compiler *c)
{ {
basicblock *b; basicblock *b;
int bsize, totsize, extended_arg_count, last_extended_arg_count = 0; int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
int i; int i;
/* Compute the size of each block and fixup jump args. /* Compute the size of each block and fixup jump args.
Replace block pointer with position in bytecode. */ Replace block pointer with position in bytecode. */
start: do {
totsize = 0; totsize = 0;
for (i = a->a_nblocks - 1; i >= 0; i--) { for (i = a->a_nblocks - 1; i >= 0; i--) {
b = a->a_postorder[i]; b = a->a_postorder[i];
bsize = blocksize(b); bsize = blocksize(b);
b->b_offset = totsize; b->b_offset = totsize;
totsize += bsize; totsize += bsize;
} }
extended_arg_count = 0; last_extended_arg_count = extended_arg_count;
for (b = c->u->u_blocks; b != NULL; b = b->b_list) { extended_arg_count = 0;
bsize = b->b_offset; for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
for (i = 0; i < b->b_iused; i++) { bsize = b->b_offset;
struct instr *instr = &b->b_instr[i]; for (i = 0; i < b->b_iused; i++) {
/* Relative jumps are computed relative to struct instr *instr = &b->b_instr[i];
the instruction pointer after fetching /* Relative jumps are computed relative to
the jump instruction. the instruction pointer after fetching
*/ the jump instruction.
bsize += instrsize(instr); */
if (instr->i_jabs) bsize += instrsize(instr);
instr->i_oparg = instr->i_target->b_offset; if (instr->i_jabs)
else if (instr->i_jrel) { instr->i_oparg = instr->i_target->b_offset;
int delta = instr->i_target->b_offset - bsize; else if (instr->i_jrel) {
instr->i_oparg = delta; int delta = instr->i_target->b_offset - bsize;
} instr->i_oparg = delta;
else }
continue; else
if (instr->i_oparg > 0xffff) continue;
extended_arg_count++; if (instr->i_oparg > 0xffff)
extended_arg_count++;
}
} }
}
/* XXX: This is an awful hack that could hurt performance, but /* XXX: This is an awful hack that could hurt performance, but
on the bright side it should work until we come up on the bright side it should work until we come up
with a better solution. with a better solution.
In the meantime, should the goto be dropped in favor
of a loop?
The issue is that in the first loop blocksize() is called The issue is that in the first loop blocksize() is called
which calls instrsize() which requires i_oparg be set which calls instrsize() which requires i_oparg be set
appropriately. There is a bootstrap problem because appropriately. There is a bootstrap problem because
@ -3855,10 +3853,7 @@ start:
ones in jump instructions. So this should converge ones in jump instructions. So this should converge
fairly quickly. fairly quickly.
*/ */
if (last_extended_arg_count != extended_arg_count) { } while (last_extended_arg_count != extended_arg_count);
last_extended_arg_count = extended_arg_count;
goto start;
}
} }
static PyObject * static PyObject *

View File

@ -228,7 +228,7 @@ class Test:
raise ValueError('at least one calibration run is required') raise ValueError('at least one calibration run is required')
self.calibration_runs = calibration_runs self.calibration_runs = calibration_runs
if timer is not None: if timer is not None:
timer = timer self.timer = timer
# Init variables # Init variables
self.times = [] self.times = []