whatsnew/3.5: Add some examples

Patch by Elvis Pranskevichus
This commit is contained in:
Yury Selivanov 2015-09-12 23:46:39 -04:00
parent f07422c025
commit 239503773d
1 changed files with 177 additions and 21 deletions

View File

@ -358,7 +358,7 @@ unpackings::
PEP 461 - % formatting support for bytes and bytearray PEP 461 - % formatting support for bytes and bytearray
------------------------------------------------------ ------------------------------------------------------
PEP 461 adds support for ``%`` :pep:`461` adds support for ``%``
:ref:`interpolation operator <bytes-formatting>` to :class:`bytes` :ref:`interpolation operator <bytes-formatting>` to :class:`bytes`
and :class:`bytearray`. and :class:`bytearray`.
@ -447,15 +447,24 @@ PEP 471 - os.scandir() function -- a better and faster directory iterator
:pep:`471` adds a new directory iteration function, :func:`os.scandir`, :pep:`471` adds a new directory iteration function, :func:`os.scandir`,
to the standard library. Additionally, :func:`os.walk` is now to the standard library. Additionally, :func:`os.walk` is now
implemented using ``os.scandir()``, which makes it 3 to 5 times faster implemented using ``scandir``, which makes it 3 to 5 times faster
on POSIX systems and 7 to 20 times faster on Windows systems. This is on POSIX systems and 7 to 20 times faster on Windows systems. This is
largely achieved by greatly reducing the number of calls to :func:`os.stat` largely achieved by greatly reducing the number of calls to :func:`os.stat`
required to walk a directory tree. required to walk a directory tree.
Additionally, ``os.scandir()`` returns an iterator, as opposed to returning Additionally, ``scandir`` returns an iterator, as opposed to returning
a list of file names, which improves memory efficiency when iterating a list of file names, which improves memory efficiency when iterating
over very large directories. over very large directories.
The following example shows a simple use of :func:`os.scandir` to display all
the files (excluding directories) in the given *path* that don't start with
``'.'``. The :meth:`entry.is_file <os.DirEntry.is_file>` call will generally
not make an additional system call::
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
.. seealso:: .. seealso::
:pep:`471` -- os.scandir() function -- a better and faster directory iterator :pep:`471` -- os.scandir() function -- a better and faster directory iterator
@ -641,6 +650,27 @@ PEP 485: A function for testing approximate equality
functions which tell whether two values are approximately equal or functions which tell whether two values are approximately equal or
"close" to each other. Whether or not two values are considered "close" to each other. Whether or not two values are considered
close is determined according to given absolute and relative tolerances. close is determined according to given absolute and relative tolerances.
Relative tolerance is the maximum allowed difference between ``isclose()``
arguments, relative to the larger absolute value::
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
It is also possible to compare two values using absolute tolerance, which
must be a non-negative value::
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False
.. seealso:: .. seealso::
@ -678,6 +708,13 @@ Some smaller changes made to the core Python language are:
New Modules New Modules
=========== ===========
typing
------
The new :mod:`typing` :term:`provisional <provisional api>` module
provides standard definitions and tools for function type annotations.
See :ref:`Type Hints <whatsnew-pep-484>` for more information.
.. _whatsnew-zipapp: .. _whatsnew-zipapp:
zipapp zipapp
@ -854,8 +891,25 @@ configparser
------------ ------------
Config parsers can be customized by providing a dictionary of converters in the Config parsers can be customized by providing a dictionary of converters in the
constructor. All converters defined in config parser (either by subclassing or constructor, or All converters defined in config parser (either by subclassing or
by providing in a constructor) will be available on all section proxies. by providing in a constructor) will be available on all section proxies.
Example::
>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
(Contributed by Łukasz Langa in :issue:`18159`.) (Contributed by Łukasz Langa in :issue:`18159`.)
@ -865,8 +919,17 @@ contextlib
The new :func:`~contextlib.redirect_stderr` context manager (similar to The new :func:`~contextlib.redirect_stderr` context manager (similar to
:func:`~contextlib.redirect_stdout`) makes it easier for utility scripts to :func:`~contextlib.redirect_stdout`) makes it easier for utility scripts to
handle inflexible APIs that write their output to :data:`sys.stderr` and handle inflexible APIs that write their output to :data:`sys.stderr` and
don't provide any options to redirect it. (Contributed by Berker Peksag in don't provide any options to redirect it::
:issue:`22389`.)
>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
... logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'
(Contributed by Berker Peksag in :issue:`22389`.)
curses curses
@ -1001,9 +1064,19 @@ heapq
----- -----
Element comparison in :func:`~heapq.merge` can now be customized by Element comparison in :func:`~heapq.merge` can now be customized by
passing a :term:`key function` in a new optional *key* keyword argument. passing a :term:`key function` in a new optional *key* keyword argument,
A new optional *reverse* keyword argument can be used to reverse element and a new optional *reverse* keyword argument can be used to reverse element
comparison. (Contributed by Raymond Hettinger in :issue:`13742`.) comparison::
>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']
(Contributed by Raymond Hettinger in :issue:`13742`.)
http http
@ -1022,7 +1095,17 @@ now raises a :exc:`~http.client.RemoteDisconnected` exception when a
remote server connection is closed unexpectedly. Additionally, if a remote server connection is closed unexpectedly. Additionally, if a
:exc:`ConnectionError` (of which ``RemoteDisconnected`` :exc:`ConnectionError` (of which ``RemoteDisconnected``
is a subclass) is raised, the client socket is now closed automatically, is a subclass) is raised, the client socket is now closed automatically,
and will reconnect on the next request. and will reconnect on the next request::
import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
try:
conn.request('GET', '/')
resp = conn.getresponse()
except http.client.RemoteDisconnected:
pass
(Contributed by Martin Panter in :issue:`3566`.) (Contributed by Martin Panter in :issue:`3566`.)
@ -1095,7 +1178,14 @@ and :issue:`20334`.)
A new A new
:meth:`BoundArguments.apply_defaults <inspect.BoundArguments.apply_defaults>` :meth:`BoundArguments.apply_defaults <inspect.BoundArguments.apply_defaults>`
method provides a way to set default values for missing arguments. method provides a way to set default values for missing arguments::
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
(Contributed by Yury Selivanov in :issue:`24190`.) (Contributed by Yury Selivanov in :issue:`24190`.)
A new class method A new class method
@ -1137,12 +1227,28 @@ ipaddress
Both :class:`~ipaddress.IPv4Network` and :class:`~ipaddress.IPv6Network` classes Both :class:`~ipaddress.IPv4Network` and :class:`~ipaddress.IPv6Network` classes
now accept an ``(address, netmask)`` tuple argument, so as to easily construct now accept an ``(address, netmask)`` tuple argument, so as to easily construct
network objects from existing addresses. (Contributed by Peter Moody network objects from existing addresses::
and Antoine Pitrou in :issue:`16531`.)
>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')
(Contributed by Peter Moody and Antoine Pitrou in :issue:`16531`.)
A new :attr:`~ipaddress.IPv4Network.reverse_pointer>` attribute for A new :attr:`~ipaddress.IPv4Network.reverse_pointer>` attribute for
:class:`~ipaddress.IPv4Network` and :class:`~ipaddress.IPv6Network` classes :class:`~ipaddress.IPv4Network` and :class:`~ipaddress.IPv6Network` classes
returns the name of the reverse DNS PTR record. returns the name of the reverse DNS PTR record::
>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
(Contributed by Leon Weber in :issue:`20480`.) (Contributed by Leon Weber in :issue:`20480`.)
@ -1173,7 +1279,18 @@ locale
------ ------
A new :func:`~locale.delocalize` function can be used to convert a string into A new :func:`~locale.delocalize` function can be used to convert a string into
a normalized number string, taking the ``LC_NUMERIC`` settings into account. a normalized number string, taking the ``LC_NUMERIC`` settings into account::
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'
(Contributed by Cédric Krier in :issue:`13918`.) (Contributed by Cédric Krier in :issue:`13918`.)
@ -1223,9 +1340,9 @@ Storchaka in :issue:`22486`.)
multiprocessing multiprocessing
--------------- ---------------
:func:`~multiprocessing.synchronized` objects now support the :func:`sharedctypes.synchronized <multiprocessing.sharedctypes.synchronized>`
:term:`context manager` protocol. (Contributed by Charles-François Natali in objects now support the :term:`context manager` protocol.
:issue:`21565`.) (Contributed by Charles-François Natali in :issue:`21565`.)
operator operator
@ -1271,7 +1388,15 @@ on Windows. (Contributed by Steve Dower in :issue:`23668`.)
There is a new :func:`os.path.commonpath` function returning the longest There is a new :func:`os.path.commonpath` function returning the longest
common sub-path of each passed pathname. Unlike the common sub-path of each passed pathname. Unlike the
:func:`os.path.commonprefix` function, it always returns a valid :func:`os.path.commonprefix` function, it always returns a valid
path. (Contributed by Rafik Draoui and Serhiy Storchaka in :issue:`10395`.) path::
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
(Contributed by Rafik Draoui and Serhiy Storchaka in :issue:`10395`.)
pathlib pathlib
@ -1324,7 +1449,15 @@ re
-- --
References and conditional references to groups with fixed length are now References and conditional references to groups with fixed length are now
allowed in lookbehind assertions. allowed in lookbehind assertions::
>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>
(Contributed by Serhiy Storchaka in :issue:`9179`.) (Contributed by Serhiy Storchaka in :issue:`9179`.)
The number of capturing groups in regular expression is no longer limited by The number of capturing groups in regular expression is no longer limited by
@ -1338,7 +1471,16 @@ The :class:`re.error` exceptions have new attributes:
:attr:`~re.error.msg`, :attr:`~re.error.pattern`, :attr:`~re.error.msg`, :attr:`~re.error.pattern`,
:attr:`~re.error.pos`, :attr:`~re.error.lineno`, :attr:`~re.error.pos`, :attr:`~re.error.lineno`,
and :attr:`~re.error.colno` that provide better context and :attr:`~re.error.colno` that provide better context
information about the error. information about the error::
>>> re.compile("""
... (?x)
... .++
... """)
Traceback (most recent call last):
...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
(Contributed by Serhiy Storchaka in :issue:`22578`.) (Contributed by Serhiy Storchaka in :issue:`22578`.)
@ -1568,6 +1710,20 @@ to invoking subprocesses in Python code that does not need to maintain
compatibility with earlier Python versions. compatibility with earlier Python versions.
(Contributed by Thomas Kluyver in :issue:`23342`.) (Contributed by Thomas Kluyver in :issue:`23342`.)
Examples::
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
sys sys
--- ---