diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 329518dc6df..dcea4f20674 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -8,6 +8,9 @@ .. Fix accents on Kristjan Valur Jonsson, Fuerstenau +.. Big jobs: argparse, ElementTree 1.3, pep 391, 3106, sysconfig +.. unittest test discovery + .. $Id$ Rules for maintenance: @@ -37,7 +40,7 @@ * 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 + * 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. @@ -106,11 +109,12 @@ 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. +:class:`~collections.OrderedDict` class has been introduced in the +:mod:`collections` module. -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:: +The :class:`~collections.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), @@ -132,8 +136,8 @@ Deleting an entry and reinserting it will move it to the end:: >>> 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 +The :meth:`~collections.OrderedDict.popitem` method has an optional *last* +argument that defaults to True. If *last* is True, the most recently added key is returned and removed; if it's False, the oldest key is selected:: @@ -142,9 +146,9 @@ oldest key is selected:: (19, 0) >>> od.popitem() (18, 0) - >>> od.popitem(False) + >>> od.popitem(last=False) (0, 0) - >>> od.popitem(False) + >>> od.popitem(last=False) (1, 0) Comparing two ordered dictionaries checks both the keys and values, @@ -154,31 +158,35 @@ and requires that the insertion order was the same:: ... ('third', 3)]) >>> od2 = OrderedDict([('third', 3), ('first', 1), ... ('second', 2)]) - >>> od1==od2 + >>> od1 == od2 False >>> # Move 'third' key to the end - >>> del od2['third'] ; od2['third'] = 3 - >>> od1==od2 + >>> del od2['third']; od2['third'] = 3 + >>> od1 == od2 True -Comparing an :class:`OrderedDict` with a regular dictionary +Comparing an :class:`~collections.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 +How does the :class:`~collections.OrderedDict` work? It maintains a +doubly-linked list of keys, appending new keys to the list as they're inserted. +A secondary dictionary maps keys to their corresponding list node, so deletion doesn't have to traverse the entire linked list and therefore remains O(1). .. XXX check O(1)-ness with Raymond +.. Also check if the 'somenamedtuple' in the collection module should +.. be replaced/removed in order to use +.. :meth:`~collections.namedtuple._asdict()` (see below) 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. +order. The :meth:`~collections.somenamedtuple._asdict()` method for +:func:`collections.namedtuple` now returns an ordered dictionary with the +values appearing in the same order as the underlying tuple indices. +The :mod:`json` module 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 `_. .. seealso:: @@ -190,7 +198,7 @@ Support was also added for third-party tools like `PyYAML `_ .. _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 @@ -203,7 +211,7 @@ 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 +mini-language used by the :meth:`str.format` method. When formatting a floating-point number, simply include a comma between the width and the precision:: @@ -242,6 +250,20 @@ 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 @@ -273,9 +295,9 @@ Some smaller changes made to the core Python language are: >>> {1,2,3,4,5} set([1, 2, 3, 4, 5]) - >>> set() + >>> set() # empty set set([]) - >>> {} + >>> {} # empty dict {} Backported by Alexandre Vassalotti; :issue:`2335`. @@ -321,7 +343,7 @@ Some smaller changes made to the core Python language are: :mod:`marshal`, :mod:`pickle` and :mod:`json` modules; parsing of float and imaginary literals in Python code; - and :class:`Decimal`-to-float conversion. + and :class:`~decimal.Decimal`-to-float conversion. Related to this, the :func:`repr` of a floating-point number *x* now returns a result based on the shortest decimal string that's @@ -329,6 +351,8 @@ Some smaller changes made to the core Python language are: round-half-to-even rounding mode). Previously it gave a string based on rounding x to 17 decimal digits. + .. maybe add an example? + The rounding library responsible for this improvement works on Windows, and on Unix platforms using the gcc, icc, or suncc compilers. There may be a small number of platforms where correct @@ -356,11 +380,12 @@ Some smaller changes made to the core Python language are: 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`. + 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`.) + 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'. @@ -371,7 +396,7 @@ Some smaller changes made to the core Python language are: its argument in binary:: >>> n = 37 - >>> bin(37) + >>> bin(n) '0b100101' >>> n.bit_length() 6 @@ -402,8 +427,7 @@ Some smaller changes made to the core Python language are: >>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 - >>> n-long(float(n) - ... ) + >>> n - long(float(n)) -1L (Implemented by Mark Dickinson; :issue:`3166`.) @@ -411,10 +435,16 @@ Some smaller changes made to the core Python language are: Integer division is also more accurate in its rounding behaviours. (Also implemented by Mark Dickinson; :issue:`1811`.) -* The :class:`bytearray` type's :meth:`translate` method now accepts +* It's now possible for a subclass of the built-in :class:`unicode` type + to override the :meth:`__unicode__` method. (Implemented by + Victor Stinner; :issue:`1583863`.) + +* The :class:`bytearray` type's :meth:`~bytearray.translate` method now accepts ``None`` as its first argument. (Fixed by Georg Brandl; :issue:`4759`.) + .. bytearray doesn't seem to be documented + * When using ``@classmethod`` and ``@staticmethod`` to wrap methods as class or static methods, the wrapper object now exposes the wrapped function as their :attr:`__func__` attribute. @@ -473,7 +503,7 @@ Several performance enhancements have been added: 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`.) + von Löwis and implemented by Antoine Pitrou; :issue:`4074`.) * The garbage collector tries to avoid tracking simple containers which can't be part of a cycle. In Python 2.7, this is now true for @@ -495,7 +525,7 @@ Several performance enhancements have been added: 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 + debugging purposes there's a new structseq :data:`sys.long_info` that provides information about the internal format, giving the number of bits per digit and the size in bytes of the C type used to store each digit:: @@ -561,7 +591,7 @@ 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` +* The :mod:`bdb` module's base debugging class :class:`~bdb.Bdb` gained a feature for skipping modules. The constructor now takes an iterable containing glob-style patterns such as ``django.*``; the debugger will not step into stack frames @@ -573,13 +603,21 @@ changes, or look through the Subversion logs for all the details. used with :class:`memoryview` instances and other similar buffer objects. (Backported from 3.x by Florent Xicluna; :issue:`7703`.) -* The :mod:`bz2` module's :class:`BZ2File` now supports the context +* Updated module: the :mod:`bsddb` module has been updated from 4.7.2devel9 + to version 4.8.4 of + `the pybsddb package `__. + The new version features better Python 3.x compatibility, various bug fixes, + and adds several new BerkeleyDB flags and methods. + (Updated by Jesús Cea Avión; :issue:`8156`. The pybsddb + changelog can be browsed at http://hg.jcea.es/pybsddb/file/tip/ChangeLog.) + +* The :mod:`bz2` module's :class:`~bz2.BZ2File` now supports the context management protocol, so you can write ``with bz2.BZ2File(...) as f: ...``. (Contributed by Hagen 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 +* New class: the :class:`~collections.Counter` class in the :mod:`collections` + module is useful for tallying data. :class:`~collections.Counter` instances + behave mostly like dictionaries but return zero for missing keys instead of raising a :exc:`KeyError`: .. doctest:: @@ -599,8 +637,9 @@ changes, or look through the Subversion logs for all the details. >>> 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` + There are two additional :class:`~collections.Counter` methods: + :meth:`~collections.Counter.most_common` returns the N most common elements + and their counts, and :meth:`~collections.Counter.elements` returns an iterator over the contained element, repeating each element as many times as its count:: @@ -612,12 +651,14 @@ changes, or look through the Subversion logs for all the details. 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' + .. maybe it's better to use list(c.elements()) here + Contributed by Raymond Hettinger; :issue:`1696199`. - The new `~collections.OrderedDict` class is described in the earlier section - :ref:`pep-0372`. + The new :class:`~collections.OrderedDict` class is described in the earlier + section :ref:`pep-0372`. - The :class:`namedtuple` class now has an optional *rename* parameter. + The :class:`~collections.namedtuple` class now has an optional *rename* parameter. If *rename* is true, field names that are invalid because they've been repeated or that aren't legal Python identifiers will be renamed to legal names that are derived from the field's @@ -630,12 +671,12 @@ changes, or look through the Subversion logs for all the details. (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. + The :class:`~collections.deque` data type now exposes its maximum length as the + read-only :attr:`~collections.deque.maxlen` attribute, and has a + :meth:`~collections.deque.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 +* The :mod:`copy` module's :func:`~copy.deepcopy` function will now correctly copy bound instance methods. (Implemented by Robert Collins; :issue:`1515`.) @@ -646,13 +687,13 @@ changes, or look through the Subversion logs for all the details. 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 :mod:`datetime` module's :class:`~datetime.timedelta` class + gained a :meth:`~datetime.timedelta.total_seconds` method that returns the + number of seconds in the duration. (Contributed by Brian Quinlan; :issue:`5788`.) -* New method: the :class:`Decimal` class gained a - :meth:`from_float` class method that performs an exact conversion - of a floating-point number to a :class:`Decimal`. +* New method: the :class:`~decimal.Decimal` class gained a + :meth:`~decimal.Decimal.from_float` class method that performs an exact + conversion of a floating-point number to a :class:`~decimal.Decimal`. 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, @@ -661,32 +702,39 @@ changes, or look through the Subversion logs for all the details. ``Decimal('0.1000000000000000055511151231257827021181583404541015625')``. (Implemented by Raymond Hettinger; :issue:`4796`.) - The constructor for :class:`Decimal` now accepts non-European + Most of the methods of the :class:`~decimal.Context` class now accept integers + as well as :class:`~decimal.Decimal` instances; the only exceptions are the + :meth:`~decimal.Context.canonical` and :meth:`~decimal.Context.is_canonical` + methods. (Patch by Juan José Conti; :issue:`7633`.) + + The constructor for :class:`~decimal.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 + When using :class:`~decimal.Decimal` instances with a string's + :meth:`~str.format` method, the default alignment was previously left-alignment. This has been changed to right-alignment, which seems more sensible for numeric types. (Changed by Mark Dickinson; :issue:`6857`.) -* The :class:`Fraction` class now accepts two rational numbers +* The :class:`~fractions.Fraction` class now accepts two rational numbers as arguments to its constructor. (Implemented by Mark Dickinson; :issue:`5812`.) -* The :mod:`ftplib` module gained the ability to establish secure FTP +* 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. This is provided by the new - :class:`ftplib.FTP_TLS` class. - (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`.) + subsequent control and data transfers. + (Contributed by Giampaolo Rodola', :issue:`2054`.) -* New function: the :mod:`gc` module's :func:`is_tracked` returns + The :meth:`~ftplib.FTP.storbinary` method for binary uploads can now restart + uploads thanks to an added *rest* parameter (patch by Pablo Mouzo; + :issue:`6845`.) + +* New function: the :mod:`gc` module's :func:`~gc.is_tracked` returns true if a given instance is tracked by the garbage collector, false otherwise. (Contributed by Antoine Pitrou; :issue:`4688`.) -* The :mod:`gzip` module's :class:`GzipFile` now supports the context +* The :mod:`gzip` module's :class:`~gzip.GzipFile` now supports the context management protocol, so you can write ``with gzip.GzipFile(...) as f: ...`` (contributed by Hagen Fuerstenau; :issue:`3860`), and it now implements the :class:`io.BufferedIOBase` ABC, so you can wrap it with @@ -700,11 +748,17 @@ changes, or look through the Subversion logs for all the details. :mod:`gzip` module will now consume these trailing bytes. (Fixed by Tadek Pietraszek and Brian Curtin; :issue:`2846`.) -* The default :class:`HTTPResponse` class used by the :mod:`httplib` module now +* New attribute: the :mod:`hashlib` module now has an :attr:`~hashlib.hashlib.algorithms` + attribute containing a tuple naming the supported algorithms. + In Python 2.7, ``hashlib.algorithms`` contains + ``('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')`` + (Contributed by Carl Chenet; :issue:`7418`.) + +* The default :class:`~httplib.HTTPResponse` class used by the :mod:`httplib` module now supports buffering, resulting in much faster reading of HTTP responses. (Contributed by Kristjan Valur Jonsson; :issue:`4879`.) - The :class:`HTTPConnection` and :class:`HTTPSConnection` classes + The :class:`~httplib.HTTPConnection` and :class:`~httplib.HTTPSConnection` classes now support a *source_address* parameter, a ``(host, port)`` 2-tuple giving the source address that will be used for the connection. (Contributed by Eldon Ziegler; :issue:`3972`.) @@ -712,9 +766,9 @@ changes, or look through the Subversion logs for all the details. * 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 +* 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 at hand. The + 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 @@ -724,7 +778,7 @@ changes, or look through the Subversion logs for all the details. 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 + :issue:`4991`.) The :meth:`~io.IOBase.truncate` method now preserves the file position; previously it would change the file position to the end of the new file. (Fixed by Pascal Chambon; :issue:`6939`.) @@ -735,9 +789,11 @@ changes, or look through the Subversion logs for all the details. itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F + .. maybe here is better to use >>> list(itertools.compress(...)) instead + New function: ``itertools.combinations_with_replacement(iter, r)`` returns all the possible *r*-length combinations of elements from the - iterable *iter*. Unlike :func:`combinations`, individual elements + iterable *iter*. Unlike :func:`~itertools.combinations`, individual elements can be repeated in the generated combinations:: itertools.combinations_with_replacement('abc', 2) => @@ -747,10 +803,10 @@ changes, or look through the Subversion logs for all the details. 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 + The :func:`itertools.count` function now has a *step* argument that + allows incrementing by values other than 1. :func:`~itertools.count` also now allows keyword arguments, and using non-integer values such as - floats or :class:`Decimal` instances. (Implemented by Raymond + floats or :class:`~decimal.Decimal` instances. (Implemented by Raymond Hettinger; :issue:`5032`.) :func:`itertools.combinations` and :func:`itertools.product` were @@ -758,22 +814,22 @@ changes, or look through the Subversion logs for all the details. the input iterable. This was deemed a specification error, so they now return an empty iterator. (Fixed by Raymond Hettinger; :issue:`4816`.) -* The :mod:`json` module was upgraded to version 2.0.9 of the +* 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` + To support the new :class:`collections.OrderedDict` type, :func:`json.load` now has an optional *object_pairs_hook* parameter that will be called with any object literal that decodes to a list of pairs. (Contributed by Raymond Hettinger; :issue:`5381`.) * 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. + :func:`~math.erf` and :func:`~math.erfc` for the error function and the complementary error function, + :func:`~math.expm1` which computes ``e**x - 1`` with more precision than + using :func:`~math.exp` and subtracting 1, + :func:`~math.gamma` for the Gamma function, and + :func:`~math.lgamma` for the natural log of the Gamma function. (Contributed by Mark Dickinson and nirinA raseliarison; :issue:`3366`.) * The :mod:`multiprocessing` module's :class:`Manager*` classes @@ -782,10 +838,10 @@ changes, or look through the Subversion logs for all the details. passed to the callable. (Contributed by lekma; :issue:`5585`.) - The :class:`Pool` class, which controls a pool of worker processes, + The :class:`~multiprocessing.Pool` class, which controls a pool of worker processes, now has an optional *maxtasksperchild* parameter. Worker processes will perform the specified number of tasks and then exit, causing the - :class:`Pool` to start a new worker. This is useful if tasks may leak + :class:`~multiprocessing.Pool` to start a new worker. This is useful if tasks may leak memory or other resources, or if some tasks will cause the worker to become very large. (Contributed by Charles Cazabon; :issue:`6963`.) @@ -794,47 +850,50 @@ changes, or look through the Subversion logs for all the details. (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 + calls: :func:`~os.getresgid` and :func:`~os.getresuid`, which return the real, effective, and saved GIDs and UIDs; - :func:`setresgid` and :func:`setresuid`, which set + :func:`~os.setresgid` and :func:`~os.setresuid`, which set real, effective, and saved GIDs and UIDs to new values; - :func:`initgroups`. (GID/UID functions + :func:`~os.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` + the child process; this fixes problems on Solaris when :func:`~os.fork` is called from a thread. (Fixed by Zsolt Cserna; :issue:`7242`.) - The :func:`normpath` function now preserves Unicode; if its input path +* In the :mod:`os.path` module, the :func:`~os.path.normpath` and + :func:`~os.path.abspath` functions now preserve Unicode; if their input path is a Unicode string, the return value is also a Unicode string. - (Fixed by Matt Giuca; :issue:`5827`.) + (:meth:`~os.path.normpath` fixed by Matt Giuca in :issue:`5827`; + :meth:`~os.path.abspath` fixed by Ezio Melotti in :issue:`3426`.) * The :mod:`pydoc` module now has help for the various symbols that Python uses. You can now do ``help('<<')`` or ``help('@')``, for example. (Contributed by David Laban; :issue:`4739`.) -* The :mod:`re` module's :func:`split`, :func:`sub`, and :func:`subn` +* The :mod:`re` module's :func:`~re.split`, :func:`~re.sub`, and :func:`~re.subn` now accept an optional *flags* argument, for consistency with the other functions in the module. (Added by Gregory P. Smith.) -* The :mod:`shutil` module's :func:`copyfile` and :func:`copytree` - functions now raises a :exc:`SpecialFileError` exception when +* New function: in the :mod:`shutil` module, :func:`~shutil.make_archive` + takes a filename, archive type (zip or tar-format), and a directory + path, and creates an archive containing the directory's contents. + (Added by Tarek Ziadé.) + + :mod:`shutil`'s :func:`~shutil.copyfile` and :func:`~shutil.copytree` + functions now raise a :exc:`~shutil.SpecialFileError` exception when asked to copy a named pipe. Previously the code would treat named pipes like a regular file by opening them for reading, and this would block indefinitely. (Fixed by Antoine Pitrou; :issue:`3002`.) - New function: :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é.) - * New functions: in the :mod:`site` module, three new functions return various site- and user-specific paths. - :func:`getsitepackages` returns a list containing all + :func:`~site.getsitepackages` returns a list containing all global site-packages directories, and - :func:`getusersitepackages` returns the path of the user's + :func:`~site.getusersitepackages` returns the path of the user's site-packages directory. - :func:`getuserbase` returns the value of the :envvar:`USER_BASE` + :func:`~site.getuserbase` returns the value of the :envvar:`USER_BASE` environment variable, giving the path to a directory that can be used to store data. (Contributed by Tarek Ziadé; :issue:`6693`.) @@ -844,32 +903,32 @@ changes, or look through the Subversion logs for all the details. catch and swallow the :exc:`KeyboardInterrupt` exception. (Fixed by Victor Stinner; :issue:`3137`.) -* The :mod:`socket` module's :class:`SSL` objects now support the +* The :mod:`socket` module's :class:`~ssl.SSL` objects now support the buffer API, which fixed a test suite failure. (Fixed by Antoine Pitrou; :issue:`7133`.) - The :func:`create_connection` function + The :func:`~socket.create_connection` function gained a *source_address* parameter, a ``(host, port)`` 2-tuple giving the source address that will be used for the connection. (Contributed by Eldon Ziegler; :issue:`3972`.) - The :meth:`recv_into` and :meth:`recvfrom_into` methods will now write - into objects that support the buffer API, most usefully + The :meth:`~socket.socket.recv_into` and :meth:`~socket.socket.recvfrom_into` + methods will now write into objects that support the buffer API, most usefully the :class:`bytearray` and :class:`memoryview` objects. (Implemented by Antoine Pitrou; :issue:`8104`.) -* The :mod:`SocketServer` module's :class:`TCPServer` class now - has a :attr:`disable_nagle_algorithm` class attribute. +* The :mod:`SocketServer` module's :class:`~SocketServer.TCPServer` class now + has a :attr:`~SocketServer.TCPServer.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 +* Updated module: the :mod:`sqlite3` module has been updated to version 2.6.0 of the `pysqlite package `__. 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. + and then call :meth:`~sqlite3.Connection.load_extension` to load a particular shared library. (Updated by Gerhard Häring.) * The :mod:`struct` module will no longer silently ignore overflow @@ -879,9 +938,9 @@ changes, or look through the Subversion logs for all the details. :issue:`1523`.) * New function: the :mod:`subprocess` module's - :func:`check_output` runs a command with a specified set of arguments + :func:`~subprocess.check_output` runs a command with a specified set of arguments and returns the command's output as a string when the command runs without - error, or raises a :exc:`CalledProcessError` exception otherwise. + error, or raises a :exc:`~subprocess.CalledProcessError` exception otherwise. :: @@ -895,7 +954,11 @@ changes, or look through the Subversion logs for all the details. (Contributed by Gregory P. Smith.) -* New function: :func:`is_declared_global` in the :mod:`symtable` module + The :mod:`subprocess` module will now retry its internal system calls + on receiving an :const:`EINTR` signal. (Reported by several people; final + patch by Gregory P. Smith in :issue:`1068268`.) + +* New function: :func:`~symtable.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.) @@ -919,65 +982,61 @@ changes, or look through the Subversion logs for all the details. 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`, + :mod:`tarfile` now supports filtering the :class:`~tarfile.TarInfo` + objects being added to a tar file. When you call :meth:`~tarfile.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. + :class:`~tarfile.TarInfo` for every file being added, and can modify and return it. If the callable returns ``None``, the file will be excluded from the resulting archive. This is more powerful than the existing *exclude* argument, which has therefore been deprecated. (Added by Lars Gustäbel; :issue:`6856`.) - The :class:`TarFile` class also now supports the context manager protocol. + The :class:`~tarfile.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 +* The :meth:`~threading.Event.wait` method of the :class:`threading.Event` class + now returns the internal flag on exit. This means the method will usually + return true because :meth:`~threading.Event.wait` is supposed to block until the internal flag becomes true. The return value will only be false if a timeout was provided and the operation timed out. (Contributed by Tim Lesher; :issue:`1674032`.) -* The Unicode database has been updated to the version 5.2.0. - (Updated by Florent Xicluna; :issue:`8024`.) +* 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 Unicode database provided by the :mod:`unicodedata` is used - internally to determine which characters are numeric, whitespace, - or represent line breaks. The database also now includes information - from the :file:`Unihan.txt` data file. (Patch by Anders Chrigström - and Amaury Forgeot d'Arc; :issue:`1571184`.) - -* The :class:`UserDict` class is now a new-style class. (Changed by +* The :class:`~UserDict.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 ``) - or comment (which looks like ``). + instruction (which looks like ````) + or comment (which looks like ````). (Patch by Neil Muller; :issue:`2746`.) -* The :mod:`zipfile` module's :class:`ZipFile` now supports the context +* The :mod:`zipfile` module's :class:`~zipfile.ZipFile` now supports the context management protocol, so you can write ``with zipfile.ZipFile(...) as f: ...``. (Contributed by Brian Curtin; :issue:`5511`.) :mod:`zipfile` now 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. + :meth:`~zipfile.ZipFile.read` and :meth:`~zipfile.ZipFile.readline` now works correctly. (Contributed by Nir Aides; :issue:`7610`.) - The :func:`is_zipfile` function in the module now + The :func:`~zipfile.is_zipfile` function now accepts a file object, in addition to the path names accepted in earlier versions. (Contributed by Gabriel Genellina; :issue:`4756`.) - The :meth:`writestr` method now has an optional *compress_type* parameter + The :meth:`~zipfile.ZipFile.writestr` method now has an optional *compress_type* parameter that lets you override the default compression method specified in the - :class:`ZipFile` constructor. (Contributed by Ronald Oussoren; + :class:`~zipfile.ZipFile` constructor. (Contributed by Ronald Oussoren; :issue:`6003`.) -* XXX the :mod:`shutil` module has now a :func:`make_archive` function - (see the module doc, contributed by Tarek) - New module: sysconfig --------------------------------- @@ -1001,6 +1060,9 @@ XXX write this. 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. @@ -1054,111 +1116,135 @@ 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. +Test cases can raise the :exc:`~unittest.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` +The error messages for :meth:`~unittest.TestCase.assertEqual`, +:meth:`~unittest.TestCase.assertTrue`, and :meth:`~unittest.TestCase.assertFalse` failures now provide more information. If you set the -:attr:`longMessage` attribute of your :class:`TestCase` classes to -true, both the standard error message and any additional message you +:attr:`~unittest.TestCase.longMessage` attribute of your :class:`~unittest.TestCase` classes to +True, both the standard error message and any additional message you provide will be printed for failures. (Added by Michael Foord; :issue:`5663`.) -The :meth:`assertRaises` and :meth:`failUnlessRaises` methods now +The :meth:`~unittest.TestCase.assertRaises` method 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 + {}['foo'] (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` +.. rev 78774 + +Module- and class-level setup and teardown fixtures are now supported. +Modules can contain :func:`~unittest.setUpModule` and :func:`~unittest.tearDownModule` +functions. Classes can have :meth:`~unittest.TestCase.setUpClass` and +:meth:`~unittest.TestCase.tearDownClass` methods that must be defined as class methods +(using ``@classmethod`` or equivalent). These functions and +methods are invoked when the test runner switches to a test case in a +different module or class. + +The methods :meth:`~unittest.TestCase.addCleanup` and +:meth:`~unittest.TestCase.doCleanups` were added. +:meth:`~unittest.TestCase.addCleanup` allows you to add cleanup functions that +will be called unconditionally (after :meth:`~unittest.TestCase.setUp` if +:meth:`~unittest.TestCase.setUp` fails, otherwise after :meth:`~unittest.TestCase.tearDown`). This allows +for much simpler resource allocation and deallocation during tests +(:issue:`5679`). A number of new methods were added that provide more specialized tests. Many of these methods were written by Google engineers for use in their test suites; Gregory P. Smith, Michael Foord, and GvR worked on merging them into Python's version of :mod:`unittest`. -* :meth:`assertIsNone` and :meth:`assertIsNotNone` take one +* :meth:`~unittest.TestCase.assertIsNone` and :meth:`~unittest.TestCase.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. +* :meth:`~unittest.TestCase.assertIs` and :meth:`~unittest.TestCase.assertIsNot` + take two values and check whether the two values evaluate to the same object or not. (Added by Michael Foord; :issue:`2578`.) -* :meth:`assertIsInstance` and :meth:`assertNotIsInstance` check whether +* :meth:`~unittest.TestCase.assertIsInstance` and + :meth:`~unittest.TestCase.assertNotIsInstance` check whether the resulting object is an instance of a particular class, or of one of a tuple of classes. (Added by Georg Brandl; :issue:`7031`.) -* :meth:`assertGreater`, :meth:`assertGreaterEqual`, - :meth:`assertLess`, and :meth:`assertLessEqual` compare +* :meth:`~unittest.TestCase.assertGreater`, :meth:`~unittest.TestCase.assertGreaterEqual`, + :meth:`~unittest.TestCase.assertLess`, and :meth:`~unittest.TestCase.assertLessEqual` compare two quantities. -* :meth:`assertMultiLineEqual` compares two strings, and if they're +* :meth:`~unittest.TestCase.assertMultiLineEqual` compares two strings, and if they're not equal, displays a helpful comparison that highlights the differences in the two strings. This comparison is now used by - default when Unicode strings are compared with :meth:`assertEqual`.) + default when Unicode strings are compared with :meth:`~unittest.TestCase.assertEqual`. -* :meth:`assertRegexpMatches` checks whether its first argument is a +* :meth:`~unittest.TestCase.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 + .. XXX add assertNotRegexpMatches see issue 8038 + +* :meth:`~unittest.TestCase.assertRaisesRegexp` checks whether a particular exception is raised, and then also checks that the string representation of the exception matches the provided regular expression. -* :meth:`assertIn` and :meth:`assertNotIn` tests whether - *first* is or is not in *second*. +* :meth:`~unittest.TestCase.assertIn` and :meth:`~unittest.TestCase.assertNotIn` + tests whether *first* is or is not in *second*. -* :meth:`assertItemsEqual` tests whether two provided sequences +* :meth:`~unittest.TestCase.assertItemsEqual` tests whether two provided sequences contain the same elements. -* :meth:`assertSetEqual` compares whether two sets are equal, and +* :meth:`~unittest.TestCase.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` +* Similarly, :meth:`~unittest.TestCase.assertListEqual` and :meth:`~unittest.TestCase.assertTupleEqual` compare the specified types and explain any differences without necessarily printing their full values; these methods are now used by default - when comparing lists and tuples using :meth:`assertEqual`. - More generally, :meth:`assertSequenceEqual` compares two sequences + when comparing lists and tuples using :meth:`~unittest.TestCase.assertEqual`. + More generally, :meth:`~unittest.TestCase.assertSequenceEqual` compares two sequences and can optionally check whether both sequences are of a particular type. -* :meth:`assertDictEqual` compares two dictionaries and reports the +* :meth:`~unittest.TestCase.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 + using :meth:`~unittest.TestCase.assertEqual`. :meth:`~unittest.TestCase.assertDictContainsSubset` checks whether all of the key/value pairs in *first* are found in *second*. -* :meth:`assertAlmostEqual` and :meth:`assertNotAlmostEqual` test +* :meth:`~unittest.TestCase.assertAlmostEqual` and :meth:`~unittest.TestCase.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`.) +* :meth:`~unittest.TestLoader.loadTestsFromName` properly honors the + :attr:`~unittest.TestLoader.suiteClass` attribute of + the :class:`~unittest.TestLoader`. (Fixed by Mark Roddy; :issue:`6866`.) -* A new hook, :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. +* A new hook lets you extend the :meth:`~unittest.TestCase.assertEqual` method to handle + new data types. The :meth:`~unittest.TestCase.addTypeEqualityFunc` method takes a type + object and a function. The function will be used when both of the + objects being compared are of the specified type. This function + should compare the two objects and raise an exception if they don't + match; it's a good idea for the function to provide additional + information about why the two objects 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`. +:func:`unittest.main` now takes an optional ``exit`` argument. If +False, :func:`~unittest.main` doesn't call :func:`sys.exit`, allowing it to be +used from the interactive interpreter. (Contributed by J. Pablo +Fernández; :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. +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`.) + +.. XXX document the other new switches + +:class:`~unittest.TestResult` has new :meth:`~unittest.TestResult.startTestRun` and +:meth:`~unittest.TestResult.stopTestRun` methods that are called immediately before +and after a test run. (Contributed by Robert Collins; :issue:`5728`.) With all these changes, the :file:`unittest.py` was becoming awkwardly large, so the module was turned into a package and the code split into @@ -1177,7 +1263,7 @@ of the logic underlying Python's :keyword:`import` statement. 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`. +a single function, :func:`~importlib.import_module`. ``import_module(name, package=None)`` imports a module. *name* is a string containing the module or package's name. It's possible to do @@ -1185,7 +1271,7 @@ 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 +the relative import. :func:`~importlib.import_module` both inserts the imported module into ``sys.modules`` and returns the module object. Here are some examples::