****************************
  What's New In Python 3.7
****************************

:Editor: Elvis Pranskevichus <elvis@magic.io>

.. Rules for maintenance:

   * Anyone can add text to this document.  Do not spend very much time
   on the wording of your changes, because your text will probably
   get rewritten to some degree.

   * The maintainer will go through Misc/NEWS periodically and add
   changes; it's therefore more important to add your changes to
   Misc/NEWS than to this file.

   * This is not a complete list of every single change; completeness
   is the purpose of Misc/NEWS.  Some changes I consider too small
   or esoteric to include.  If such a change is added to the text,
   I'll just remove it.  (This is another reason you shouldn't spend
   too much time on writing your addition.)

   * If you want to draw your new text to the attention of the
   maintainer, add 'XXX' to the beginning of the paragraph or
   section.

   * It's OK to just add a fragmentary note about a change.  For
   example: "XXX Describe the transmogrify() function added to the
   socket module."  The maintainer will research the change and
   write the necessary text.

   * You can comment out your additions if you like, but it's not
   necessary (especially when a final release is some months away).

   * Credit the author of a patch or bugfix.   Just the name is
   sufficient; the e-mail address isn't necessary.

   * It's helpful to add the bug/patch number as a comment:

   XXX Describe the transmogrify() function added to the socket
   module.
   (Contributed by P.Y. Developer in :issue:`12345`.)

   This saves the maintainer the effort of going through the Git log
   when researching a change.

This article explains the new features in Python 3.7, compared to 3.6.
Python 3.7 was released on June 27, 2018.
For full details, see the :ref:`changelog <changelog>`.


Summary -- Release Highlights
=============================

.. This section singles out the most important changes in Python 3.7.
   Brevity is key.

New syntax features:

* :ref:`PEP 563 <whatsnew37-pep563>`, postponed evaluation of type annotations.

Backwards incompatible syntax changes:

* :keyword:`async` and :keyword:`await` are now reserved keywords.

New library modules:

* :mod:`contextvars`: :ref:`PEP 567 -- Context Variables <whatsnew37-pep567>`
* :mod:`dataclasses`: :ref:`PEP 557 -- Data Classes <whatsnew37-pep557>`
* :ref:`whatsnew37_importlib_resources`

New built-in features:

* :ref:`PEP 553 <whatsnew37-pep553>`, the new :func:`breakpoint` function.

Python data model improvements:

* :ref:`PEP 562 <whatsnew37-pep562>`, customization of access to
  module attributes.

* :ref:`PEP 560 <whatsnew37-pep560>`, core support for typing module and
  generic types.

* the insertion-order preservation nature of :ref:`dict <typesmapping>`
  objects `has been declared`_ to be an official
  part of the Python language spec.

.. _has been declared: https://mail.python.org/pipermail/python-dev/2017-December/151283.html

Significant improvements in the standard library:

* The :mod:`asyncio` module has received new features, significant
  :ref:`usability and performance improvements <whatsnew37_asyncio>`.

* The :mod:`time` module gained support for
  :ref:`functions with nanosecond resolution <whatsnew37-pep564>`.

CPython implementation improvements:

* Avoiding the use of ASCII as a default text encoding:

  * :ref:`PEP 538 <whatsnew37-pep538>`, legacy C locale coercion
  * :ref:`PEP 540 <whatsnew37-pep540>`, forced UTF-8 runtime mode
* :ref:`PEP 552 <whatsnew37-pep552>`, deterministic .pycs
* :ref:`the new development runtime mode <whatsnew37-devmode>`
* :ref:`PEP 565 <whatsnew37-pep565>`, improved :exc:`DeprecationWarning`
  handling

C API improvements:

* :ref:`PEP 539 <whatsnew37-pep539>`, new C API for thread-local storage

Documentation improvements:

* :ref:`PEP 545 <whatsnew37-pep545>`, Python documentation translations
* New documentation translations: `Japanese <https://docs.python.org/ja/>`_,
  `French <https://docs.python.org/fr/>`_, and
  `Korean <https://docs.python.org/ko/>`_.

This release features notable performance improvements in many areas.
The :ref:`whatsnew37-perf` section lists them in detail.

For a list of changes that may affect compatibility with previous Python
releases please refer to the :ref:`porting-to-python-37` section.


New Features
============

.. _whatsnew37-pep563:

PEP 563: Postponed Evaluation of Annotations
--------------------------------------------

The advent of type hints in Python uncovered two glaring usability issues
with the functionality of annotations added in :pep:`3107` and refined
further in :pep:`526`:

* annotations could only use names which were already available in the
  current scope, in other words they didn't support forward references
  of any kind; and

* annotating source code had adverse effects on startup time of Python
  programs.

Both of these issues are fixed by postponing the evaluation of
annotations.  Instead of compiling code which executes expressions in
annotations at their definition time, the compiler stores the annotation
in a string form equivalent to the AST of the expression in question.
If needed, annotations can be resolved at runtime using
:func:`typing.get_type_hints`.  In the common case where this is not
required, the annotations are cheaper to store (since short strings
are interned by the interpreter) and make startup time faster.

Usability-wise, annotations now support forward references, making the
following syntax valid::

    class C:
        @classmethod
        def from_string(cls, source: str) -> C:
            ...

        def validate_b(self, obj: B) -> bool:
            ...

    class B:
        ...

Since this change breaks compatibility, the new behavior needs to be enabled
on a per-module basis in Python 3.7 using a :mod:`__future__` import::

    from __future__ import annotations

It will become the default in Python 4.0.

.. seealso::

    :pep:`563` -- Postponed evaluation of annotations
       PEP written and implemented by Łukasz Langa.


.. _whatsnew37-pep538:

PEP 538: Legacy C Locale Coercion
---------------------------------

An ongoing challenge within the Python 3 series has been determining a sensible
default strategy for handling the "7-bit ASCII" text encoding assumption
currently implied by the use of the default C or POSIX locale on non-Windows
platforms.

:pep:`538` updates the default interpreter command line interface to
automatically coerce that locale to an available UTF-8 based locale as
described in the documentation of the new :envvar:`PYTHONCOERCECLOCALE`
environment variable. Automatically setting ``LC_CTYPE`` this way means that
both the core interpreter and locale-aware C extensions (such as
:mod:`readline`) will assume the use of UTF-8 as the default text encoding,
rather than ASCII.

The platform support definition in :pep:`11` has also been updated to limit
full text handling support to suitably configured non-ASCII based locales.

As part of this change, the default error handler for :data:`~sys.stdin` and
:data:`~sys.stdout` is now ``surrogateescape`` (rather than ``strict``) when
using any of the defined coercion target locales (currently ``C.UTF-8``,
``C.utf8``, and ``UTF-8``).  The default error handler for :data:`~sys.stderr`
continues to be ``backslashreplace``, regardless of locale.

Locale coercion is silent by default, but to assist in debugging potentially
locale related integration problems, explicit warnings (emitted directly on
:data:`~sys.stderr`) can be requested by setting ``PYTHONCOERCECLOCALE=warn``.
This setting will also cause the Python runtime to emit a warning if the
legacy C locale remains active when the core interpreter is initialized.

While :pep:`538`'s locale coercion has the benefit of also affecting extension
modules (such as GNU ``readline``), as well as child processes (including those
running non-Python applications and older versions of Python), it has the
downside of requiring that a suitable target locale be present on the running
system. To better handle the case where no suitable target locale is available
(as occurs on RHEL/CentOS 7, for example), Python 3.7 also implements
:ref:`whatsnew37-pep540`.

.. seealso::

    :pep:`538` -- Coercing the legacy C locale to a UTF-8 based locale
       PEP written and implemented by Nick Coghlan.


.. _whatsnew37-pep540:

PEP 540: Forced UTF-8 Runtime Mode
-----------------------------------

The new :option:`-X` ``utf8`` command line option and :envvar:`PYTHONUTF8`
environment variable can be used to enable the CPython *UTF-8 mode*.

When in UTF-8 mode, CPython ignores the locale settings, and uses the
UTF-8 encoding by default.  The error handlers for :data:`sys.stdin` and
:data:`sys.stdout` streams are set to ``surrogateescape``.

The forced UTF-8 mode can be used to change the text handling behavior in
an embedded Python interpreter without changing the locale settings of
an embedding application.

While :pep:`540`'s UTF-8 mode has the benefit of working regardless of which
locales are available on the running system, it has the downside of having no
effect on extension modules (such as GNU ``readline``), child processes running
non-Python applications, and child processes running older versions of Python.
To reduce the risk of corrupting text data when communicating with such
components, Python 3.7 also implements :ref:`whatsnew37-pep540`).

The UTF-8 mode is enabled by default when the locale is ``C`` or ``POSIX``, and
the :pep:`538` locale coercion feature fails to change it to a UTF-8 based
alternative (whether that failure is due to ``PYTHONCOERCECLOCALE=0`` being set,
``LC_ALL`` being set, or the lack of a suitable target locale).

.. seealso::

    :pep:`540` -- Add a new UTF-8 mode
       PEP written and implemented by Victor Stinner


.. _whatsnew37-pep553:

PEP 553: Built-in ``breakpoint()``
----------------------------------

Python 3.7 includes the new built-in :func:`breakpoint` function as
an easy and consistent way to enter the Python debugger.

Built-in ``breakpoint()`` calls :func:`sys.breakpointhook`.  By default, the
latter imports :mod:`pdb` and then calls ``pdb.set_trace()``, but by binding
``sys.breakpointhook()`` to the function of your choosing, ``breakpoint()`` can
enter any debugger. Additionally, the environment variable
:envvar:`PYTHONBREAKPOINT` can be set to the callable of your debugger of
choice.  Set ``PYTHONBREAKPOINT=0`` to completely disable built-in
``breakpoint()``.

.. seealso::

    :pep:`553` -- Built-in breakpoint()
      PEP written and implemented by Barry Warsaw


.. _whatsnew37-pep539:

PEP 539: New C API for Thread-Local Storage
-------------------------------------------

While Python provides a C API for thread-local storage support; the existing
:ref:`Thread Local Storage (TLS) API <thread-local-storage-api>` has used
:c:type:`int` to represent TLS keys across all platforms.  This has not
generally been a problem for officially-support platforms, but that is neither
POSIX-compliant, nor portable in any practical sense.

:pep:`539` changes this by providing a new :ref:`Thread Specific Storage (TSS)
API <thread-specific-storage-api>` to CPython which supersedes use of the
existing TLS API within the CPython interpreter, while deprecating the existing
API.  The TSS API uses a new type :c:type:`Py_tss_t` instead of :c:type:`int`
to represent TSS keys--an opaque type the definition of which may depend on
the underlying TLS implementation.  Therefore, this will allow to build CPython
on platforms where the native TLS key is defined in a way that cannot be safely
cast to :c:type:`int`.

Note that on platforms where the native TLS key is defined in a way that cannot
be safely cast to :c:type:`int`, all functions of the existing TLS API will be
no-op and immediately return failure. This indicates clearly that the old API
is not supported on platforms where it cannot be used reliably, and that no
effort will be made to add such support.

.. seealso::

    :pep:`539` -- A New C-API for Thread-Local Storage in CPython
       PEP written by Erik M. Bray; implementation by Masayuki Yamamoto.


.. _whatsnew37-pep562:

PEP 562: Customization of Access to Module Attributes
-----------------------------------------------------

Python 3.7 allows defining :meth:`__getattr__` on modules and will call
it whenever a module attribute is otherwise not found.

A typical example of where this may be useful is module attribute deprecation
and lazy loading.

.. seealso::

    :pep:`562` -- Module ``__getattr__`` and ``__dir__``
       PEP written and implemented by Ivan Levkivskyi


.. _whatsnew37-pep564:

PEP 564: New Time Functions With Nanosecond Resolution
------------------------------------------------------

:pep:`564` adds six new "nanosecond" variants of existing functions
to the :mod:`time` module:

* :func:`time.clock_gettime_ns`
* :func:`time.clock_settime_ns`
* :func:`time.monotonic_ns`
* :func:`time.perf_counter_ns`
* :func:`time.process_time_ns`
* :func:`time.time_ns`

The new functions are similar in function to the existing functions
without the ``_ns`` suffix.  They differ by returning nanoseconds as
integers instead of fractional seconds.

On Linux and Windows the resolution of :func:`time.time_ns` is 3 times
better than that of :func:`time.time`.

.. seealso::

    :pep:`564` -- Add new time functions with nanosecond resolution
       PEP written and implemented by Victor Stinner


.. _whatsnew37-pep565:

PEP 565: Show DeprecationWarning in ``__main__``
------------------------------------------------

The default handling of :exc:`DeprecationWarning` has been changed such that
these warnings are once more shown by default, but only when the code
triggering them is running directly in the :mod:`__main__` module.  As a result,
developers of single file scripts and those using Python interactively should
once again start seeing deprecation warnings for the APIs they use, but
deprecation warnings triggered by imported application, library and framework
modules will continue to be hidden by default.

As a result of this change, the standard library now allows developers to choose
between three different deprecation warning behaviours:

* :exc:`FutureWarning`: always displayed by default, recommended for warnings
  intended to be seen by application end users (e.g. for deprecated application
  configuration settings).
* :exc:`DeprecationWarning`: displayed by default only in :mod:`__main__` and when
  running tests, recommended for warnings intended to be seen by other Python
  developers where a version upgrade may result in changed behaviour or an
  error.
* :exc:`PendingDeprecationWarning`: displayed by default only when running
  tests, intended for cases where a future version upgrade will change the
  warning category to :exc:`DeprecationWarning` or :exc:`FutureWarning`.

Previously both :exc:`DeprecationWarning` and :exc:`PendingDeprecationWarning`
were only visible when running tests, which meant that developers primarily
writing single file scripts or using Python interactively could be surprised
by breaking changes in the APIs they used.

.. seealso::

    :pep:`565` -- Show DeprecationWarning in ``__main__``
      PEP written and implemented by Nick Coghlan


.. _whatsnew37-pep560:

PEP 560: Core Support for ``typing`` module and Generic Types
-------------------------------------------------------------

Initially :pep:`484` was designed in such way that it would not introduce *any*
changes to the core CPython interpreter. Now type hints and the :mod:`typing`
module are extensively used by the community, so this restriction is removed.
The PEP introduces two special methods :meth:`__class_getitem__` and
``__mro_entries__``, these methods are now used by most classes and special
constructs in :mod:`typing`. As a result, the speed of various operations
with types increased up to 7 times, the generic types can be used without
metaclass conflicts, and several long standing bugs in :mod:`typing` module are
fixed.

.. seealso::

   :pep:`560` -- Core support for typing module and generic types
      PEP written and implemented by Ivan Levkivskyi


.. _whatsnew37-devmode:

Development Runtime Mode: -X dev
--------------------------------

The new :option:`-X` ``dev`` command line option or the new
:envvar:`PYTHONDEVMODE` environment variable can be used to enable
CPython's *development mode*.  When in development mode, CPython performs
additional runtime checks which are too expensive to be enabled by default.
See :option:`-X` ``dev`` documentation for the full description of the effects
of this mode.


.. _whatsnew37-pep552:

PEP 552: Hash-based .pyc Files
------------------------------

Python has traditionally checked the up-to-dateness of bytecode cache files
(i.e., ``.pyc`` files) by comparing the source metadata (last-modified timestamp
and size) with source metadata saved in the cache file header when it was
generated. While effective, this invalidation method has its drawbacks.  When
filesystem timestamps are too coarse, Python can miss source updates, leading to
user confusion. Additionally, having a timestamp in the cache file is
problematic for `build reproduciblity <https://reproducible-builds.org/>`_ and
content-based build systems.

:pep:`552` extends the pyc format to allow the hash of the source file to be
used for invalidation instead of the source timestamp. Such ``.pyc`` files are
called "hash-based". By default, Python still uses timestamp-based invalidation
and does not generate hash-based ``.pyc`` files at runtime. Hash-based ``.pyc``
files may be generated with :mod:`py_compile` or :mod:`compileall`.

Hash-based ``.pyc`` files come in two variants: checked and unchecked. Python
validates checked hash-based ``.pyc`` files against the corresponding source
files at runtime but doesn't do so for unchecked hash-based pycs. Unchecked
hash-based ``.pyc`` files are a useful performance optimization for environments
where a system external to Python (e.g., the build system) is responsible for
keeping ``.pyc`` files up-to-date.

See :ref:`pyc-invalidation` for more information.


.. _whatsnew37-pep545:

PEP 545: Python Documentation Translations
------------------------------------------

:pep:`545` describes the process of creating and maintaining Python
documentation translations.

Three new translations have been added:

- Japanese: https://docs.python.org/ja/
- French: https://docs.python.org/fr/
- Korean: https://docs.python.org/ko/

.. seealso::

   :pep:`545` -- Python Documentation Translations
      PEP written and implemented by Julien Palard, Inada Naoki, and
      Victor Stinner.


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

* More than 255 arguments can now be passed to a function, and a function can
  now have more than 255 parameters. (Contributed by Serhiy Storchaka in
  :issue:`12844` and :issue:`18896`.)

* :meth:`bytes.fromhex` and :meth:`bytearray.fromhex` now ignore all ASCII
  whitespace, not only spaces. (Contributed by Robert Xiao in :issue:`28927`.)

* :class:`str`, :class:`bytes`, and :class:`bytearray` gained support for
  the new :meth:`isascii() <str.isascii>` method, which can be used to
  test if a string or bytes contain only the ASCII characters.
  (Contributed by INADA Naoki in :issue:`32677`.)

* :exc:`ImportError` now displays module name and module ``__file__`` path when
  ``from ... import ...`` fails. (Contributed by Matthias Bussonnier in
  :issue:`29546`.)

* Circular imports involving absolute imports with binding a submodule to
  a name are now supported.
  (Contributed by Serhiy Storchaka in :issue:`30024`.)

* ``object.__format__(x, '')`` is now equivalent to ``str(x)`` rather than
  ``format(str(self), '')``.
  (Contributed by Serhiy Storchaka in :issue:`28974`.)

* In order to better support dynamic creation of stack traces,
  :class:`types.TracebackType` can now be instantiated from Python code, and
  the ``tb_next`` attribute on :ref:`tracebacks <traceback-objects>` is now
  writable.
  (Contributed by Nathaniel J. Smith in :issue:`30579`.)

* When using the :option:`-m` switch, ``sys.path[0]`` is now eagerly expanded
  to the full starting directory path, rather than being left as the empty
  directory (which allows imports from the *current* working directory at the
  time when an import occurs)
  (Contributed by Nick Coghlan in :issue:`33053`.)

* The new :option:`-X` ``importtime`` option or the
  :envvar:`PYTHONPROFILEIMPORTTIME` environment variable can be used to show
  the timing of each module import.
  (Contributed by Victor Stinner in :issue:`31415`.)


New Modules
===========

.. _whatsnew37-pep567:

contextvars
-----------

The new :mod:`contextvars` module and a set of
:ref:`new C APIs <contextvarsobjects>` introduce
support for *context variables*.  Context variables are conceptually
similar to thread-local variables.  Unlike TLS, context variables
support asynchronous code correctly.

The :mod:`asyncio` and :mod:`decimal` modules have been updated to use
and support context variables out of the box.  Particularly the active
decimal context is now stored in a context variable, which allows
decimal operations to work with the correct context in asynchronous code.

.. seealso::

    :pep:`567` -- Context Variables
       PEP written and implemented by Yury Selivanov


.. _whatsnew37-pep557:

dataclasses
-----------

The new :func:`~dataclasses.dataclass` decorator provides a way to declare
*data classes*.  A data class describes its attributes using class variable
annotations.  Its constructor and other magic methods, such as
:meth:`~object.__repr__`, :meth:`~object.__eq__`, and
:meth:`~object.__hash__` are generated automatically.

Example::

    @dataclass
    class Point:
        x: float
        y: float
        z: float = 0.0

    p = Point(1.5, 2.5)
    print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"

.. seealso::

    :pep:`557` -- Data Classes
       PEP written and implemented by Eric V. Smith


.. _whatsnew37_importlib_resources:

importlib.resources
-------------------

The new :mod:`importlib.resources` module provides several new APIs and one
new ABC for access to, opening, and reading *resources* inside packages.
Resources are roughly similar to files inside packages, but they needn't
be actual files on the physical file system.  Module loaders can provide a
:meth:`get_resource_reader()` function which returns
a :class:`importlib.abc.ResourceReader` instance to support this
new API.  Built-in file path loaders and zip file loaders both support this.

Contributed by Barry Warsaw and Brett Cannon in :issue:`32248`.

.. seealso::

    `importlib_resources <http://importlib-resources.readthedocs.io/en/latest/>`_
    -- a PyPI backport for earlier Python versions.


Improved Modules
================


argparse
--------

The new :meth:`ArgumentParser.parse_intermixed_args()
<argparse.ArgumentParser.parse_intermixed_args>`
method allows intermixing options and positional arguments.
(Contributed by paul.j3 in :issue:`14191`.)


.. _whatsnew37_asyncio:

asyncio
-------

The :mod:`asyncio` module has received many new features, usability and
:ref:`performance improvements <whatsnew37-asyncio-perf>`.  Notable changes
include:

* The new :term:`provisional <provisional api>` :func:`asyncio.run` function can
  be used to run a coroutine from synchronous code by automatically creating and
  destroying the event loop.
  (Contributed by Yury Selivanov in :issue:`32314`.)

* asyncio gained support for :mod:`contextvars`.
  :meth:`loop.call_soon() <asyncio.AbstractEventLoop.call_soon>`,
  :meth:`loop.call_soon_threadsafe() <asyncio.AbstractEventLoop.call_soon_threadsafe>`,
  :meth:`loop.call_later() <asyncio.AbstractEventLoop.call_later>`,
  :meth:`loop.call_at() <asyncio.AbstractEventLoop.call_at>`, and
  :meth:`Future.add_done_callback() <asyncio.Future.add_done_callback>`
  have a new optional keyword-only *context* parameter.
  :class:`Tasks <asyncio.Task>` now track their context automatically.
  See :pep:`567` for more details.
  (Contributed by Yury Selivanov in :issue:`32436`.)

* The new :func:`asyncio.create_task` function has been added as a shortcut
  to ``asyncio.get_event_loop().create_task()``.
  (Contributed by Andrew Svetlov in :issue:`32311`.)

* The new :meth:`loop.start_tls() <asyncio.AbstractEventLoop.start_tls>`
  method can be used to upgrade an existing connection to TLS.
  (Contributed by Yury Selivanov in :issue:`23749`.)

* The new :meth:`loop.sock_recv_into() <asyncio.AbstractEventLoop.sock_recv_into>`
  method allows reading data from a socket directly into a provided buffer making
  it possible to reduce data copies.
  (Contributed by Antoine Pitrou in :issue:`31819`.)

* The new :func:`asyncio.current_task` function returns the currently running
  :class:`~asyncio.Task` instance, and the new :func:`asyncio.all_tasks`
  function returns a set of all existing ``Task`` instances in a given loop.
  The :meth:`Task.current_task() <asyncio.Task.current_task>` and
  :meth:`Task.all_tasks() <asyncio.Task.all_tasks>` methods have been deprecated.
  (Contributed by Andrew Svetlov in :issue:`32250`.)

* The new *provisional* :class:`~asyncio.BufferedProtocol` class allows
  implementing streaming protocols with manual control over the receive buffer.
  (Contributed by Yury Selivanov in :issue:`32251`.)

* The new :func:`asyncio.get_running_loop` function returns the currently
  running loop, and raises a :exc:`RuntimeError` if no loop is running.
  This is in contrast with :func:`asyncio.get_event_loop`, which will *create*
  a new event loop if none is running.
  (Contributed by Yury Selivanov in :issue:`32269`.)

* The new :meth:`StreamWriter.wait_closed() <asyncio.StreamWriter.wait_closed>`
  coroutine method allows waiting until the stream writer is closed.  The new
  :meth:`StreamWriter.is_closing() <asyncio.StreamWriter.is_closing>` method
  can be used to determine if the writer is closing.
  (Contributed by Andrew Svetlov in :issue:`32391`.)

* The new :meth:`loop.sock_sendfile() <asyncio.AbstractEventLoop.sock_sendfile>`
  coroutine method allows sending files using :mod:`os.sendfile` when possible.
  (Contributed by Andrew Svetlov in :issue:`32410`.)

* The new :meth:`Task.get_loop() <asyncio.Task.get_loop>` and
  :meth:`Future.get_loop() <asyncio.Future.get_loop>` methods
  return the instance of the loop on which a task or a future were created.
  :meth:`Server.get_loop() <asyncio.Server.get_loop>` allows doing the same for
  :class:`asyncio.Server` objects.
  (Contributed by Yury Selivanov in :issue:`32415` and
  Srinivas Reddy Thatiparthy in :issue:`32418`.)

* It is now possible to control how instances of :class:`asyncio.Server` begin
  serving.  Previously, the server would start serving immediately when created.
  The new *start_serving* keyword argument to
  :meth:`loop.create_server() <asyncio.AbstractEventLoop.create_server>` and
  :meth:`loop.create_unix_server() <asyncio.AbstractEventLoop.create_unix_server>`,
  as well as :meth:`Server.start_serving() <asyncio.Server.start_serving>`, and
  :meth:`Server.serve_forever() <asyncio.Server.serve_forever>`
  can be used to decouple server instantiation and serving.  The new
  :meth:`Server.is_serving() <asyncio.Server.is_serving>` method returns ``True``
  if the server is serving.  :class:`~asyncio.Server` objects are now
  asynchronous context managers::

      srv = await loop.create_server(...)

      async with srv:
          # some code

      # At this point, srv is closed and no longer accepts new connections.

  (Contributed by Yury Selivanov in :issue:`32662`.)

* Callback objects returned by
  :func:`loop.call_later() <asyncio.AbstractEventLoop.call_later>`
  gained the new :meth:`when() <asyncio.TimerHandle.when>` method which
  returns an absolute scheduled callback timestamp.
  (Contributed by Andrew Svetlov in :issue:`32741`.)

* The :meth:`loop.create_datagram_endpoint() \
  <asyncio.AbstractEventLoop.create_datagram_endpoint>` method
  gained support for Unix sockets.
  (Contributed by Quentin Dawans in :issue:`31245`.)

* The :func:`asyncio.open_connection`, :func:`asyncio.start_server` functions,
  :meth:`loop.create_connection() <asyncio.AbstractEventLoop.create_connection>`,
  :meth:`loop.create_server() <asyncio.AbstractEventLoop.create_server>`,
  :meth:`loop.create_accepted_socket() <asyncio.BaseEventLoop.connect_accepted_socket>`
  methods and their corresponding UNIX socket variants now accept the
  *ssl_handshake_timeout* keyword argument.
  (Contributed by Neil Aspinall in :issue:`29970`.)

* The new :meth:`Handle.cancelled() <asyncio.Handle.cancelled>` method returns
  ``True`` if the callback was cancelled.
  (Contributed by Marat Sharafutdinov in :issue:`31943`.)

* The asyncio source has been converted to use the
  :keyword:`async`/:keyword:`await` syntax.
  (Contributed by Andrew Svetlov in :issue:`32193`.)

* The new :meth:`ReadTransport.is_reading() <asyncio.ReadTransport.is_reading>`
  method can be used to determine the reading state of the transport.
  Additionally, calls to
  :meth:`ReadTransport.resume_reading() <asyncio.ReadTransport.resume_reading>`
  and :meth:`ReadTransport.pause_reading() <asyncio.ReadTransport.pause_reading>`
  are now idempotent.
  (Contributed by Yury Selivanov in :issue:`32356`.)

* Loop methods which accept socket paths now support passing
  :term:`path-like objects <path-like object>`.
  (Contributed by Yury Selivanov in :issue:`32066`.)

* In :mod:`asyncio` TCP sockets on Linux are now created with ``TCP_NODELAY``
  flag set by default.
  (Contributed by Yury Selivanov and Victor Stinner in :issue:`27456`.)

* Exceptions occurring in cancelled tasks are no longer logged.
  (Contributed by Yury Selivanov in :issue:`30508`.)

* New ``WindowsSelectorEventLoopPolicy`` and
  ``WindowsProactorEventLoopPolicy`` classes.
  (Contributed by Yury Selivanov in :issue:`33792`.)

Several ``asyncio`` APIs have been
:ref:`deprecated <whatsnew37-asyncio-deprecated>`.


binascii
--------

The :func:`~binascii.b2a_uu` function now accepts an optional *backtick*
keyword argument.  When it's true, zeros are represented by ``'`'``
instead of spaces.  (Contributed by Xiang Zhang in :issue:`30103`.)


calendar
--------

The :class:`~calendar.HTMLCalendar` class has new class attributes which ease
the customization of CSS classes in the produced HTML calendar.
(Contributed by Oz Tiram in :issue:`30095`.)


collections
-----------

``collections.namedtuple()`` now supports default values.
(Contributed by Raymond Hettinger in :issue:`32320`.)


compileall
----------

:func:`compileall.compile_dir` learned the new *invalidation_mode* parameter,
which can be used to enable
:ref:`hash-based .pyc invalidation <whatsnew37-pep552>`.  The invalidation
mode can also be specified on the command line using the new
``--invalidation-mode`` argument.
(Contributed by Benjamin Peterson in :issue:`31650`.)


concurrent.futures
------------------

:class:`ProcessPoolExecutor <concurrent.futures.ProcessPoolExecutor>` and
:class:`ThreadPoolExecutor <concurrent.futures.ThreadPoolExecutor>` now
support the new *initializer* and *initargs* constructor arguments.
(Contributed by Antoine Pitrou in :issue:`21423`.)

The :class:`ProcessPoolExecutor <concurrent.futures.ProcessPoolExecutor>`
can now take the multiprocessing context via the new *mp_context* argument.
(Contributed by Thomas Moreau in :issue:`31540`.)


contextlib
----------

The new :func:`~contextlib.nullcontext` is a simpler and faster no-op
context manager than :class:`~contextlib.ExitStack`.
(Contributed by Jesse-Bakker in :issue:`10049`.)

The new :func:`~contextlib.asynccontextmanager`,
:class:`~contextlib.AbstractAsyncContextManager`, and
:class:`~contextlib.AsyncExitStack` have been added to
complement their synchronous counterparts.  (Contributed
by Jelle Zijlstra in :issue:`29679` and :issue:`30241`,
and by Alexander Mohr and Ilya Kulakov in :issue:`29302`.)


cProfile
--------

The :mod:`cProfile` command line now accepts ``-m module_name`` as an
alternative to script path.  (Contributed by Sanyam Khurana in :issue:`21862`.)


crypt
-----

The :mod:`crypt` module now supports the Blowfish hashing method.
(Contributed by Serhiy Storchaka in :issue:`31664`.)

The :func:`~crypt.mksalt` function now allows specifying the number of rounds
for hashing.  (Contributed by Serhiy Storchaka in :issue:`31702`.)


datetime
--------

The new :meth:`datetime.fromisoformat() <datetime.datetime.fromisoformat>`
method constructs a :class:`~datetime.datetime` object from a string
in one of the formats output by
:meth:`datetime.isoformat() <datetime.datetime.isoformat>`.
(Contributed by Paul Ganssle in :issue:`15873`.)

The :class:`tzinfo <datetime.tzinfo>` class now supports sub-minute offsets.
(Contributed by Alexander Belopolsky in :issue:`5288`.)


dbm
---

:mod:`dbm.dumb` now supports reading read-only files and no longer writes the
index file when it is not changed.


decimal
-------

The :mod:`decimal` module now uses :ref:`context variables <whatsnew37-pep567>`
to store the decimal context.
(Contributed by Yury Selivanov in :issue:`32630`.)


dis
---

The :func:`~dis.dis` function is now able to
disassemble nested code objects (the code of comprehensions, generator
expressions and nested functions, and the code used for building nested
classes).  The maximum depth of disassembly recursion is controlled by
the new *depth* parameter.
(Contributed by Serhiy Storchaka in :issue:`11822`.)


distutils
---------

``README.rst`` is now included in the list of distutils standard READMEs and
therefore included in source distributions.
(Contributed by Ryan Gonzalez in :issue:`11913`.)


enum
----

The :class:`Enum <enum.Enum>` learned the new ``_ignore_`` class property,
which allows listing the names of properties which should not become
enum members.
(Contributed by Ethan Furman in :issue:`31801`.)

In Python 3.8, attempting to check for non-Enum objects in :class:`Enum`
classes will raise a :exc:`TypeError` (e.g. ``1 in Color``); similarly,
attempting to check for non-Flag objects in a :class:`Flag` member will
raise :exc:`TypeError` (e.g. ``1 in Perm.RW``); currently, both operations
return :const:`False` instead and are deprecated.
(Contributed by Ethan Furman in :issue:`33217`.)


functools
---------

:func:`functools.singledispatch` now supports registering implementations
using type annotations.
(Contributed by Łukasz Langa in :issue:`32227`.)


gc
--

The new :func:`gc.freeze` function allows freezing all objects tracked
by the garbage collector and excluding them from future collections.
This can be used before a POSIX ``fork()`` call to make the GC copy-on-write
friendly or to speed up collection.  The new :func:`gc.unfreeze` functions
reverses this operation.  Additionally, :func:`gc.get_freeze_count` can
be used to obtain the number of frozen objects.
(Contributed by Li Zekun in :issue:`31558`.)


hmac
----

The :mod:`hmac` module now has an optimized one-shot :func:`~hmac.digest`
function, which is up to three times faster than :func:`~hmac.HMAC`.
(Contributed by Christian Heimes in :issue:`32433`.)


http.client
-----------

:class:`~http.client.HTTPConnection` and :class:`~http.client.HTTPSConnection`
now support the new *blocksize* argument for improved upload throughput.
(Contributed by Nir Soffer in :issue:`31945`.)


http.server
-----------

:class:`~http.server.SimpleHTTPRequestHandler` now supports the HTTP
``If-Modified-Since`` header.  The server returns the 304 response status if
the target file was not modified after the time specified in the header.
(Contributed by Pierre Quentel in :issue:`29654`.)

:class:`~http.server.SimpleHTTPRequestHandler` accepts the new *directory*
argument, in addition to the new ``--directory`` command line argument.
With this parameter, the server serves the specified directory, by default it
uses the current working directory.
(Contributed by Stéphane Wirtel and Julien Palard in :issue:`28707`.)

The new :class:`ThreadingHTTPServer <http.server.ThreadingHTTPServer>` class
uses threads to handle requests using :class:`~socketserver.ThreadingMixin`.
It is used when ``http.server`` is run with ``-m``.
(Contributed by Julien Palard in :issue:`31639`.)


idlelib and IDLE
----------------

Multiple fixes for autocompletion. (Contributed by Louie Lu in :issue:`15786`.)

Module Browser (on the File menu, formerly called Class Browser),
now displays nested functions and classes in addition to top-level
functions and classes.
(Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy
in :issue:`1612262`.)

The Settings dialog (Options, Configure IDLE) has been partly rewritten
to improve both appearance and function.
(Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.)

The font sample now includes a selection of non-Latin characters so that
users can better see the effect of selecting a particular font.
(Contributed by Terry Jan Reedy in :issue:`13802`.)
The sample can be edited to include other characters.
(Contributed by Serhiy Storchaka in :issue:`31860`.)

The IDLE features formerly implemented as extensions have been reimplemented
as normal features.  Their settings have been moved from the Extensions tab
to other dialog tabs.
(Contributed by Charles Wohlganger and Terry Jan Reedy in :issue:`27099`.)

Editor code context option revised.  Box displays all context lines up to
maxlines.  Clicking on a context line jumps the editor to that line.  Context
colors for custom themes is added to Highlights tab of Settings dialog.
(Contributed by Cheryl Sabella and Terry Jan Reedy in :issue:`33642`,
:issue:`33768`, and :issue:`33679`,

On Windows, a new API call tells Windows that tk scales for DPI. On Windows
8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should
make text and lines sharper.  It should otherwise have no effect.
(Contributed by Terry Jan Reedy in :issue:`33656`).

The changes above have been backported to 3.6 maintenance releases.


importlib
---------

The :class:`importlib.abc.ResourceReader` ABC was introduced to
support the loading of resources from packages.  See also
:ref:`whatsnew37_importlib_resources`.
(Contributed by Barry Warsaw, Brett Cannon in :issue:`32248`.)

:func:`importlib.reload` now raises :exc:`ModuleNotFoundError` if the module
lacks a spec.
(Contributed by Garvit Khatri in :issue:`29851`.)

:func:`importlib.find_spec` now raises ``ModuleNotFoundError`` instead of
:exc:`AttributeError` if the specified parent module is not a package (i.e.
lacks a ``__path__`` attribute).
(Contributed by Milan Oberkirch in :issue:`30436`.)

The new :func:`importlib.source_hash` can be used to compute the hash of
the passed source.  A :ref:`hash-based .pyc file <whatsnew37-pep552>`
embeds the value returned by this function.


io
--

The new :meth:`TextIOWrapper.reconfigure() <io.TextIOWrapper.reconfigure>`
method can be used to reconfigure the text stream with the new settings.
(Contributed by Antoine Pitrou in :issue:`30526` and
INADA Naoki in :issue:`15216`.)


ipaddress
---------

The new ``subnet_of()`` and ``supernet_of()`` methods of
:class:`ipaddress.IPv6Network` and :class:`ipaddress.IPv4Network` can
be used for network containment tests.
(Contributed by Michel Albert and Cheryl Sabella in :issue:`20825`.)


itertools
---------

:func:`itertools.islice` now accepts
:meth:`integer-like objects <object.__index__>` as start, stop,
and slice arguments.
(Contributed by Will Roberts in :issue:`30537`.)


locale
------

The new *monetary* argument to :func:`locale.format_string` can be used
to make the conversion use monetary thousands separators and
grouping strings.  (Contributed by Garvit in :issue:`10379`.)

The :func:`locale.getpreferredencoding` function now always returns ``'UTF-8'``
on Android or when in the :ref:`forced UTF-8 mode <whatsnew37-pep540>`.


logging
-------

:class:`~logging.Logger` instances can now be pickled.
(Contributed by Vinay Sajip in :issue:`30520`.)

The new :meth:`StreamHandler.setStream() <logging.StreamHandler.setStream>`
method can be used to replace the logger stream after handler creation.
(Contributed by Vinay Sajip in :issue:`30522`.)

It is now possible to specify keyword arguments to handler constructors in
configuration passed to :func:`logging.config.fileConfig`.
(Contributed by Preston Landers in :issue:`31080`.)


math
----

The new :func:`math.remainder` function implements the IEEE 754-style remainder
operation.  (Contributed by Mark Dickinson in :issue:`29962`.)


mimetypes
---------

The MIME type of .bmp has been changed from ``'image/x-ms-bmp'`` to
``'image/bmp'``.
(Contributed by Nitish Chandra in :issue:`22589`.)


msilib
------

The new :meth:`Database.Close() <msilib.Database.Close>` method can be used
to close the :abbr:`MSI` database.
(Contributed by Berker Peksag in :issue:`20486`.)


multiprocessing
---------------

The new :meth:`Process.close() <multiprocessing.Process.close>` method
explicitly closes the process object and releases all resources associated
with it.  :exc:`ValueError` is raised if the underlying process is still
running.
(Contributed by Antoine Pitrou in :issue:`30596`.)

The new :meth:`Process.kill() <multiprocessing.Process.kill>` method can
be used to terminate the process using the :data:`SIGKILL` signal on Unix.
(Contributed by Vitor Pereira in :issue:`30794`.)

Non-daemonic threads created by :class:`~multiprocessing.Process` are now
joined on process exit.
(Contributed by Antoine Pitrou in :issue:`18966`.)


os
--

:func:`os.fwalk` now accepts the *path* argument as :class:`bytes`.
(Contributed by Serhiy Storchaka in :issue:`28682`.)

:func:`os.scandir` gained support for :ref:`file descriptors <path_fd>`.
(Contributed by Serhiy Storchaka in :issue:`25996`.)

The new :func:`~os.register_at_fork` function allows registering Python
callbacks to be executed at process fork.
(Contributed by Antoine Pitrou in :issue:`16500`.)

Added :func:`os.preadv` (combine the functionality of :func:`os.readv` and
:func:`os.pread`) and :func:`os.pwritev` functions (combine the functionality
of :func:`os.writev` and :func:`os.pwrite`). (Contributed by Pablo Galindo in
:issue:`31368`.)

The mode argument of :func:`os.makedirs` no longer affects the file
permission bits of newly-created intermediate-level directories.
(Contributed by Serhiy Storchaka in :issue:`19930`.)

:func:`os.dup2` now returns the new file descriptor.  Previously, ``None``
was always returned.
(Contributed by Benjamin Peterson in :issue:`32441`.)

The structure returned by :func:`os.stat` now contains the
:attr:`~os.stat_result.st_fstype` attribute on Solaris and its derivatives.
(Contributed by Jesús Cea Avión in :issue:`32659`.)


pathlib
-------

The new :meth:`Path.is_mount() <pathlib.Path.is_mount>` method is now available
on POSIX systems and can be used to determine whether a path is a mount point.
(Contributed by Cooper Ry Lees in :issue:`30897`.)


pdb
---

:func:`pdb.set_trace` now takes an optional *header* keyword-only
argument.  If given, it is printed to the console just before debugging
begins.  (Contributed by Barry Warsaw in :issue:`31389`.)

:mod:`pdb` command line now accepts ``-m module_name`` as an alternative to
script file.  (Contributed by Mario Corchero in :issue:`32206`.)


py_compile
----------

:func:`py_compile.compile` -- and by extension, :mod:`compileall` -- now
respects the :envvar:`SOURCE_DATE_EPOCH` environment variable by
unconditionally creating ``.pyc`` files for hash-based validation.
This allows for guaranteeing
`reproducible builds <https://reproducible-builds.org/>`_ of ``.pyc``
files when they are created eagerly. (Contributed by Bernhard M. Wiedemann
in :issue:`29708`.)


pydoc
-----

The pydoc server can now bind to an arbitrary hostname specified by the
new ``-n`` command-line argument.
(Contributed by Feanil Patel in :issue:`31128`.)


queue
-----

The new :class:`~queue.SimpleQueue` class is an unbounded :abbr:`FIFO` queue.
(Contributed by Antoine Pitrou in :issue:`14976`.)


re
--

The flags :const:`re.ASCII`, :const:`re.LOCALE` and :const:`re.UNICODE`
can be set within the scope of a group.
(Contributed by Serhiy Storchaka in :issue:`31690`.)

:func:`re.split` now supports splitting on a pattern like ``r'\b'``,
``'^$'`` or ``(?=-)`` that matches an empty string.
(Contributed by Serhiy Storchaka in :issue:`25054`.)

Regular expressions compiled with the :const:`re.LOCALE` flag no longer
depend on the locale at compile time.  Locale settings are applied only
when the compiled regular expression is used.
(Contributed by Serhiy Storchaka in :issue:`30215`.)

:exc:`FutureWarning` is now emitted if a regular expression contains
character set constructs that will change semantically in the future,
such as nested sets and set operations.
(Contributed by Serhiy Storchaka in :issue:`30349`.)

Compiled regular expression and match objects can now be copied
using :func:`copy.copy` and :func:`copy.deepcopy`.
(Contributed by Serhiy Storchaka in :issue:`10076`.)


signal
------

The new *warn_on_full_buffer* argument to the :func:`signal.set_wakeup_fd`
function makes it possible to specify whether Python prints a warning on
stderr when the wakeup buffer overflows.
(Contributed by Nathaniel J. Smith in :issue:`30050`.)


socket
------

The new :func:`socket.getblocking() <socket.socket.getblocking>` method
returns ``True`` if the socket is in blocking mode and ``False`` otherwise.
(Contributed by Yury Selivanov in :issue:`32373`.)

The new :func:`socket.close` function closes the passed socket file descriptor.
This function should be used instead of :func:`os.close` for better
compatibility across platforms.
(Contributed by Christian Heimes in :issue:`32454`.)

The :mod:`socket` module now exposes the :data:`socket.TCP_CONGESTION`
(Linux 2.6.13), :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37), and
:data:`socket.TCP_NOTSENT_LOWAT` (Linux 3.12) constants.
(Contributed by Omar Sandoval in :issue:`26273` and
Nathaniel J. Smith in :issue:`29728`.)

Support for :data:`socket.AF_VSOCK` sockets has been added to allow
communication between virtual machines and their hosts.
(Contributed by Cathy Avery in :issue:`27584`.)

Sockets now auto-detect family, type and protocol from file descriptor
by default.
(Contributed by Christian Heimes in :issue:`28134`.)


socketserver
------------

:meth:`socketserver.ThreadingMixIn.server_close` now waits until all non-daemon
threads complete. :meth:`socketserver.ForkingMixIn.server_close` now waits
until all child processes complete.

Add a new :attr:`socketserver.ForkingMixIn.block_on_close` class attribute to
:class:`socketserver.ForkingMixIn` and :class:`socketserver.ThreadingMixIn`
classes. Set the class attribute to ``False`` to get the pre-3.7 behaviour.


sqlite3
-------

:class:`sqlite3.Connection` now exposes the :meth:`~sqlite3.Connection.backup`
method when the underlying SQLite library is at version 3.6.11 or higher.
(Contributed by Lele Gaifax in :issue:`27645`.)

The *database* argument of :func:`sqlite3.connect` now accepts any
:term:`path-like object`, instead of just a string.
(Contributed by Anders Lorentsen in :issue:`31843`.)


ssl
---

The :mod:`ssl` module now uses OpenSSL's builtin API instead of
:func:`~ssl.match_hostname` to check a host name or an IP address.  Values
are validated during TLS handshake.  Any certificate validation error
including failing the host name check now raises
:exc:`~ssl.SSLCertVerificationError` and aborts the handshake with a proper
TLS Alert message.  The new exception contains additional information.
Host name validation can be customized with
:attr:`SSLContext.host_flags <ssl.SSLContext.host_flags>`.
(Contributed by Christian Heimes in :issue:`31399`.)

.. note::
   The improved host name check requires a *libssl* implementation compatible
   with OpenSSL 1.0.2 or 1.1.  Consequently, OpenSSL 0.9.8 and 1.0.1 are no
   longer supported.  The ssl module is mostly compatible with LibreSSL 2.7.2
   and newer.

The ``ssl`` module no longer sends IP addresses in SNI TLS extension.
(Contributed by Christian Heimes in :issue:`32185`.)

:func:`~ssl.match_hostname` no longer supports partial wildcards like
``www*.example.org``. :attr:`SSLContext.host_flags <ssl.SSLContext.host_flags>`
has partial wildcard matching disabled by default.
(Contributed by Mandeep Singh in :issue:`23033` and Christian Heimes in
:issue:`31399`.)

The default cipher suite selection of the ``ssl`` module now uses a blacklist
approach rather than a hard-coded whitelist.  Python no longer re-enables
ciphers that have been blocked by OpenSSL security updates.  Default cipher
suite selection can be configured at compile time.
(Contributed by Christian Heimes in :issue:`31429`.)

Validation of server certificates containing internationalized domain names
(IDNs) is now supported.  As part of this change, the
:attr:`SSLSocket.server_hostname <ssl.SSLSocket.server_hostname>` attribute
now stores the expected hostname in A-label form (``"xn--pythn-mua.org"``),
rather than the U-label form (``"pythön.org"``).  (Contributed by
Nathaniel J. Smith and Christian Heimes in :issue:`28414`.)

The ``ssl`` module has preliminary and experimental support for TLS 1.3 and
OpenSSL 1.1.1.  At the time of Python 3.7.0 release, OpenSSL 1.1.1 is still
under development and TLS 1.3 hasn't been finalized yet.  The TLS 1.3
handshake and protocol behaves slightly differently than TLS 1.2 and earlier,
see :ref:`ssl-tlsv1_3`.
(Contributed by Christian Heimes in :issue:`32947`, :issue:`20995`,
:issue:`29136`, :issue:`30622` and :issue:`33618`)

:class:`~ssl.SSLSocket` and :class:`~ssl.SSLObject` no longer have a public
constructor.  Direct instantiation was never a documented and supported
feature.  Instances must be created with :class:`~ssl.SSLContext` methods
:meth:`~ssl.SSLContext.wrap_socket` and :meth:`~ssl.SSLContext.wrap_bio`.
(Contributed by Christian Heimes in :issue:`32951`)

OpenSSL 1.1 APIs for setting the minimum and maximum TLS protocol version are
available as :attr:`SSLContext.minimum_version <ssl.SSLContext.minimum_version>`
and :attr:`SSLContext.maximum_version <ssl.SSLContext.maximum_version>`.
Supported protocols are indicated by serveral new flags, such as
:data:`~ssl.HAS_TLSv1_1`.
(Contributed by Christian Heimes in :issue:`32609`.)


string
------

:class:`string.Template` now lets you to optionally modify the regular
expression pattern for braced placeholders and non-braced placeholders
separately.  (Contributed by Barry Warsaw in :issue:`1198569`.)


subprocess
----------

The :func:`subprocess.run` function accepts the new *capture_output*
keyword argument.  When true, stdout and stderr will be captured.
This is equivalent to passing :data:`subprocess.PIPE` as *stdout* and
*stderr* arguments.
(Contributed by Bo Bayles in :issue:`32102`.)

The ``subprocess.run`` function and the :class:`subprocess.Popen` constructor
now accept the *text* keyword argument as an alias
to *universal_newlines*.
(Contributed by Andrew Clegg in :issue:`31756`.)

On Windows the default for *close_fds* was changed from ``False`` to
``True`` when redirecting the standard handles.  It's now possible to set
*close_fds* to true when redirecting the standard handles.  See
:class:`subprocess.Popen`.  This means that *close_fds* now defaults to
``True`` on all supported platforms.
(Contributed by Segev Finer in :issue:`19764`.)

The subprocess module is now more graceful when handling
:exc:`KeyboardInterrupt` during :func:`subprocess.call`,
:func:`subprocess.run`, or in a :class:`~subprocess.Popen`
context manager.  It now waits a short amount of time for the child
to exit, before continuing the handling of the ``KeyboardInterrupt``
exception.
(Contributed by Gregory P. Smith in :issue:`25942`.)


sys
---

The new :func:`sys.breakpointhook` hook function is called by the
built-in :func:`breakpoint`.
(Contributed by Barry Warsaw in :issue:`31353`.)

On Android, the new :func:`sys.getandroidapilevel` returns the build-time
Android API version.
(Contributed by Victor Stinner in :issue:`28740`.)

The new :func:`sys.get_coroutine_origin_tracking_depth` function returns
the current coroutine origin tracking depth, as set by
the new :func:`sys.set_coroutine_origin_tracking_depth`.  :mod:`asyncio`
has been converted to use this new API instead of
the deprecated :func:`sys.set_coroutine_wrapper`.
(Contributed by Nathaniel J. Smith in :issue:`32591`.)


time
----

:pep:`564` adds six new functions with nanosecond resolution to the
:mod:`time` module:

* :func:`time.clock_gettime_ns`
* :func:`time.clock_settime_ns`
* :func:`time.monotonic_ns`
* :func:`time.perf_counter_ns`
* :func:`time.process_time_ns`
* :func:`time.time_ns`

New clock identifiers have been added:

* :data:`time.CLOCK_BOOTTIME` (Linux): Identical to
  :data:`time.CLOCK_MONOTONIC`, except it also includes any time that the
  system is suspended.
* :data:`time.CLOCK_PROF` (FreeBSD, NetBSD and OpenBSD): High-resolution
  per-process CPU timer.
* :data:`time.CLOCK_UPTIME` (FreeBSD, OpenBSD): Time whose absolute value is
  the time the system has been running and not suspended, providing accurate
  uptime measurement.

The new :func:`time.thread_time` and :func:`time.thread_time_ns` functions
can be used to get per-thread CPU time measurements.
(Contributed by Antoine Pitrou in :issue:`32025`.)

The new :func:`time.pthread_getcpuclockid` function returns the clock ID
of the thread-specific CPU-time clock.


tkinter
-------

The new :class:`tkinter.ttk.Spinbox` class is now available.
(Contributed by Alan Moore in :issue:`32585`.)


tracemalloc
-----------

:class:`tracemalloc.Traceback` behaves more like regular tracebacks,
sorting the frames from oldest to most recent.
:meth:`Traceback.format() <tracemalloc.Traceback.format>`
now accepts negative *limit*, truncating the result to the
``abs(limit)`` oldest frames.  To get the old behaviour, use
the new *most_recent_first* argument to ``Traceback.format()``.
(Contributed by Jesse Bakker in :issue:`32121`.)


types
-----

The new :class:`~types.WrapperDescriptorType`,
:class:`~types.MethodWrapperType`, :class:`~types.MethodDescriptorType`,
and :class:`~types.ClassMethodDescriptorType` classes are now available.
(Contributed by Manuel Krebber and Guido van Rossum in :issue:`29377`,
and Serhiy Storchaka in :issue:`32265`.)

The new :func:`types.resolve_bases` function resolves MRO entries
dynamically as specified by :pep:`560`.
(Contributed by Ivan Levkivskyi in :issue:`32717`.)


unicodedata
-----------

The internal :mod:`unicodedata` database has been upgraded to use `Unicode 11
<http://www.unicode.org/versions/Unicode11.0.0/>`_. (Contributed by Benjamin
Peterson.)


unittest
--------

The new ``-k`` command-line option allows filtering tests by a name
substring or a Unix shell-like pattern.
For example, ``python -m unittest -k foo`` runs
``foo_tests.SomeTest.test_something``, ``bar_tests.SomeTest.test_foo``,
but not ``bar_tests.FooTest.test_something``.
(Contributed by Jonas Haag in :issue:`32071`.)


unittest.mock
-------------

The :const:`~unittest.mock.sentinel` attributes now preserve their identity
when they are :mod:`copied <copy>` or :mod:`pickled <pickle>`. (Contributed by
Serhiy Storchaka in :issue:`20804`.)

The new :func:`~unittest.mock.seal` function allows sealing
:class:`~unittest.mock.Mock` instances, which will disallow further creation
of attribute mocks.  The seal is applied recursively to all attributes that
are themselves mocks.
(Contributed by Mario Corchero in :issue:`30541`.)


urllib.parse
------------

:func:`urllib.parse.quote` has been updated from :rfc:`2396` to :rfc:`3986`,
adding ``~`` to the set of characters that are never quoted by default.
(Contributed by Christian Theune and Ratnadeep Debnath in :issue:`16285`.)


uu
--

The :func:`uu.encode` function now accepts an optional *backtick*
keyword argument.  When it's true, zeros are represented by ``'`'``
instead of spaces.  (Contributed by Xiang Zhang in :issue:`30103`.)


uuid
----

The new :attr:`UUID.is_safe <uuid.UUID.is_safe>` attribute relays information
from the platform about whether generated UUIDs are generated with a
multiprocessing-safe method.
(Contributed by Barry Warsaw in :issue:`22807`.)

:func:`uuid.getnode` now prefers universally administered
MAC addresses over locally administered MAC addresses.
This makes a better guarantee for global uniqueness of UUIDs returned
from :func:`uuid.uuid1`.  If only locally administered MAC addresses are
available, the first such one found is returned.
(Contributed by Barry Warsaw in :issue:`32107`.)


warnings
--------

The initialization of the default warnings filters has changed as follows:

* warnings enabled via command line options (including those for :option:`-b`
  and the new CPython-specific :option:`-X` ``dev`` option) are always passed
  to the warnings machinery via the :data:`sys.warnoptions` attribute.

* warnings filters enabled via the command line or the environment now have the
  following order of precedence:

     * the ``BytesWarning`` filter for :option:`-b` (or ``-bb``)
     * any filters specified with the :option:`-W` option
     * any filters specified with the :envvar:`PYTHONWARNINGS` environment
       variable
     * any other CPython specific filters (e.g. the ``default`` filter added
       for the new ``-X dev`` mode)
     * any implicit filters defined directly by the warnings machinery

* in CPython debug builds, all warnings are now displayed by default (the
  implicit filter list is empty)

(Contributed by Nick Coghlan and Victor Stinner in :issue:`20361`,
:issue:`32043`, and :issue:`32230`.)

Deprecation warnings are once again shown by default in single-file scripts and
at the interactive prompt.  See :ref:`whatsnew37-pep565` for details.
(Contributed by Nick Coghlan in :issue:`31975`.)


xml.etree
---------

:ref:`ElementPath <elementtree-xpath>` predicates in the :meth:`find`
methods can now compare text of the current node with ``[. = "text"]``,
not only text in children.  Predicates also allow adding spaces for
better readability.  (Contributed by Stefan Behnel in :issue:`31648`.)


xmlrpc.server
-------------

:meth:`SimpleXMLRPCDispatcher.register_function <xmlrpc.server.SimpleXMLRPCDispatcher>`
can now be used as a decorator.  (Contributed by Xiang Zhang in
:issue:`7769`.)


zipapp
------

Function :func:`~zipapp.create_archive` now accepts an optional *filter*
argument to allow the user to select which files should be included in the
archive.  (Contributed by Irmen de Jong in :issue:`31072`.)

Function :func:`~zipapp.create_archive` now accepts an optional *compressed*
argument to generate a compressed archive.  A command line option
``--compress`` has also been added to support compression.
(Contributed by Zhiming Wang in :issue:`31638`.)


zipfile
-------

:class:`~zipfile.ZipFile` now accepts the new *compresslevel* parameter to
control the compression level.
(Contributed by Bo Bayles in :issue:`21417`.)

Subdirectories in archives created by ``ZipFile`` are now stored in
alphabetical order.
(Contributed by Bernhard M. Wiedemann in :issue:`30693`.)


C API Changes
=============

A new API for thread-local storage has been implemented.  See
:ref:`whatsnew37-pep539` for an overview and
:ref:`thread-specific-storage-api` for a complete reference.
(Contributed by Masayuki Yamamoto in :issue:`25658`.)

The new :ref:`context variables <whatsnew37-pep567>` functionality
exposes a number of :ref:`new C APIs <contextvarsobjects>`.

The new :c:func:`PyImport_GetModule` function returns the previously
imported module with the given name.
(Contributed by Eric Snow in :issue:`28411`.)

The new :c:macro:`Py_RETURN_RICHCOMPARE` macro eases writing rich
comparison functions.
(Contributed by Petr Victorin in :issue:`23699`.)

The new :c:macro:`Py_UNREACHABLE` macro can be used to mark unreachable
code paths.
(Contributed by Barry Warsaw in :issue:`31338`.)

The :mod:`tracemalloc` now exposes a C API through the new
:c:func:`PyTraceMalloc_Track` and :c:func:`PyTraceMalloc_Untrack`
functions.
(Contributed by Victor Stinner in :issue:`30054`.)

The new :c:func:`import__find__load__start` and
:c:func:`import__find__load__done` static markers can be used to trace
module imports.
(Contributed by Christian Heimes in :issue:`31574`.)

The fields :c:member:`name` and :c:member:`doc` of structures
:c:type:`PyMemberDef`, :c:type:`PyGetSetDef`,
:c:type:`PyStructSequence_Field`, :c:type:`PyStructSequence_Desc`,
and :c:type:`wrapperbase` are now of type ``const char *`` rather of
``char *``.  (Contributed by Serhiy Storchaka in :issue:`28761`.)

The result of :c:func:`PyUnicode_AsUTF8AndSize` and :c:func:`PyUnicode_AsUTF8`
is now of type ``const char *`` rather of ``char *``. (Contributed by Serhiy
Storchaka in :issue:`28769`.)

The result of :c:func:`PyMapping_Keys`, :c:func:`PyMapping_Values` and
:c:func:`PyMapping_Items` is now always a list, rather than a list or a
tuple. (Contributed by Oren Milman in :issue:`28280`.)

Added functions :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices`.
(Contributed by Serhiy Storchaka in :issue:`27867`.)

:c:func:`PyOS_AfterFork` is deprecated in favour of the new functions
:c:func:`PyOS_BeforeFork`, :c:func:`PyOS_AfterFork_Parent` and
:c:func:`PyOS_AfterFork_Child`.  (Contributed by Antoine Pitrou in
:issue:`16500`.)

The ``PyExc_RecursionErrorInst`` singleton that was part of the public API
has been removed as its members being never cleared may cause a segfault
during finalization of the interpreter. Contributed by Xavier de Gaye in
:issue:`22898` and :issue:`30697`.

Added C API support for timezones with timezone constructors
:c:func:`PyTimeZone_FromOffset` and :c:func:`PyTimeZone_FromOffsetAndName`,
and access to the UTC singleton with :c:data:`PyDateTime_TimeZone_UTC`.
Contributed by Paul Ganssle in :issue:`10381`.

The type of results of :c:func:`PyThread_start_new_thread` and
:c:func:`PyThread_get_thread_ident`, and the *id* parameter of
:c:func:`PyThreadState_SetAsyncExc` changed from :c:type:`long` to
:c:type:`unsigned long`.
(Contributed by Serhiy Storchaka in :issue:`6532`.)

:c:func:`PyUnicode_AsWideCharString` now raises a :exc:`ValueError` if the
second argument is *NULL* and the :c:type:`wchar_t*` string contains null
characters.  (Contributed by Serhiy Storchaka in :issue:`30708`.)

Changes to the startup sequence and the management of dynamic memory
allocators mean that the long documented requirement to call
:c:func:`Py_Initialize` before calling most C API functions is now
relied on more heavily, and failing to abide by it may lead to segfaults in
embedding applications. See the :ref:`porting-to-python-37` section in this
document and the :ref:`pre-init-safe` section in the C API documentation
for more details.

The new :c:func:`PyInterpreterState_GetID` returns the unique ID for a
given interpreter.
(Contributed by Eric Snow in :issue:`29102`.)

:c:func:`Py_DecodeLocale`, :c:func:`Py_EncodeLocale` now use the UTF-8
encoding when the :ref:`UTF-8 mode <whatsnew37-pep540>` is enabled.
(Contributed by Victor Stinner in :issue:`29240`.)

:c:func:`PyUnicode_DecodeLocaleAndSize` and :c:func:`PyUnicode_EncodeLocale`
now use the current locale encoding for ``surrogateescape`` error handler.
(Contributed by Victor Stinner in :issue:`29240`.)

The *start* and *end* parameters of :c:func:`PyUnicode_FindChar` are
now adjusted to behave like string slices.
(Contributed by Xiang Zhang in :issue:`28822`.)


Build Changes
=============

Support for building ``--without-threads`` has been removed.  The
:mod:`threading` module is now always available.
(Contributed by Antoine Pitrou in :issue:`31370`.).

A full copy of libffi is no longer bundled for use when building the
:mod:`_ctypes <ctypes>` module on non-OSX UNIX platforms.  An installed copy
of libffi is now required when building ``_ctypes`` on such platforms.
(Contributed by Zachary Ware in :issue:`27979`.)

The Windows build process no longer depends on Subversion to pull in external
sources, a Python script is used to download zipfiles from GitHub instead.
If Python 3.6 is not found on the system (via ``py -3.6``), NuGet is used to
download a copy of 32-bit Python for this purpose.  (Contributed by Zachary
Ware in :issue:`30450`.)

The :mod:`ssl` module requires OpenSSL 1.0.2 or 1.1 compatible libssl.
OpenSSL 1.0.1 has reached end of lifetime on 2016-12-31 and is no longer
supported. LibreSSL is temporarily not supported as well. LibreSSL releases
up to version 2.6.4 are missing required OpenSSL 1.0.2 APIs.


.. _whatsnew37-perf:

Optimizations
=============

The overhead of calling many methods of various standard library classes
implemented in C has been significantly reduced by porting more code
to use the ``METH_FASTCALL`` convention.
(Contributed by Victor Stinner in :issue:`29300`, :issue:`29507`,
:issue:`29452`, and :issue:`29286`.)

Various optimizations have reduced Python startup time by 10% on Linux and
up to 30% on macOS.
(Contributed by Victor Stinner, INADA Naoki in :issue:`29585`, and
Ivan Levkivskyi in :issue:`31333`.)

Method calls are now up to 20% faster due to the bytecode changes which
avoid creating bound method instances.
(Contributed by Yury Selivanov and INADA Naoki in :issue:`26110`.)

.. _whatsnew37-asyncio-perf:

The :mod:`asyncio` module received a number of notable optimizations for
commonly used functions:

* The :func:`asyncio.get_event_loop` function has been reimplemented in C to
  make it up to 15 times faster.
  (Contributed by Yury Selivanov in :issue:`32296`.)

* :class:`asyncio.Future` callback management has been optimized.
  (Contributed by Yury Selivanov in :issue:`32348`.)

* :func:`asyncio.gather` is now up to 15% faster.
  (Contributed by Yury Selivanov in :issue:`32355`.)

* :func:`asyncio.sleep` is now up to 2 times faster when the *delay*
  argument is zero or negative.
  (Contributed by Andrew Svetlov in :issue:`32351`.)

* The performance overhead of asyncio debug mode has been reduced.
  (Contributed by Antoine Pitrou in :issue:`31970`.)

As a result of :ref:`PEP 560 work <whatsnew37-pep560>`, the import time
of :mod:`typing` has been reduced by a factor of 7, and many typing operations
are now faster.
(Contributed by Ivan Levkivskyi in :issue:`32226`.)

:func:`sorted` and :meth:`list.sort` have been optimized for common cases
to be up to 40-75% faster.
(Contributed by Elliot Gorokhovsky in :issue:`28685`.)

:meth:`dict.copy` is now up to 5.5 times faster.
(Contributed by Yury Selivanov in :issue:`31179`.)

:func:`hasattr` and :func:`getattr` are now about 4 times faster when
*name* is not found and *obj* does not override :meth:`object.__getattr__`
or :meth:`object.__getattribute__`.
(Contributed by INADA Naoki in :issue:`32544`.)

Searching for certain Unicode characters (like Ukrainian capital "Є")
in a string was up to 25 times slower than searching for other characters.
It is now only 3 times slower in the worst case.
(Contributed by Serhiy Storchaka in :issue:`24821`.)

The :func:`collections.namedtuple` factory has been reimplemented to
make the creation of named tuples 4 to 6 times faster.
(Contributed by Jelle Zijlstra with further improvements by INADA Naoki,
Serhiy Storchaka, and Raymond Hettinger in :issue:`28638`.)

:meth:`date.fromordinal` and :meth:`date.fromtimestamp` are now up to
30% faster in the common case.
(Contributed by Paul Ganssle in :issue:`32403`.)

The :func:`os.fwalk` function is now up to 2 times faster thanks to
the use of :func:`os.scandir`.
(Contributed by Serhiy Storchaka in :issue:`25996`.)

The speed of the :func:`shutil.rmtree` function has been improved by
20--40% thanks to the use of the :func:`os.scandir` function.
(Contributed by Serhiy Storchaka in :issue:`28564`.)

Optimized case-insensitive matching and searching of :mod:`regular
expressions <re>`.  Searching some patterns can now be up to 20 times faster.
(Contributed by Serhiy Storchaka in :issue:`30285`.)

:func:`re.compile` now converts ``flags`` parameter to int object if
it is ``RegexFlag``.  It is now as fast as Python 3.5, and faster than
Python 3.6 by about 10% depending on the pattern.
(Contributed by INADA Naoki in :issue:`31671`.)

The :meth:`~selectors.BaseSelector.modify` methods of classes
:class:`selectors.EpollSelector`, :class:`selectors.PollSelector`
and :class:`selectors.DevpollSelector` may be around 10% faster under
heavy loads.  (Contributed by Giampaolo Rodola' in :issue:`30014`)

Constant folding has been moved from the peephole optimizer to the new AST
optimizer, which is able perform optimizations more consistently.
(Contributed by Eugene Toder and INADA Naoki in :issue:`29469` and
:issue:`11549`.)

Most functions and methods in :mod:`abc` have been rewritten in C.
This makes creation of abstract base classes, and calling :func:`isinstance`
and :func:`issubclass` on them 1.5x faster.  This also reduces Python
start-up time by up to 10%. (Contributed by Ivan Levkivskyi and INADA Naoki
in :issue:`31333`)

Significant speed improvements to alternate constructors for
:class:`datetime.date` and :class:`datetime.datetime` by using fast-path
constructors when not constructing subclasses. (Contributed by Paul Ganssle
in :issue:`32403`)

The speed of comparison of :class:`array.array` instances has been
improved considerably in certain cases.  It is now from 10x to 70x faster
when comparing arrays holding values of the same integer type.
(Contributed by Adrian Wielgosik in :issue:`24700`.)

The :func:`math.erf` and :func:`math.erfc` functions now use the (faster)
C library implementation on most platforms.
(Contributed by Serhiy Storchaka in :issue:`26121`.)


Other CPython Implementation Changes
====================================

* Trace hooks may now opt out of receiving the ``line`` and opt into receiving
  the ``opcode`` events from the interpreter by setting the corresponding new
  ``f_trace_lines`` and ``f_trace_opcodes`` attributes on the
  frame being traced. (Contributed by Nick Coghlan in :issue:`31344`.)

* Fixed some consistency problems with namespace package module attributes.
  Namespace module objects now have an ``__file__`` that is set to ``None``
  (previously unset), and their ``__spec__.origin`` is also set to ``None``
  (previously the string ``"namespace"``).  See :issue:`32305`.  Also, the
  namespace module object's ``__spec__.loader`` is set to the same value as
  ``__loader__`` (previously, the former was set to ``None``).  See
  :issue:`32303`.

* The :func:`locals` dictionary now displays in the lexical order that
  variables were defined.  Previously, the order was undefined.
  (Contributed by Raymond Hettinger in :issue:`32690`.)

* The :mod:`distutils` ``upload`` command no longer tries to change CR
  end-of-line characters to CRLF.  This fixes a corruption issue with sdists
  that ended with a byte equivalent to CR.
  (Contributed by Bo Bayles in :issue:`32304`.)


Deprecated Python Behavior
==========================

Yield expressions (both ``yield`` and ``yield from`` clauses) are now deprecated
in comprehensions and generator expressions (aside from the iterable expression
in the leftmost :keyword:`for` clause). This ensures that comprehensions
always immediately return a container of the appropriate type (rather than
potentially returning a :term:`generator iterator` object), while generator
expressions won't attempt to interleave their implicit output with the output
from any explicit yield expressions.  In Python 3.7, such expressions emit
:exc:`DeprecationWarning` when compiled, in Python 3.8 this will be a
:exc:`SyntaxError`.
(Contributed by Serhiy Storchaka in :issue:`10544`.)

Returning a subclass of :class:`complex` from :meth:`object.__complex__` is
deprecated and will be an error in future Python versions.  This makes
``__complex__()`` consistent with :meth:`object.__int__` and
:meth:`object.__float__`.
(Contributed by Serhiy Storchaka in :issue:`28894`.)



Deprecated Python modules, functions and methods
================================================

aifc
----

:func:`aifc.openfp` has been deprecated and will be removed in Python 3.9.
Use :func:`aifc.open` instead.
(Contributed by Brian Curtin in :issue:`31985`.)


.. _whatsnew37-asyncio-deprecated:

asyncio
-------

Support for directly ``await``-ing instances of :class:`asyncio.Lock` and
other asyncio synchronization primitives has been deprecated.  An
asynchronous context manager must be used in order to acquire and release
the synchronization resource.  See :ref:`async-with-locks` for more
information.
(Contributed by Andrew Svetlov in :issue:`32253`.)

The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks`
methods have been deprecated.
(Contributed by Andrew Svetlov in :issue:`32250`.)


collections
-----------

In Python 3.8, the abstract base classes in :mod:`collections.abc` will no
longer be exposed in the regular :mod:`collections` module.  This will help
create a clearer distinction between the concrete classes and the abstract
base classes.
(Contributed by Serhiy Storchaka in :issue:`25988`.)


dbm
---

:mod:`dbm.dumb` now supports reading read-only files and no longer writes the
index file when it is not changed.  A deprecation warning is now emitted
if the index file is missing and recreated in the ``'r'`` and ``'w'``
modes (this will be an error in future Python releases).
(Contributed by Serhiy Storchaka in :issue:`28847`.)


enum
----

In Python 3.8, attempting to check for non-Enum objects in :class:`Enum`
classes will raise a :exc:`TypeError` (e.g. ``1 in Color``); similarly,
attempting to check for non-Flag objects in a :class:`Flag` member will
raise :exc:`TypeError` (e.g. ``1 in Perm.RW``); currently, both operations
return :const:`False` instead.
(Contributed by Ethan Furman in :issue:`33217`.)


gettext
-------

Using non-integer value for selecting a plural form in :mod:`gettext` is
now deprecated.  It never correctly worked. (Contributed by Serhiy Storchaka
in :issue:`28692`.)


importlib
---------

Methods
:meth:`MetaPathFinder.find_module() <importlib.abc.MetaPathFinder.find_module>`
(replaced by
:meth:`MetaPathFinder.find_spec() <importlib.abc.MetaPathFinder.find_spec>`)
and
:meth:`PathEntryFinder.find_loader() <importlib.abc.PathEntryFinder.find_loader>`
(replaced by
:meth:`PathEntryFinder.find_spec() <importlib.abc.PathEntryFinder.find_spec>`)
both deprecated in Python 3.4 now emit :exc:`DeprecationWarning`.
(Contributed by Matthias Bussonnier in :issue:`29576`)

The :class:`importlib.abc.ResourceLoader` ABC has been deprecated in
favour of :class:`importlib.abc.ResourceReader`.


locale
------

:func:`locale.format` has been deprecated, use :meth:`locale.format_string`
instead.  (Contributed by Garvit in :issue:`10379`.)


macpath
-------

The :mod:`macpath` is now deprecated and will be removed in Python 3.8.
(Contributed by Chi Hsuan Yen in :issue:`9850`.)


threading
---------

:mod:`dummy_threading` and :mod:`_dummy_thread` have been deprecated.  It is
no longer possible to build Python with threading disabled.
Use :mod:`threading` instead.
(Contributed by Antoine Pitrou in :issue:`31370`.)


socket
------

The silent argument value trunctation in :func:`socket.htons` and
:func:`socket.ntohs` has been deprecated.  In future versions of Python,
if the passed argument is larger than 16 bits, an exception will be raised.
(Contributed by Oren Milman in :issue:`28332`.)


ssl
---

:func:`ssl.wrap_socket` is deprecated.  Use
:meth:`ssl.SSLContext.wrap_socket` instead.
(Contributed by Christian Heimes in :issue:`28124`.)


sunau
-----

:func:`sunau.openfp` has been deprecated and will be removed in Python 3.9.
Use :func:`sunau.open` instead.
(Contributed by Brian Curtin in :issue:`31985`.)


sys
---

Deprecated :func:`sys.set_coroutine_wrapper` and
:func:`sys.get_coroutine_wrapper`.

The undocumented ``sys.callstats()`` function has been deprecated and
will be removed in a future Python version.
(Contributed by Victor Stinner in :issue:`28799`.)


wave
----

:func:`wave.openfp` has been deprecated and will be removed in Python 3.9.
Use :func:`wave.open` instead.
(Contributed by Brian Curtin in :issue:`31985`.)


Deprecated functions and types of the C API
===========================================

Function :c:func:`PySlice_GetIndicesEx` is deprecated and replaced with
a macro if ``Py_LIMITED_API`` is not set or set to a value in the range
between ``0x03050400`` and ``0x03060000`` (not inclusive), or is ``0x03060100``
or higher.  (Contributed by Serhiy Storchaka in :issue:`27867`.)

:c:func:`PyOS_AfterFork` has been deprecated.  Use :c:func:`PyOS_BeforeFork`,
:c:func:`PyOS_AfterFork_Parent` or :c:func:`PyOS_AfterFork_Child()` instead.
(Contributed by Antoine Pitrou in :issue:`16500`.)


Platform Support Removals
=========================

FreeBSD 9 and older are no longer officially supported.


API and Feature Removals
========================

The following features and APIs have been removed from Python 3.7:

* The ``os.stat_float_times()`` function has been removed. It was introduced in
  Python 2.3 for backward compatibility with Python 2.2, and was deprecated
  since Python 3.1.

* Unknown escapes consisting of ``'\'`` and an ASCII letter in replacement
  templates for :func:`re.sub` were deprecated in Python 3.5, and will now
  cause an error.

* Removed support of the *exclude* argument in :meth:`tarfile.TarFile.add`.
  It was deprecated in Python 2.7 and 3.2.  Use the *filter* argument instead.

* The ``splitunc()`` function in the :mod:`ntpath` module was deprecated in
  Python 3.1, and has now been removed.  Use the :func:`~os.path.splitdrive`
  function instead.

* :func:`collections.namedtuple` no longer supports the *verbose* parameter
  or ``_source`` attribute which showed the generated source code for the
  named tuple class.  This was part of an optimization designed to speed-up
  class creation.  (Contributed by Jelle Zijlstra with further improvements
  by INADA Naoki, Serhiy Storchaka, and Raymond Hettinger in :issue:`28638`.)

* Functions :func:`bool`, :func:`float`, :func:`list` and :func:`tuple` no
  longer take keyword arguments.  The first argument of :func:`int` can now
  be passed only as positional argument.

* Removed previously deprecated in Python 2.4 classes ``Plist``, ``Dict`` and
  ``_InternalDict`` in the :mod:`plistlib` module.  Dict values in the result
  of functions :func:`~plistlib.readPlist` and
  :func:`~plistlib.readPlistFromBytes` are now normal dicts.  You no longer
  can use attribute access to access items of these dictionaries.

* The ``asyncio.windows_utils.socketpair()`` function has been
  removed.  Use the :func:`socket.socketpair` function instead,
  it is available on all platforms since Python 3.5.
  ``asyncio.windows_utils.socketpair`` was just an alias to
  ``socket.socketpair`` on Python 3.5 and newer.

* :mod:`asyncio` no longer exports the :mod:`selectors` and
  :mod:`_overlapped` modules as ``asyncio.selectors`` and
  ``asyncio._overlapped``. Replace ``from asyncio import selectors`` with
  ``import selectors``.

* Direct instantiation of :class:`ssl.SSLSocket` and :class:`ssl.SSLObject`
  objects is now prohibited. The constructors were never documented, tested,
  or designed as public constructors.  Users were supposed to use
  :func:`ssl.wrap_socket` or :class:`ssl.SSLContext`.
  (Contributed by Christian Heimes in :issue:`32951`.)

* The unused :mod:`distutils` ``install_misc`` command has been removed.
  (Contributed by Eric N. Vander Weele in :issue:`29218`.)


Module Removals
===============

The ``fpectl`` module has been removed.  It was never enabled by
default, never worked correctly on x86-64, and it changed the Python
ABI in ways that caused unexpected breakage of C extensions.
(Contributed by Nathaniel J. Smith in :issue:`29137`.)


Windows-only Changes
====================

The python launcher, (py.exe), can accept 32 & 64 bit specifiers **without**
having to specify a minor version as well. So ``py -3-32`` and ``py -3-64``
become valid as well as ``py -3.7-32``, also the -*m*-64 and -*m.n*-64 forms
are now accepted to force 64 bit python even if 32 bit would have otherwise
been used. If the specified version is not available py.exe will error exit.
(Contributed by Steve Barnes in :issue:`30291`.)

The launcher can be run as ``py -0`` to produce a list of the installed pythons,
*with default marked with an asterisk*. Running ``py -0p`` will include the paths.
If py is run with a version specifier that cannot be matched it will also print
the *short form* list of available specifiers.
(Contributed by Steve Barnes in :issue:`30362`.)


.. _porting-to-python-37:

Porting to Python 3.7
=====================

This section lists previously described changes and other bugfixes
that may require changes to your code.


Changes in Python Behavior
--------------------------

* :keyword:`async` and :keyword:`await` names are now reserved keywords.
  Code using these names as identifiers will now raise a :exc:`SyntaxError`.
  (Contributed by Jelle Zijlstra in :issue:`30406`.)

* :pep:`479` is enabled for all code in Python 3.7, meaning that
  :exc:`StopIteration` exceptions raised directly or indirectly in
  coroutines and generators are transformed into :exc:`RuntimeError`
  exceptions.
  (Contributed by Yury Selivanov in :issue:`32670`.)

* :meth:`object.__aiter__` methods can no longer be declared as
  asynchronous.  (Contributed by Yury Selivanov in :issue:`31709`.)

* Due to an oversight, earlier Python versions erroneously accepted the
  following syntax::

      f(1 for x in [1],)

      class C(1 for x in [1]):
          pass

  Python 3.7 now correctly raises a :exc:`SyntaxError`, as a generator
  expression always needs to be directly inside a set of parentheses
  and cannot have a comma on either side, and the duplication of the
  parentheses can be omitted only on calls.
  (Contributed by Serhiy Storchaka in :issue:`32012` and :issue:`32023`.)

* When using the :option:`-m` switch, the initial working directory is now added
  to :data:`sys.path`, rather than an empty string (which dynamically denoted
  the current working directory at the time of each import). Any programs that
  are checking for the empty string, or otherwise relying on the previous
  behaviour, will need to be updated accordingly (e.g. by also checking for
  ``os.getcwd()`` or ``os.path.dirname(__main__.__file__)``, depending on why
  the code was checking for the empty string in the first place).


Changes in the Python API
-------------------------

* :meth:`socketserver.ThreadingMixIn.server_close` now waits until all
  non-daemon threads complete.  Set the new
  :attr:`socketserver.ThreadingMixIn.block_on_close` class attribute to
  ``False`` to get the pre-3.7 behaviour.
  (Contributed by Victor Stinner in :issue:`31233` and :issue:`33540`.)

* :meth:`socketserver.ForkingMixIn.server_close` now waits until all
  child processes complete. Set the new
  :attr:`socketserver.ForkingMixIn.block_on_close` class attribute to ``False``
  to get the pre-3.7 behaviour.
  (Contributed by Victor Stinner in :issue:`31151` and :issue:`33540`.)

* The :func:`locale.localeconv` function now temporarily sets the ``LC_CTYPE``
  locale to the value of ``LC_NUMERIC`` in some cases.
  (Contributed by Victor Stinner in :issue:`31900`.)

* :meth:`pkgutil.walk_packages` now raises a :exc:`ValueError` if *path* is
  a string.  Previously an empty list was returned.
  (Contributed by Sanyam Khurana in :issue:`24744`.)

* A format string argument for :meth:`string.Formatter.format`
  is now :ref:`positional-only <positional-only_parameter>`.
  Passing it as a keyword argument was deprecated in Python 3.5. (Contributed
  by Serhiy Storchaka in :issue:`29193`.)

* Attributes :attr:`~http.cookies.Morsel.key`,
  :attr:`~http.cookies.Morsel.value` and
  :attr:`~http.cookies.Morsel.coded_value` of class
  :class:`http.cookies.Morsel` are now read-only.
  Assigning to them was deprecated in Python 3.5.
  Use the :meth:`~http.cookies.Morsel.set` method for setting them.
  (Contributed by Serhiy Storchaka in :issue:`29192`.)

* The *mode* argument of :func:`os.makedirs` no longer affects the file
  permission bits of newly-created intermediate-level directories.
  To set their file permission bits you can set the umask before invoking
  ``makedirs()``.
  (Contributed by Serhiy Storchaka in :issue:`19930`.)

* The :attr:`struct.Struct.format` type is now :class:`str` instead of
  :class:`bytes`. (Contributed by Victor Stinner in :issue:`21071`.)

* :func:`~cgi.parse_multipart` now accepts the *encoding* and *errors*
  arguments and returns the same results as
  :class:`~FieldStorage`: for non-file fields, the value associated to a key
  is a list of strings, not bytes.
  (Contributed by Pierre Quentel in :issue:`29979`.)

* Due to internal changes in :mod:`socket`, calling :func:`socket.fromshare`
  on a socket created by :func:`socket.share <socket.socket.share>` in older
  Python versions is not supported.

* ``repr`` for :exc:`BaseException` has changed to not include the trailing
  comma.  Most exceptions are affected by this change.
  (Contributed by Serhiy Storchaka in :issue:`30399`.)

* ``repr`` for :class:`datetime.timedelta` has changed to include the keyword
  arguments in the output. (Contributed by Utkarsh Upadhyay in :issue:`30302`.)

* Because :func:`shutil.rmtree` is now implemented using the :func:`os.scandir`
  function, the user specified handler *onerror* is now called with the first
  argument ``os.scandir`` instead of ``os.listdir`` when listing the direcory
  is failed.

* Support for nested sets and set operations in regular expressions as in
  `Unicode Technical Standard #18`_ might be added in the future.  This would
  change the syntax.  To facilitate this future change a :exc:`FutureWarning`
  will be raised in ambiguous cases for the time being.
  That include sets starting with a literal ``'['`` or containing literal
  character sequences ``'--'``, ``'&&'``, ``'~~'``, and ``'||'``.  To
  avoid a warning, escape them with a backslash.
  (Contributed by Serhiy Storchaka in :issue:`30349`.)

  .. _Unicode Technical Standard #18: https://unicode.org/reports/tr18/

* The result of splitting a string on a :mod:`regular expression <re>`
  that could match an empty string has been changed.  For example
  splitting on ``r'\s*'`` will now split not only on whitespaces as it
  did previously, but also on empty strings before all non-whitespace
  characters and just before the end of the string.
  The previous behavior can be restored by changing the pattern
  to ``r'\s+'``.  A :exc:`FutureWarning` was emitted for such patterns since
  Python 3.5.

  For patterns that match both empty and non-empty strings, the result of
  searching for all matches may also be changed in other cases.  For example
  in the string ``'a\n\n'``, the pattern ``r'(?m)^\s*?$'`` will not only
  match empty strings at positions 2 and 3, but also the string ``'\n'`` at
  positions 2--3.  To match only blank lines, the pattern should be rewritten
  as ``r'(?m)^[^\S\n]*$'``.

  :func:`re.sub()` now replaces empty matches adjacent to a previous
  non-empty match.  For example ``re.sub('x*', '-', 'abxd')`` returns now
  ``'-a-b--d-'`` instead of ``'-a-b-d-'`` (the first minus between 'b' and
  'd' replaces 'x', and the second minus replaces an empty string between
  'x' and 'd').

  (Contributed by Serhiy Storchaka in :issue:`25054` and :issue:`32308`.)

* Change :func:`re.escape` to only escape regex special characters instead
  of escaping all characters other than ASCII letters, numbers, and ``'_'``.
  (Contributed by Serhiy Storchaka in :issue:`29995`.)

* :class:`tracemalloc.Traceback` frames are now sorted from oldest to most
  recent to be more consistent with :mod:`traceback`.
  (Contributed by Jesse Bakker in :issue:`32121`.)

* On OSes that support :const:`socket.SOCK_NONBLOCK` or
  :const:`socket.SOCK_CLOEXEC` bit flags, the
  :attr:`socket.type <socket.socket.type>` no longer has them applied.
  Therefore, checks like ``if sock.type == socket.SOCK_STREAM``
  work as expected on all platforms.
  (Contributed by Yury Selivanov in :issue:`32331`.)

* On Windows the default for the *close_fds* argument of
  :class:`subprocess.Popen` was changed from :const:`False` to :const:`True`
  when redirecting the standard handles. If you previously depended on handles
  being inherited when using :class:`subprocess.Popen` with standard io
  redirection, you will have to pass ``close_fds=False`` to preserve the
  previous behaviour, or use
  :attr:`STARTUPINFO.lpAttributeList <subprocess.STARTUPINFO.lpAttributeList>`.

* :meth:`importlib.machinery.PathFinder.invalidate_caches` -- which implicitly
  affects :func:`importlib.invalidate_caches` -- now deletes entries
  in :data:`sys.path_importer_cache` which are set to ``None``.
  (Contributed by Brett Cannon in :issue:`33169`.)

* In :mod:`asyncio`,
  :meth:`loop.sock_recv() <asyncio.AbstractEventLoop.sock_recv>`,
  :meth:`loop.sock_sendall() <asyncio.AbstractEventLoop.sock_sendall>`,
  :meth:`loop.sock_accept() <asyncio.AbstractEventLoop.sock_accept>`,
  :meth:`loop.getaddrinfo() <asyncio.AbstractEventLoop.getaddrinfo>`,
  :meth:`loop.getnameinfo() <asyncio.AbstractEventLoop.getnameinfo>`
  have been changed to be proper coroutine methods to match their
  documentation.  Previously, these methods returned :class:`asyncio.Future`
  instances.
  (Contributed by Yury Selivanov in :issue:`32327`.)

* :attr:`asyncio.Server.sockets` now returns a copy of the internal list
  of server sockets, instead of returning it directly.
  (Contributed by Yury Selivanov in :issue:`32662`.)

* :attr:`Struct.format <struct.Struct.format>` is now a :class:`str` instance
  instead of a :class:`bytes` instance.
  (Contributed by Victor Stinner in :issue:`21071`.)

* :meth:`ast.literal_eval()` is now stricter.  Addition and subtraction of
  arbitrary numbers are no longer allowed.
  (Contributed by Serhiy Storchaka in :issue:`31778`.)

* :meth:`Calendar.itermonthdates <calendar.Calendar.itermonthdates>`
  will now consistently raise an exception when a date falls outside of the
  ``0001-01-01`` through ``9999-12-31`` range.  To support applications that
  cannot tolerate such exceptions, the new
  :meth:`Calendar.itermonthdays3 <calendar.Calendar.itermonthdays3>` and
  :meth:`Calendar.itermonthdays4 <calendar.Calendar.itermonthdays4>` can be used.
  The new methods return tuples and are not restricted by the range supported by
  :class:`datetime.date`.
  (Contributed by Alexander Belopolsky in :issue:`28292`.)

* :class:`collections.ChainMap` now preserves the order of the underlying
  mappings.  (Contributed by Raymond Hettinger in :issue:`32792`.)

* The ``submit()`` method of :class:`concurrent.futures.ThreadPoolExecutor`
  and :class:`concurrent.futures.ProcessPoolExecutor` now raises
  a :exc:`RuntimeError` if called during interpreter shutdown.
  (Contributed by Mark Nemec in :issue:`33097`.)

* The :class:`configparser.ConfigParser` constructor now uses ``read_dict()``
  to process the default values, making its behavior consistent with the
  rest of the parser.  Non-string keys and values in the defaults
  dictionary are now being implicitly converted to strings.
  (Contributed by James Tocknell in :issue:`23835`.)


Changes in the C API
--------------------

The function :c:func:`PySlice_GetIndicesEx` is considered unsafe for
resizable sequences.  If the slice indices are not instances of :class:`int`,
but objects that implement the :meth:`!__index__` method, the sequence can be
resized after passing its length to :c:func:`!PySlice_GetIndicesEx`.  This
can lead to returning indices out of the length of the sequence.  For
avoiding possible problems use new functions :c:func:`PySlice_Unpack` and
:c:func:`PySlice_AdjustIndices`.
(Contributed by Serhiy Storchaka in :issue:`27867`.)


CPython bytecode changes
------------------------

There are two new opcodes: :opcode:`LOAD_METHOD` and :opcode:`CALL_METHOD`.
(Contributed by Yury Selivanov and INADA Naoki in :issue:`26110`.)

The :opcode:`STORE_ANNOTATION` opcode has been removed.
(Contributed by Mark Shannon in :issue:`32550`.)


Windows-only Changes
--------------------

The file used to override :data:`sys.path` is now called
``<python-executable>._pth`` instead of ``'sys.path'``.
See :ref:`finding_modules` for more information.
(Contributed by Steve Dower in :issue:`28137`.)


Other CPython implementation changes
------------------------------------

In preparation for potential future changes to the public CPython runtime
initialization API (see :pep:`432` for an initial, but somewhat outdated,
draft), CPython's internal startup
and configuration management logic has been significantly refactored. While
these updates are intended to be entirely transparent to both embedding
applications and users of the regular CPython CLI, they're being mentioned
here as the refactoring changes the internal order of various operations
during interpreter startup, and hence may uncover previously latent defects,
either in embedding applications, or in CPython itself.
(Initially contributed by Nick Coghlan and Eric Snow as part of
:issue:`22257`, and further updated by Nick, Eric, and Victor Stinner in a
number of other issues). Some known details affected:

* :c:func:`PySys_AddWarnOptionUnicode` is not currently usable by embedding
  applications due to the requirement to create a Unicode object prior to
  calling `Py_Initialize`. Use :c:func:`PySys_AddWarnOption` instead.

* warnings filters added by an embedding application with
  :c:func:`PySys_AddWarnOption` should now more consistently take precedence
  over the default filters set by the interpreter

Due to changes in the way the default warnings filters are configured,
setting :c:data:`Py_BytesWarningFlag` to a value greater than one is no longer
sufficient to both emit :exc:`BytesWarning` messages and have them converted
to exceptions.  Instead, the flag must be set (to cause the warnings to be
emitted in the first place), and an explicit ``error::BytesWarning``
warnings filter added to convert them to exceptions.

Due to a change in the way docstrings are handled by the compiler, the
implicit ``return None`` in a function body consisting solely of a docstring
is now marked as occurring on the same line as the docstring, not on the
function's header line.

The current exception state has been moved from the frame object to the co-routine.
This simplified the interpreter and fixed a couple of obscure bugs caused by
having swap exception state when entering or exiting a generator.
(Contributed by Mark Shannon in :issue:`25612`.)
