****************************
  What's New In Python 3.6
****************************

:Editors: Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@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 Mercurial log
   when researching a change.

This article explains the new features in Python 3.6, compared to 3.5.
Python 3.6 was released on December 23, 2016.  See the
`changelog <https://docs.python.org/3.6/whatsnew/changelog.html>`_ for a full
list of changes.

.. seealso::

    :pep:`494` - Python 3.6 Release Schedule


Summary -- Release highlights
=============================

New syntax features:

* :ref:`PEP 498 <whatsnew36-pep498>`, formatted string literals.

* :ref:`PEP 515 <whatsnew36-pep515>`, underscores in numeric literals.

* :ref:`PEP 526 <whatsnew36-pep526>`, syntax for variable annotations.

* :ref:`PEP 525 <whatsnew36-pep525>`, asynchronous generators.

* :ref:`PEP 530 <whatsnew36-pep530>`: asynchronous comprehensions.


New library modules:

* :mod:`secrets`: :ref:`PEP 506 -- Adding A Secrets Module To The Standard Library <whatsnew36-pep506>`.


CPython implementation improvements:

* The :ref:`dict <typesmapping>` type has been reimplemented to use
  a :ref:`more compact representation <whatsnew36-compactdict>`
  based on `a proposal by Raymond Hettinger
  <https://mail.python.org/pipermail/python-dev/2012-December/123028.html>`_
  and similar to the `PyPy dict implementation`_.  This resulted in dictionaries
  using 20% to 25% less memory when compared to Python 3.5.

* Customization of class creation has been simplified with the
  :ref:`new protocol <whatsnew36-pep487>`.

* The class attribute definition order is
  :ref:`now preserved  <whatsnew36-pep520>`.

* The order of elements in ``**kwargs`` now
  :ref:`corresponds to the order <whatsnew36-pep468>` in which keyword
  arguments were passed to the function.

* DTrace and SystemTap :ref:`probing support <whatsnew36-tracing>` has
  been added.

* The new :ref:`PYTHONMALLOC <whatsnew36-pythonmalloc>` environment variable
  can now be used to debug the interpreter memory allocation and access
  errors.


Significant improvements in the standard library:

* The :mod:`asyncio` module has received new features, significant
  usability and performance improvements, and a fair amount of bug fixes.
  Starting with Python 3.6 the ``asyncio`` module is no longer provisional
  and its API is considered stable.

* A new :ref:`file system path protocol <whatsnew36-pep519>` has been
  implemented to support :term:`path-like objects <path-like object>`.
  All standard library functions operating on paths have been updated to
  work with the new protocol.

* The :mod:`datetime` module has gained support for
  :ref:`Local Time Disambiguation <whatsnew36-pep495>`.

* The :mod:`typing` module received a number of
  :ref:`improvements <whatsnew36-typing>`.

* The :mod:`tracemalloc` module has been significantly reworked
  and is now used to provide better output for :exc:`ResourceWarning`
  as well as provide better diagnostics for memory allocation errors.
  See the :ref:`PYTHONMALLOC section <whatsnew36-pythonmalloc>` for more
  information.


Security improvements:

* The new :mod:`secrets` module has been added to simplify the generation of
  cryptographically strong pseudo-random numbers suitable for
  managing secrets such as account authentication, tokens, and similar.

* On Linux, :func:`os.urandom` now blocks until the system urandom entropy
  pool is initialized to increase the security. See the :pep:`524` for the
  rationale.

* The :mod:`hashlib` and :mod:`ssl` modules now support OpenSSL 1.1.0.

* The default settings and feature set of the :mod:`ssl` module have been
  improved.

* The :mod:`hashlib` module received support for the BLAKE2, SHA-3 and SHAKE
  hash algorithms and the :func:`~hashlib.scrypt` key derivation function.


Windows improvements:

* :ref:`PEP 528 <whatsnew36-pep529>` and :ref:`PEP 529 <whatsnew36-pep529>`,
  Windows filesystem and console encoding changed to UTF-8.

* The ``py.exe`` launcher, when used interactively, no longer prefers
  Python 2 over Python 3 when the user doesn't specify a version (via
  command line arguments or a config file).  Handling of shebang lines
  remains unchanged - "python" refers to Python 2 in that case.

* ``python.exe`` and ``pythonw.exe`` have been marked as long-path aware,
  which means that the 260 character path limit may no longer apply.
  See :ref:`removing the MAX_PATH limitation <max-path>` for details.

* A ``._pth`` file can be added to force isolated mode and fully specify
  all search paths to avoid registry and environment lookup. See
  :ref:`the documentation <finding_modules>` for more information.

* A ``python36.zip`` file now works as a landmark to infer
  :envvar:`PYTHONHOME`. See :ref:`the documentation <finding_modules>` for
  more information.


.. _PyPy dict implementation: https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html


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

.. _whatsnew36-pep498:

PEP 498: Formatted string literals
----------------------------------

:pep:`498` introduces a new kind of string literals: *f-strings*, or
:ref:`formatted string literals <f-strings>`.

Formatted string literals are prefixed with ``'f'`` and are similar to
the format strings accepted by :meth:`str.format`.  They contain replacement
fields surrounded by curly braces.  The replacement fields are expressions,
which are evaluated at run time, and then formatted using the
:func:`format` protocol::

    >>> name = "Fred"
    >>> f"He said his name is {name}."
    'He said his name is Fred.'
    >>> width = 10
    >>> precision = 4
    >>> value = decimal.Decimal("12.34567")
    >>> f"result: {value:{width}.{precision}}"  # nested fields
    'result:      12.35'

.. seealso::

    :pep:`498` -- Literal String Interpolation.
       PEP written and implemented by Eric V. Smith.

    :ref:`Feature documentation <f-strings>`.


.. _whatsnew36-pep526:

PEP 526: Syntax for variable annotations
----------------------------------------

:pep:`484` introduced the standard for type annotations of function
parameters, a.k.a. type hints. This PEP adds syntax to Python for annotating
the types of variables including class variables and instance variables::

    primes: List[int] = []

    captain: str  # Note: no initial value!

    class Starship:
        stats: Dict[str, int] = {}

Just as for function annotations, the Python interpreter does not attach any
particular meaning to variable annotations and only stores them in the
``__annotations__`` attribute of a class or module.

In contrast to variable declarations in statically typed languages,
the goal of annotation syntax is to provide an easy way to specify structured
type metadata for third party tools and libraries via the abstract syntax tree
and the ``__annotations__`` attribute.

.. seealso::

   :pep:`526` -- Syntax for variable annotations.
      PEP written by Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach,
      and Guido van Rossum. Implemented by Ivan Levkivskyi.

   Tools that use or will use the new syntax:
   `mypy <http://github.com/python/mypy>`_,
   `pytype <http://github.com/google/pytype>`_, PyCharm, etc.


.. _whatsnew36-pep515:

PEP 515: Underscores in Numeric Literals
----------------------------------------

:pep:`515` adds the ability to use underscores in numeric literals for
improved readability.  For example::

    >>> 1_000_000_000_000_000
    1000000000000000
    >>> 0x_FF_FF_FF_FF
    4294967295

Single underscores are allowed between digits and after any base
specifier.  Leading, trailing, or multiple underscores in a row are not
allowed.

The :ref:`string formatting <formatspec>` language also now has support
for the ``'_'`` option to signal the use of an underscore for a thousands
separator for floating point presentation types and for integer
presentation type ``'d'``.  For integer presentation types ``'b'``,
``'o'``, ``'x'``, and ``'X'``, underscores will be inserted every 4
digits::

    >>> '{:_}'.format(1000000)
    '1_000_000'
    >>> '{:_x}'.format(0xFFFFFFFF)
    'ffff_ffff'

.. seealso::

   :pep:`515` -- Underscores in Numeric Literals
      PEP written by Georg Brandl and Serhiy Storchaka.


.. _whatsnew36-pep525:

PEP 525: Asynchronous Generators
--------------------------------

:pep:`492` introduced support for native coroutines and ``async`` / ``await``
syntax to Python 3.5.  A notable limitation of the Python 3.5 implementation
is that it was not possible to use ``await`` and ``yield`` in the same
function body.  In Python 3.6 this restriction has been lifted, making it
possible to define *asynchronous generators*::

    async def ticker(delay, to):
        """Yield numbers from 0 to *to* every *delay* seconds."""
        for i in range(to):
            yield i
            await asyncio.sleep(delay)

The new syntax allows for faster and more concise code.

.. seealso::

   :pep:`525` -- Asynchronous Generators
      PEP written and implemented by Yury Selivanov.


.. _whatsnew36-pep530:

PEP 530: Asynchronous Comprehensions
------------------------------------

:pep:`530` adds support for using ``async for`` in list, set, dict
comprehensions and generator expressions::

    result = [i async for i in aiter() if i % 2]

Additionally, ``await`` expressions are supported in all kinds
of comprehensions::

    result = [await fun() for fun in funcs if await condition()]

.. seealso::

 :pep:`530` -- Asynchronous Comprehensions
    PEP written and implemented by Yury Selivanov.


.. _whatsnew36-pep487:

PEP 487: Simpler customization of class creation
------------------------------------------------

It is now possible to customize subclass creation without using a metaclass.
The new ``__init_subclass__`` classmethod will be called on the base class
whenever a new subclass is created::

    class PluginBase:
        subclasses = []

        def __init_subclass__(cls, **kwargs):
            super().__init_subclass__(**kwargs)
            cls.subclasses.append(cls)

    class Plugin1(PluginBase):
        pass

    class Plugin2(PluginBase):
        pass

In order to allow zero-argument :func:`super` calls to work correctly from
:meth:`~object.__init_subclass__` implementations, custom metaclasses must
ensure that the new ``__classcell__`` namespace entry is propagated to
``type.__new__`` (as described in :ref:`class-object-creation`).

.. seealso::

 :pep:`487` -- Simpler customization of class creation
    PEP written and implemented by Martin Teichmann.

 :ref:`Feature documentation <class-customization>`


.. _whatsnew36-pep487-descriptors:

PEP 487: Descriptor Protocol Enhancements
-----------------------------------------

:pep:`487` extends the descriptor protocol to include the new optional
:meth:`~object.__set_name__` method.  Whenever a new class is defined, the new
method will be called on all descriptors included in the definition, providing
them with a reference to the class being defined and the name given to the
descriptor within the class namespace.  In other words, instances of
descriptors can now know the attribute name of the descriptor in the
owner class::

    class IntField:
        def __get__(self, instance, owner):
            return instance.__dict__[self.name]

        def __set__(self, instance, value):
            if not isinstance(value, int):
                raise ValueError(f'expecting integer in {self.name}')
            instance.__dict__[self.name] = value

        # this is the new initializer:
        def __set_name__(self, owner, name):
            self.name = name

    class Model:
        int_field = IntField()


.. seealso::

    :pep:`487` -- Simpler customization of class creation
        PEP written and implemented by Martin Teichmann.

    :ref:`Feature documentation <descriptors>`


.. _whatsnew36-pep519:

PEP 519: Adding a file system path protocol
-------------------------------------------

File system paths have historically been represented as :class:`str`
or :class:`bytes` objects. This has led to people who write code which
operate on file system paths to assume that such objects are only one
of those two types (an :class:`int` representing a file descriptor
does not count as that is not a file path). Unfortunately that
assumption prevents alternative object representations of file system
paths like :mod:`pathlib` from working with pre-existing code,
including Python's standard library.

To fix this situation, a new interface represented by
:class:`os.PathLike` has been defined. By implementing the
:meth:`~os.PathLike.__fspath__` method, an object signals that it
represents a path. An object can then provide a low-level
representation of a file system path as a :class:`str` or
:class:`bytes` object. This means an object is considered
:term:`path-like <path-like object>` if it implements
:class:`os.PathLike` or is a :class:`str` or :class:`bytes` object
which represents a file system path. Code can use :func:`os.fspath`,
:func:`os.fsdecode`, or :func:`os.fsencode` to explicitly get a
:class:`str` and/or :class:`bytes` representation of a path-like
object.

The built-in :func:`open` function has been updated to accept
:class:`os.PathLike` objects, as have all relevant functions in the
:mod:`os` and :mod:`os.path` modules, and most other functions and
classes in the standard library.  The :class:`os.DirEntry` class
and relevant classes in :mod:`pathlib` have also been updated to
implement :class:`os.PathLike`.

The hope is that updating the fundamental functions for operating
on file system paths will lead to third-party code to implicitly
support all :term:`path-like objects <path-like object>` without any
code changes, or at least very minimal ones (e.g. calling
:func:`os.fspath` at the beginning of code before operating on a
path-like object).

Here are some examples of how the new interface allows for
:class:`pathlib.Path` to be used more easily and transparently with
pre-existing code::

  >>> import pathlib
  >>> with open(pathlib.Path("README")) as f:
  ...     contents = f.read()
  ...
  >>> import os.path
  >>> os.path.splitext(pathlib.Path("some_file.txt"))
  ('some_file', '.txt')
  >>> os.path.join("/a/b", pathlib.Path("c"))
  '/a/b/c'
  >>> import os
  >>> os.fspath(pathlib.Path("some_file.txt"))
  'some_file.txt'

(Implemented by Brett Cannon, Ethan Furman, Dusty Phillips, and Jelle Zijlstra.)

.. seealso::

    :pep:`519` -- Adding a file system path protocol
       PEP written by Brett Cannon and Koos Zevenhoven.


.. _whatsnew36-pep495:

PEP 495: Local Time Disambiguation
----------------------------------

In most world locations, there have been and will be times when local clocks
are moved back.  In those times, intervals are introduced in which local
clocks show the same time twice in the same day. In these situations, the
information displayed on a local clock (or stored in a Python datetime
instance) is insufficient to identify a particular moment in time.

:pep:`495` adds the new *fold* attribute to instances of
:class:`datetime.datetime` and :class:`datetime.time` classes to differentiate
between two moments in time for which local times are the same::

    >>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
    >>> for i in range(4):
    ...     u = u0 + i*HOUR
    ...     t = u.astimezone(Eastern)
    ...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
    ...
    04:00:00 UTC = 00:00:00 EDT 0
    05:00:00 UTC = 01:00:00 EDT 0
    06:00:00 UTC = 01:00:00 EST 1
    07:00:00 UTC = 02:00:00 EST 0

The values of the :attr:`fold <datetime.datetime.fold>` attribute have the
value ``0`` for all instances except those that represent the second
(chronologically) moment in time in an ambiguous case.

.. seealso::

  :pep:`495` -- Local Time Disambiguation
     PEP written by Alexander Belopolsky and Tim Peters, implementation
     by Alexander Belopolsky.


.. _whatsnew36-pep529:

PEP 529: Change Windows filesystem encoding to UTF-8
----------------------------------------------------

Representing filesystem paths is best performed with str (Unicode) rather than
bytes. However, there are some situations where using bytes is sufficient and
correct.

Prior to Python 3.6, data loss could result when using bytes paths on Windows.
With this change, using bytes to represent paths is now supported on Windows,
provided those bytes are encoded with the encoding returned by
:func:`sys.getfilesystemencoding()`, which now defaults to ``'utf-8'``.

Applications that do not use str to represent paths should use
:func:`os.fsencode()` and :func:`os.fsdecode()` to ensure their bytes are
correctly encoded. To revert to the previous behaviour, set
:envvar:`PYTHONLEGACYWINDOWSFSENCODING` or call
:func:`sys._enablelegacywindowsfsencoding`.

See :pep:`529` for more information and discussion of code modifications that
may be required.


.. _whatsnew36-pep528:

PEP 528: Change Windows console encoding to UTF-8
-------------------------------------------------

The default console on Windows will now accept all Unicode characters and
provide correctly read str objects to Python code. ``sys.stdin``,
``sys.stdout`` and ``sys.stderr`` now default to utf-8 encoding.

This change only applies when using an interactive console, and not when
redirecting files or pipes. To revert to the previous behaviour for interactive
console use, set :envvar:`PYTHONLEGACYWINDOWSIOENCODING`.

.. seealso::

   :pep:`528` -- Change Windows console encoding to UTF-8
      PEP written and implemented by Steve Dower.


.. _whatsnew36-pep520:

PEP 520: Preserving Class Attribute Definition Order
----------------------------------------------------

Attributes in a class definition body have a natural ordering: the same
order in which the names appear in the source.  This order is now
preserved in the new class's :attr:`~object.__dict__` attribute.

Also, the effective default class *execution* namespace (returned from
:ref:`type.__prepare__() <prepare>`) is now an insertion-order-preserving
mapping.

.. seealso::

   :pep:`520` -- Preserving Class Attribute Definition Order
      PEP written and implemented by Eric Snow.


.. _whatsnew36-pep468:

PEP 468: Preserving Keyword Argument Order
------------------------------------------

``**kwargs`` in a function signature is now guaranteed to be an
insertion-order-preserving mapping.

.. seealso::

   :pep:`468` -- Preserving Keyword Argument Order
      PEP written and implemented by Eric Snow.


.. _whatsnew36-compactdict:

New :ref:`dict <typesmapping>` implementation
---------------------------------------------

The :ref:`dict <typesmapping>` type now uses a "compact" representation
based on `a proposal by Raymond Hettinger
<https://mail.python.org/pipermail/python-dev/2012-December/123028.html>`_
which was `first implemented by PyPy
<https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html>`_.
The memory usage of the new :func:`dict` is between 20% and 25% smaller
compared to Python 3.5.

The order-preserving aspect of this new implementation is considered an
implementation detail and should not be relied upon (this may change in
the future, but it is desired to have this new dict implementation in
the language for a few releases before changing the language spec to mandate
order-preserving semantics for all current and future Python
implementations; this also helps preserve backwards-compatibility
with older versions of the language where random iteration order is
still in effect, e.g. Python 3.5).

(Contributed by INADA Naoki in :issue:`27350`. Idea
`originally suggested by Raymond Hettinger
<https://mail.python.org/pipermail/python-dev/2012-December/123028.html>`_.)


.. _whatsnew36-pep523:

PEP 523: Adding a frame evaluation API to CPython
-------------------------------------------------

While Python provides extensive support to customize how code
executes, one place it has not done so is in the evaluation of frame
objects.  If you wanted some way to intercept frame evaluation in
Python there really wasn't any way without directly manipulating
function pointers for defined functions.

:pep:`523` changes this by providing an API to make frame
evaluation pluggable at the C level. This will allow for tools such
as debuggers and JITs to intercept frame evaluation before the
execution of Python code begins. This enables the use of alternative
evaluation implementations for Python code, tracking frame
evaluation, etc.

This API is not part of the limited C API and is marked as private to
signal that usage of this API is expected to be limited and only
applicable to very select, low-level use-cases. Semantics of the
API will change with Python as necessary.

.. seealso::

  :pep:`523` -- Adding a frame evaluation API to CPython
     PEP written by Brett Cannon and Dino Viehland.


.. _whatsnew36-pythonmalloc:

PYTHONMALLOC environment variable
---------------------------------

The new :envvar:`PYTHONMALLOC` environment variable allows setting the Python
memory allocators and installing debug hooks.

It is now possible to install debug hooks on Python memory allocators on Python
compiled in release mode using ``PYTHONMALLOC=debug``. Effects of debug hooks:

* Newly allocated memory is filled with the byte ``0xCB``
* Freed memory is filled with the byte ``0xDB``
* Detect violations of the Python memory allocator API. For example,
  :c:func:`PyObject_Free` called on a memory block allocated by
  :c:func:`PyMem_Malloc`.
* Detect writes before the start of a buffer (buffer underflows)
* Detect writes after the end of a buffer (buffer overflows)
* Check that the :term:`GIL <global interpreter lock>` is held when allocator
  functions of :c:data:`PYMEM_DOMAIN_OBJ` (ex: :c:func:`PyObject_Malloc`) and
  :c:data:`PYMEM_DOMAIN_MEM` (ex: :c:func:`PyMem_Malloc`) domains are called.

Checking if the GIL is held is also a new feature of Python 3.6.

See the :c:func:`PyMem_SetupDebugHooks` function for debug hooks on Python
memory allocators.

It is now also possible to force the usage of the :c:func:`malloc` allocator of
the C library for all Python memory allocations using ``PYTHONMALLOC=malloc``.
This is helpful when using external memory debuggers like Valgrind on
a Python compiled in release mode.

On error, the debug hooks on Python memory allocators now use the
:mod:`tracemalloc` module to get the traceback where a memory block was
allocated.

Example of fatal error on buffer overflow using
``python3.6 -X tracemalloc=5`` (store 5 frames in traces)::

    Debug memory block at address p=0x7fbcd41666f8: API 'o'
        4 bytes originally requested
        The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
        The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
            at tail+0: 0x02 *** OUCH
            at tail+1: 0xfb
            at tail+2: 0xfb
            at tail+3: 0xfb
            at tail+4: 0xfb
            at tail+5: 0xfb
            at tail+6: 0xfb
            at tail+7: 0xfb
        The block was made by call #1233329 to debug malloc/realloc.
        Data at p: 1a 2b 30 00

    Memory block allocated at (most recent call first):
      File "test/test_bytes.py", line 323
      File "unittest/case.py", line 600
      File "unittest/case.py", line 648
      File "unittest/suite.py", line 122
      File "unittest/suite.py", line 84

    Fatal Python error: bad trailing pad byte

    Current thread 0x00007fbcdbd32700 (most recent call first):
      File "test/test_bytes.py", line 323 in test_hex
      File "unittest/case.py", line 600 in run
      File "unittest/case.py", line 648 in __call__
      File "unittest/suite.py", line 122 in run
      File "unittest/suite.py", line 84 in __call__
      File "unittest/suite.py", line 122 in run
      File "unittest/suite.py", line 84 in __call__
      ...

(Contributed by Victor Stinner in :issue:`26516` and :issue:`26564`.)


.. _whatsnew36-tracing:

DTrace and SystemTap probing support
------------------------------------

Python can now be built ``--with-dtrace`` which enables static markers
for the following events in the interpreter:

* function call/return

* garbage collection started/finished

* line of code executed.

This can be used to instrument running interpreters in production,
without the need to recompile specific debug builds or providing
application-specific profiling/debugging code.

More details in :ref:`instrumentation`.

The current implementation is tested on Linux and macOS.  Additional
markers may be added in the future.

(Contributed by Łukasz Langa in :issue:`21590`, based on patches by
Jesús Cea Avión, David Malcolm, and Nikhil Benesch.)


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

Some smaller changes made to the core Python language are:

* A ``global`` or ``nonlocal`` statement must now textually appear
  before the first use of the affected name in the same scope.
  Previously this was a ``SyntaxWarning``.

* It is now possible to set a :ref:`special method <specialnames>` to
  ``None`` to indicate that the corresponding operation is not available.
  For example, if a class sets :meth:`__iter__` to ``None``, the class
  is not iterable.
  (Contributed by Andrew Barnert and Ivan Levkivskyi in :issue:`25958`.)

* Long sequences of repeated traceback lines are now abbreviated as
  ``"[Previous line repeated {count} more times]"`` (see
  :ref:`whatsnew36-traceback` for an example).
  (Contributed by Emanuel Barry in :issue:`26823`.)

* Import now raises the new exception :exc:`ModuleNotFoundError`
  (subclass of :exc:`ImportError`) when it cannot find a module.  Code
  that currently checks for ImportError (in try-except) will still work.
  (Contributed by Eric Snow in :issue:`15767`.)

* Class methods relying on zero-argument ``super()`` will now work correctly
  when called from metaclass methods during class creation.
  (Contributed by Martin Teichmann in :issue:`23722`.)


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

.. _whatsnew36-pep506:

secrets
-------

The main purpose of the new :mod:`secrets` module is to provide an obvious way
to reliably generate cryptographically strong pseudo-random values suitable
for managing secrets, such as account authentication, tokens, and similar.

.. warning::

  Note that the pseudo-random generators in the :mod:`random` module
  should *NOT* be used for security purposes.  Use :mod:`secrets`
  on Python 3.6+ and :func:`os.urandom()` on Python 3.5 and earlier.

.. seealso::

    :pep:`506` -- Adding A Secrets Module To The Standard Library
      PEP written and implemented by Steven D'Aprano.


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

array
-----

Exhausted iterators of :class:`array.array` will now stay exhausted even
if the iterated array is extended.  This is consistent with the behavior
of other mutable sequences.

Contributed by Serhiy Storchaka in :issue:`26492`.

ast
---

The new :class:`ast.Constant` AST node has been added.  It can be used
by external AST optimizers for the purposes of constant folding.

Contributed by Victor Stinner in :issue:`26146`.


asyncio
-------

Starting with Python 3.6 the ``asyncio`` module is no longer provisional and its
API is considered stable.

Notable changes in the :mod:`asyncio` module since Python 3.5.0
(all backported to 3.5.x due to the provisional status):

* The :func:`~asyncio.get_event_loop` function has been changed to
  always return the currently running loop when called from couroutines
  and callbacks.
  (Contributed by Yury Selivanov in :issue:`28613`.)

* The :func:`~asyncio.ensure_future` function and all functions that
  use it, such as :meth:`loop.run_until_complete() <asyncio.BaseEventLoop.run_until_complete>`,
  now accept all kinds of :term:`awaitable objects <awaitable>`.
  (Contributed by Yury Selivanov.)

* New :func:`~asyncio.run_coroutine_threadsafe` function to submit
  coroutines to event loops from other threads.
  (Contributed by Vincent Michel.)

* New :meth:`Transport.is_closing() <asyncio.BaseTransport.is_closing>`
  method to check if the transport is closing or closed.
  (Contributed by Yury Selivanov.)

* The :meth:`loop.create_server() <asyncio.BaseEventLoop.create_server>`
  method can now accept a list of hosts.
  (Contributed by Yann Sionneau.)

* New :meth:`loop.create_future() <asyncio.BaseEventLoop.create_future>`
  method to create Future objects.  This allows alternative event
  loop implementations, such as
  `uvloop <https://github.com/MagicStack/uvloop>`_, to provide a faster
  :class:`asyncio.Future` implementation.
  (Contributed by Yury Selivanov in :issue:`27041`.)

* New :meth:`loop.get_exception_handler() <asyncio.BaseEventLoop.get_exception_handler>`
  method to get the current exception handler.
  (Contributed by Yury Selivanov in :issue:`27040`.)

* New :meth:`StreamReader.readuntil() <asyncio.StreamReader.readuntil>`
  method to read data from the stream until a separator bytes
  sequence appears.
  (Contributed by Mark Korenberg.)

* The performance of :meth:`StreamReader.readexactly() <asyncio.StreamReader.readexactly>`
  has been improved.
  (Contributed by Mark Korenberg in :issue:`28370`.)

* The :meth:`loop.getaddrinfo() <asyncio.BaseEventLoop.getaddrinfo>`
  method is optimized to avoid calling the system ``getaddrinfo``
  function if the address is already resolved.
  (Contributed by A. Jesse Jiryu Davis.)

* The :meth:`loop.stop() <asyncio.BaseEventLoop.stop>`
  method has been changed to stop the loop immediately after
  the current iteration.  Any new callbacks scheduled as a result
  of the last iteration will be discarded.
  (Contributed by Guido van Rossum in :issue:`25593`.)

* :meth:`Future.set_exception <asyncio.futures.Future.set_exception>`
  will now raise :exc:`TypeError` when passed an instance of
  the :exc:`StopIteration` exception.
  (Contributed by Chris Angelico in :issue:`26221`.)

* New :meth:`loop.connect_accepted_socket() <asyncio.BaseEventLoop.connect_accepted_socket>`
  method to be used by servers that accept connections outside of asyncio,
  but that use asyncio to handle them.
  (Contributed by Jim Fulton in :issue:`27392`.)

* ``TCP_NODELAY`` flag is now set for all TCP transports by default.
  (Contributed by Yury Selivanov in :issue:`27456`.)

* New :meth:`loop.shutdown_asyncgens() <asyncio.AbstractEventLoop.shutdown_asyncgens>`
  to properly close pending asynchronous generators before closing the
  loop.
  (Contributed by Yury Selivanov in :issue:`28003`.)

* :class:`Future <asyncio.Future>` and :class:`Task <asyncio.Task>`
  classes now have an optimized C implementation which makes asyncio
  code up to 30% faster.
  (Contributed by Yury Selivanov and INADA Naoki in :issue:`26081`
  and :issue:`28544`.)


binascii
--------

The :func:`~binascii.b2a_base64` function now accepts an optional *newline*
keyword argument to control whether the newline character is appended to the
return value.
(Contributed by Victor Stinner in :issue:`25357`.)


cmath
-----

The new :const:`cmath.tau` (τ) constant has been added.
(Contributed by Lisa Roach in :issue:`12345`, see :pep:`628` for details.)

New constants: :const:`cmath.inf` and :const:`cmath.nan` to
match :const:`math.inf` and :const:`math.nan`, and also :const:`cmath.infj`
and :const:`cmath.nanj` to match the format used by complex repr.
(Contributed by Mark Dickinson in :issue:`23229`.)


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

The new :class:`~collections.abc.Collection` abstract base class has been
added to represent sized iterable container classes.
(Contributed by Ivan Levkivskyi, docs by Neil Girdhar in :issue:`27598`.)

The new :class:`~collections.abc.Reversible` abstract base class represents
iterable classes that also provide the :meth:`__reversed__` method.
(Contributed by Ivan Levkivskyi in :issue:`25987`.)

The new :class:`~collections.abc.AsyncGenerator` abstract base class represents
asynchronous generators.
(Contributed by Yury Selivanov in :issue:`28720`.)

The :func:`~collections.namedtuple` function now accepts an optional
keyword argument *module*, which, when specified, is used for
the ``__module__`` attribute of the returned named tuple class.
(Contributed by Raymond Hettinger in :issue:`17941`.)

The *verbose* and *rename* arguments for
:func:`~collections.namedtuple` are now keyword-only.
(Contributed by Raymond Hettinger in :issue:`25628`.)

Recursive :class:`collections.deque` instances can now be pickled.
(Contributed by Serhiy Storchaka in :issue:`26482`.)


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

The :class:`ThreadPoolExecutor <concurrent.futures.ThreadPoolExecutor>`
class constructor now accepts an optional *thread_name_prefix* argument
to make it possible to customize the names of the threads created by the
pool.
(Contributed by Gregory P. Smith in :issue:`27664`.)


contextlib
----------

The :class:`contextlib.AbstractContextManager` class has been added to
provide an abstract base class for context managers.  It provides a
sensible default implementation for `__enter__()` which returns
``self`` and leaves `__exit__()` an abstract method.  A matching
class has been added to the :mod:`typing` module as
:class:`typing.ContextManager`.
(Contributed by Brett Cannon in :issue:`25609`.)


datetime
--------

The :class:`~datetime.datetime` and :class:`~datetime.time` classes have
the new :attr:`~time.fold` attribute used to disambiguate local time
when necessary.  Many functions in the :mod:`datetime` have been
updated to support local time disambiguation.
See :ref:`Local Time Disambiguation <whatsnew36-pep495>` section for more
information.
(Contributed by Alexander Belopolsky in :issue:`24773`.)

The :meth:`datetime.strftime() <datetime.datetime.strftime>` and
:meth:`date.strftime() <datetime.date.strftime>` methods now support
ISO 8601 date directives ``%G``, ``%u`` and ``%V``.
(Contributed by Ashley Anderson in :issue:`12006`.)

The :func:`datetime.isoformat() <datetime.datetime.isoformat>` function
now accepts an optional *timespec* argument that specifies the number
of additional components of the time value to include.
(Contributed by Alessandro Cucci and Alexander Belopolsky in :issue:`19475`.)

The :meth:`datetime.combine() <datetime.datetime.combine>` now
accepts an optional *tzinfo* argument.
(Contributed by Alexander Belopolsky in :issue:`27661`.)


decimal
-------

New :meth:`Decimal.as_integer_ratio() <decimal.Decimal.as_integer_ratio>`
method that returns a pair ``(n, d)`` of integers that represent the given
:class:`~decimal.Decimal` instance as a fraction, in lowest terms and
with a positive denominator::

    >>> Decimal('-3.14').as_integer_ratio()
    (-157, 50)

(Contributed by Stefan Krah amd Mark Dickinson in :issue:`25928`.)



distutils
---------

The ``default_format`` attribute has been removed from
:class:`distutils.command.sdist.sdist` and the ``formats``
attribute defaults to ``['gztar']``. Although not anticipated,
any code relying on the presence of ``default_format`` may
need to be adapted. See :issue:`27819` for more details.


email
-----

The new email API, enabled via the *policy* keyword to various constructors, is
no longer provisional.  The :mod:`email` documentation has been reorganized and
rewritten to focus on the new API, while retaining the old documentation for
the legacy API.  (Contributed by R. David Murray in :issue:`24277`.)

The :mod:`email.mime` classes now all accept an optional *policy* keyword.
(Contributed by Berker Peksag in :issue:`27331`.)

The :class:`~email.generator.DecodedGenerator` now supports the *policy*
keyword.

There is a new :mod:`~email.policy` attribute,
:attr:`~email.policy.Policy.message_factory`, that controls what class is used
by default when the parser creates new message objects.  For the
:attr:`email.policy.compat32` policy this is :class:`~email.message.Message`,
for the new policies it is :class:`~email.message.EmailMessage`.
(Contributed by R. David Murray in :issue:`20476`.)


encodings
---------

On Windows, added the ``'oem'`` encoding to use ``CP_OEMCP``, and the ``'ansi'``
alias for the existing ``'mbcs'`` encoding, which uses the ``CP_ACP`` code page.
(Contributed by Steve Dower in :issue:`27959`.)


enum
----

Two new enumeration base classes have been added to the :mod:`enum` module:
:class:`~enum.Flag` and :class:`~enum.IntFlags`.  Both are used to define
constants that can be combined using the bitwise operators.
(Contributed by Ethan Furman in :issue:`23591`.)

Many standard library modules have been updated to use the
:class:`~enum.IntFlags` class for their constants.

The new :class:`enum.auto` value can be used to assign values to enum
members automatically::

    >>> from enum import Enum, auto
    >>> class Color(Enum):
    ...     red = auto()
    ...     blue = auto()
    ...     green = auto()
    ...
    >>> list(Color)
    [<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]


faulthandler
------------

On Windows, the :mod:`faulthandler` module now installs a handler for Windows
exceptions: see :func:`faulthandler.enable`. (Contributed by Victor Stinner in
:issue:`23848`.)


fileinput
---------

:func:`~fileinput.hook_encoded` now supports the *errors* argument.
(Contributed by Joseph Hackman in :issue:`25788`.)


hashlib
-------

:mod:`hashlib` supports OpenSSL 1.1.0.  The minimum recommend version is 1.0.2.
(Contributed by Christian Heimes in :issue:`26470`.)

BLAKE2 hash functions were added to the module. :func:`~hashlib.blake2b`
and :func:`~hashlib.blake2s` are always available and support the full
feature set of BLAKE2.
(Contributed by Christian Heimes in :issue:`26798` based on code by
Dmitry Chestnykh and Samuel Neves. Documentation written by Dmitry Chestnykh.)

The SHA-3 hash functions :func:`~hashlib.sha3_224`, :func:`~hashlib.sha3_256`,
:func:`~hashlib.sha3_384`, :func:`~hashlib.sha3_512`, and SHAKE hash functions
:func:`~hashlib.shake_128` and :func:`~hashlib.shake_256` were added.
(Contributed by Christian Heimes in :issue:`16113`. Keccak Code Package
by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche, and
Ronny Van Keer.)

The password-based key derivation function :func:`~hashlib.scrypt` is now
available with OpenSSL 1.1.0 and newer.
(Contributed by Christian Heimes in :issue:`27928`.)

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

:meth:`HTTPConnection.request() <http.client.HTTPConnection.request>` and
:meth:`~http.client.HTTPConnection.endheaders` both now support
chunked encoding request bodies.
(Contributed by Demian Brecht and Rolf Krahl in :issue:`12319`.)


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

The idlelib package is being modernized and refactored to make IDLE look and
work better and to make the code easier to understand, test, and improve. Part
of making IDLE look better, especially on Linux and Mac, is using ttk widgets,
mostly in the dialogs.  As a result, IDLE no longer runs with tcl/tk 8.4.  It
now requires tcl/tk 8.5 or 8.6.  We recommend running the latest release of
either.

'Modernizing' includes renaming and consolidation of idlelib modules. The
renaming of files with partial uppercase names is similar to the renaming of,
for instance, Tkinter and TkFont to tkinter and tkinter.font in 3.0.  As a
result, imports of idlelib files that worked in 3.5 will usually not work in
3.6.  At least a module name change will be needed (see idlelib/README.txt),
sometimes more.  (Name changes contributed by Al Swiegart and Terry Reedy in
:issue:`24225`.  Most idlelib patches since have been and will be part of the
process.)

In compensation, the eventual result with be that some idlelib classes will be
easier to use, with better APIs and docstrings explaining them.  Additional
useful information will be added to idlelib when available.


importlib
---------

Import now raises the new exception :exc:`ModuleNotFoundError`
(subclass of :exc:`ImportError`) when it cannot find a module.  Code
that current checks for ``ImportError`` (in try-except) will still work.
(Contributed by Eric Snow in :issue:`15767`.)

:class:`importlib.util.LazyLoader` now calls
:meth:`~importlib.abc.Loader.create_module` on the wrapped loader, removing the
restriction that :class:`importlib.machinery.BuiltinImporter` and
:class:`importlib.machinery.ExtensionFileLoader` couldn't be used with
:class:`importlib.util.LazyLoader`.

:func:`importlib.util.cache_from_source`,
:func:`importlib.util.source_from_cache`, and
:func:`importlib.util.spec_from_file_location` now accept a
:term:`path-like object`.


inspect
-------

The :func:`inspect.signature() <inspect.signature>` function now reports the
implicit ``.0`` parameters generated by the compiler for comprehension and
generator expression scopes as if they were positional-only parameters called
``implicit0``. (Contributed by Jelle Zijlstra in :issue:`19611`.)

To reduce code churn when upgrading from Python 2.7 and the legacy
:func:`inspect.getargspec` API, the previously documented deprecation of
:func:`inspect.getfullargspec` has been reversed. While this function is
convenient for single/source Python 2/3 code bases, the richer
:func:`inspect.signature` interface remains the recommended approach for new
code. (Contributed by Nick Coghlan in :issue:`27172`)


json
----

:func:`json.load` and :func:`json.loads` now support binary input.  Encoded
JSON should be represented using either UTF-8, UTF-16, or UTF-32.
(Contributed by Serhiy Storchaka in :issue:`17909`.)


logging
-------

The new :meth:`WatchedFileHandler.reopenIfNeeded() <logging.handlers.WatchedFileHandler.reopenIfNeeded>`
method has been added to add the ability to check if the log file needs to
be reopened.
(Contributed by Marian Horban in :issue:`24884`.)


math
----

The tau (τ) constant has been added to the :mod:`math` and :mod:`cmath`
modules.
(Contributed by Lisa Roach in :issue:`12345`, see :pep:`628` for details.)


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

:ref:`Proxy Objects <multiprocessing-proxy_objects>` returned by
:func:`multiprocessing.Manager` can now be nested.
(Contributed by Davin Potts in :issue:`6766`.)


os
--

See the summary of :ref:`PEP 519 <whatsnew36-pep519>` for details on how the
:mod:`os` and :mod:`os.path` modules now support
:term:`path-like objects <path-like object>`.

:func:`~os.scandir` now supports :class:`bytes` paths on Windows.

A new :meth:`~os.scandir.close` method allows explicitly closing a
:func:`~os.scandir` iterator.  The :func:`~os.scandir` iterator now
supports the :term:`context manager` protocol.  If a :func:`scandir`
iterator is neither exhausted nor explicitly closed a :exc:`ResourceWarning`
will be emitted in its destructor.
(Contributed by Serhiy Storchaka in :issue:`25994`.)

On Linux, :func:`os.urandom` now blocks until the system urandom entropy pool
is initialized to increase the security. See the :pep:`524` for the rationale.

The Linux ``getrandom()`` syscall (get random bytes) is now exposed as the new
:func:`os.getrandom` function.
(Contributed by Victor Stinner, part of the :pep:`524`)


pathlib
-------

:mod:`pathlib` now supports :term:`path-like objects <path-like object>`.
(Contributed by Brett Cannon in :issue:`27186`.)

See the summary of :ref:`PEP 519 <whatsnew36-pep519>` for details.


pdb
---

The :class:`~pdb.Pdb` class constructor has a new optional *readrc* argument
to control whether ``.pdbrc`` files should be read.


pickle
------

Objects that need ``__new__`` called with keyword arguments can now be pickled
using :ref:`pickle protocols <pickle-protocols>` older than protocol version 4.
Protocol version 4 already supports this case.  (Contributed by Serhiy
Storchaka in :issue:`24164`.)


pickletools
-----------

:func:`pickletools.dis()` now outputs the implicit memo index for the
``MEMOIZE`` opcode.
(Contributed by Serhiy Storchaka in :issue:`25382`.)


pydoc
-----

The :mod:`pydoc` module has learned to respect the ``MANPAGER``
environment variable.
(Contributed by Matthias Klose in :issue:`8637`.)

:func:`help` and :mod:`pydoc` can now list named tuple fields in the
order they were defined rather than alphabetically.
(Contributed by Raymond Hettinger in :issue:`24879`.)


random
-------

The new :func:`~random.choices` function returns a list of elements of
specified size from the given population with optional weights.
(Contributed by Raymond Hettinger in :issue:`18844`.)


re
--

Added support of modifier spans in regular expressions.  Examples:
``'(?i:p)ython'`` matches ``'python'`` and ``'Python'``, but not ``'PYTHON'``;
``'(?i)g(?-i:v)r'`` matches ``'GvR'`` and ``'gvr'``, but not ``'GVR'``.
(Contributed by Serhiy Storchaka in :issue:`433028`.)

Match object groups can be accessed by ``__getitem__``, which is
equivalent to ``group()``.  So ``mo['name']`` is now equivalent to
``mo.group('name')``.  (Contributed by Eric Smith in :issue:`24454`.)

:class:`~re.Match` objects now support
:meth:`index-like objects <object.__index__>` as group
indices.
(Contributed by Jeroen Demeyer and Xiang Zhang in :issue:`27177`.)


readline
--------

Added :func:`~readline.set_auto_history` to enable or disable
automatic addition of input to the history list.  (Contributed by
Tyler Crompton in :issue:`26870`.)


rlcompleter
-----------

Private and special attribute names now are omitted unless the prefix starts
with underscores.  A space or a colon is added after some completed keywords.
(Contributed by Serhiy Storchaka in :issue:`25011` and :issue:`25209`.)


shlex
-----

The :class:`~shlex.shlex` has much
:ref:`improved shell compatibility <improved-shell-compatibility>`
through the new *punctuation_chars* argument to control which characters
are treated as punctuation.
(Contributed by Vinay Sajip in :issue:`1521950`.)


site
----

When specifying paths to add to :attr:`sys.path` in a `.pth` file,
you may now specify file paths on top of directories (e.g. zip files).
(Contributed by Wolfgang Langner in :issue:`26587`).


sqlite3
-------

:attr:`sqlite3.Cursor.lastrowid` now supports the ``REPLACE`` statement.
(Contributed by Alex LordThorsen in :issue:`16864`.)


socket
------

The :func:`~socket.socket.ioctl` function now supports the
:data:`~socket.SIO_LOOPBACK_FAST_PATH` control code.
(Contributed by Daniel Stokes in :issue:`26536`.)

The :meth:`~socket.socket.getsockopt` constants ``SO_DOMAIN``,
``SO_PROTOCOL``, ``SO_PEERSEC``, and ``SO_PASSSEC`` are now supported.
(Contributed by Christian Heimes in :issue:`26907`.)

The :meth:`~socket.socket.setsockopt` now supports the
``setsockopt(level, optname, None, optlen: int)`` form.
(Contributed by Christian Heimes in :issue:`27744`.)

The socket module now supports the address family
:data:`~socket.AF_ALG` to interface with Linux Kernel crypto API. ``ALG_*``,
``SOL_ALG`` and :meth:`~socket.socket.sendmsg_afalg` were added.
(Contributed by Christian Heimes in :issue:`27744` with support from
Victor Stinner.)

New Linux constants ``TCP_USER_TIMEOUT`` and ``TCP_CONGESTION`` were added.
(Contributed by Omar Sandoval, issue:`26273`).


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

Servers based on the :mod:`socketserver` module, including those
defined in :mod:`http.server`, :mod:`xmlrpc.server` and
:mod:`wsgiref.simple_server`, now support the :term:`context manager`
protocol.
(Contributed by Aviv Palivoda in :issue:`26404`.)

The :attr:`~socketserver.StreamRequestHandler.wfile` attribute of
:class:`~socketserver.StreamRequestHandler` classes now implements
the :class:`io.BufferedIOBase` writable interface.  In particular,
calling :meth:`~io.BufferedIOBase.write` is now guaranteed to send the
data in full.  (Contributed by Martin Panter in :issue:`26721`.)


ssl
---

:mod:`ssl` supports OpenSSL 1.1.0.  The minimum recommend version is 1.0.2.
(Contributed by Christian Heimes in :issue:`26470`.)

3DES has been removed from the default cipher suites and ChaCha20 Poly1305
cipher suites have been added.
(Contributed by Christian Heimes in :issue:`27850` and :issue:`27766`.)

:class:`~ssl.SSLContext` has better default configuration for options
and ciphers.
(Contributed by Christian Heimes in :issue:`28043`.)

SSL session can be copied from one client-side connection to another
with the new :class:`~ssl.SSLSession` class.  TLS session resumption can
speed up the initial handshake, reduce latency and improve performance
(Contributed by Christian Heimes in :issue:`19500` based on a draft by
Alex Warhawk.)

The new :meth:`~ssl.SSLContext.get_ciphers` method can be used to
get a list of enabled ciphers in order of cipher priority.

All constants and flags have been converted to :class:`~enum.IntEnum` and
:class:`~enum.IntFlags`.
(Contributed by Christian Heimes in :issue:`28025`.)

Server and client-side specific TLS protocols for :class:`~ssl.SSLContext`
were added.
(Contributed by Christian Heimes in :issue:`28085`.)


statistics
----------

A new :func:`~statistics.harmonic_mean` function has been added.
(Contributed by Steven D'Aprano in :issue:`27181`.)


struct
------

:mod:`struct` now supports IEEE 754 half-precision floats via the ``'e'``
format specifier.
(Contributed by Eli Stevens, Mark Dickinson in :issue:`11734`.)


subprocess
----------

:class:`subprocess.Popen` destructor now emits a :exc:`ResourceWarning` warning
if the child process is still running. Use the context manager protocol (``with
proc: ...``) or explicitly call the :meth:`~subprocess.Popen.wait` method to
read the exit status of the child process. (Contributed by Victor Stinner in
:issue:`26741`.)

The :class:`subprocess.Popen` constructor and all functions that pass arguments
through to it now accept *encoding* and *errors* arguments. Specifying either
of these will enable text mode for the *stdin*, *stdout* and *stderr* streams.
(Contributed by Steve Dower in :issue:`6135`.)


sys
---

The new :func:`~sys.getfilesystemencodeerrors` function returns the name of
the error mode used to convert between Unicode filenames and bytes filenames.
(Contributed by Steve Dower in :issue:`27781`.)

On Windows the return value of the :func:`~sys.getwindowsversion` function
now includes the *platform_version* field which contains the accurate major
version, minor version and build number of the current operating system,
rather than the version that is being emulated for the process
(Contributed by Steve Dower in :issue:`27932`.)


telnetlib
---------

:class:`~telnetlib.Telnet` is now a context manager (contributed by
Stéphane Wirtel in :issue:`25485`).


time
----

The :class:`~time.struct_time` attributes :attr:`tm_gmtoff` and
:attr:`tm_zone` are now available on all platforms.


timeit
------

The new :meth:`Timer.autorange() <timeit.Timer.autorange>` convenience
method has been added to call :meth:`Timer.timeit() <timeit.Timer.timeit>`
repeatedly so that the total run time is greater or equal to 200 milliseconds.
(Contributed by Steven D'Aprano in :issue:`6422`.)

:mod:`timeit` now warns when there is substantial (4x) variance
between best and worst times.
(Contributed by Serhiy Storchaka in :issue:`23552`.)


tkinter
-------

Added methods :meth:`~tkinter.Variable.trace_add`,
:meth:`~tkinter.Variable.trace_remove` and :meth:`~tkinter.Variable.trace_info`
in the :class:`tkinter.Variable` class.  They replace old methods
:meth:`~tkinter.Variable.trace_variable`, :meth:`~tkinter.Variable.trace`,
:meth:`~tkinter.Variable.trace_vdelete` and
:meth:`~tkinter.Variable.trace_vinfo` that use obsolete Tcl commands and might
not work in future versions of Tcl.
(Contributed by Serhiy Storchaka in :issue:`22115`).


.. _whatsnew36-traceback:

traceback
---------

Both the traceback module and the interpreter's builtin exception display now
abbreviate long sequences of repeated lines in tracebacks as shown in the
following example::

    >>> def f(): f()
    ...
    >>> f()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 1, in f
      File "<stdin>", line 1, in f
      File "<stdin>", line 1, in f
      [Previous line repeated 995 more times]
    RecursionError: maximum recursion depth exceeded

(Contributed by Emanuel Barry in :issue:`26823`.)


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

The :mod:`tracemalloc` module now supports tracing memory allocations in
multiple different address spaces.

The new :class:`~tracemalloc.DomainFilter` filter class has been added
to filter block traces by their address space (domain).

(Contributed by Victor Stinner in :issue:`26588`.)


.. _whatsnew36-typing:

typing
------

Since the :mod:`typing` module is :term:`provisional <provisional api>`,
all changes introduced in Python 3.6 have also been
backported to Python 3.5.x.

The :mod:`typing` module has a much improved support for generic type
aliases.  For example ``Dict[str, Tuple[S, T]]`` is now a valid
type annotation.
(Contributed by Guido van Rossum in `Github #195
<https://github.com/python/typing/pull/195>`_.)

The :class:`typing.ContextManager` class has been added for
representing :class:`contextlib.AbstractContextManager`.
(Contributed by Brett Cannon in :issue:`25609`.)

The :class:`typing.Collection` class has been added for
representing :class:`collections.abc.Collection`.
(Contributed by Ivan Levkivskyi in :issue:`27598`.)

The :const:`typing.ClassVar` type construct has been added to
mark class variables.  As introduced in :pep:`526`, a variable annotation
wrapped in ClassVar indicates that a given attribute is intended to be used as
a class variable and should not be set on instances of that class.
(Contributed by Ivan Levkivskyi in `Github #280
<https://github.com/python/typing/issues/280>`_.)

A new :const:`~typing.TYPE_CHECKING` constant that is assumed to be
``True`` by the static type chekers, but is ``False`` at runtime.
(Contributed by Guido van Rossum in `Github #230
<https://github.com/python/typing/issues/230>`_.)

A new :func:`~typing.NewType` helper function has been added to create
lightweight distinct types for annotations::

    from typing import NewType

    UserId = NewType('UserId', int)
    some_id = UserId(524313)

The static type checker will treat the new type as if it were a subclass
of the original type.  (Contributed by Ivan Levkivskyi in `Github #189
<https://github.com/python/typing/issues/189>`_.)


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

The :mod:`unicodedata` module now uses data from `Unicode 9.0.0
<http://unicode.org/versions/Unicode9.0.0/>`_.
(Contributed by Benjamin Peterson.)


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

The :class:`~unittest.mock.Mock` class has the following improvements:

* Two new methods, :meth:`Mock.assert_called()
  <unittest.mock.Mock.assert_called>` and :meth:`Mock.assert_called_once()
  <unittest.mock.Mock.assert_called_once>` to check if the mock object
  was called.
  (Contributed by Amit Saha in :issue:`26323`.)

* The :meth:`Mock.reset_mock() <unittest.mock.Mock.reset_mock>` method
  now has two optional keyword only arguments: *return_value* and
  *side_effect*.
  (Contributed by Kushal Das in :issue:`21271`.)


urllib.request
--------------

If a HTTP request has a file or iterable body (other than a
bytes object) but no ``Content-Length`` header, rather than
throwing an error, :class:`~urllib.request.AbstractHTTPHandler` now
falls back to use chunked transfer encoding.
(Contributed by Demian Brecht and Rolf Krahl in :issue:`12319`.)


urllib.robotparser
------------------

:class:`~urllib.robotparser.RobotFileParser` now supports the ``Crawl-delay`` and
``Request-rate`` extensions.
(Contributed by Nikolay Bogoychev in :issue:`16099`.)


venv
----

:mod:`venv` accepts a new parameter ``--prompt``. This parameter provides an
alternative prefix for the virtual environment. (Proposed by Łukasz Balcerzak
and ported to 3.6 by Stéphane Wirtel in :issue:`22829`.)


warnings
--------

A new optional *source* parameter has been added to the
:func:`warnings.warn_explicit` function: the destroyed object which emitted a
:exc:`ResourceWarning`. A *source* attribute has also been added to
:class:`warnings.WarningMessage` (contributed by Victor Stinner in
:issue:`26568` and :issue:`26567`).

When a :exc:`ResourceWarning` warning is logged, the :mod:`tracemalloc` module is now
used to try to retrieve the traceback where the destroyed object was allocated.

Example with the script ``example.py``::

    import warnings

    def func():
        return open(__file__)

    f = func()
    f = None

Output of the command ``python3.6 -Wd -X tracemalloc=5 example.py``::

    example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
      f = None
    Object allocated at (most recent call first):
      File "example.py", lineno 4
        return open(__file__)
      File "example.py", lineno 6
        f = func()

The "Object allocated at" traceback is new and is only displayed if
:mod:`tracemalloc` is tracing Python memory allocations and if the
:mod:`warnings` module was already imported.


winreg
------

Added the 64-bit integer type :data:`REG_QWORD <winreg.REG_QWORD>`.
(Contributed by Clement Rouault in :issue:`23026`.)


winsound
--------

Allowed keyword arguments to be passed to :func:`Beep <winsound.Beep>`,
:func:`MessageBeep <winsound.MessageBeep>`, and :func:`PlaySound
<winsound.PlaySound>` (:issue:`27982`).


xmlrpc.client
-------------

The :mod:`xmlrpc.client` module now supports unmarshalling
additional data types used by the Apache XML-RPC implementation
for numerics and ``None``.
(Contributed by Serhiy Storchaka in :issue:`26885`.)


zipfile
-------

A new :meth:`ZipInfo.from_file() <zipfile.ZipInfo.from_file>` class method
allows making a :class:`~zipfile.ZipInfo` instance from a filesystem file.
A new :meth:`ZipInfo.is_dir() <zipfile.ZipInfo.is_dir>` method can be used
to check if the :class:`~zipfile.ZipInfo` instance represents a directory.
(Contributed by Thomas Kluyver in :issue:`26039`.)

The :meth:`ZipFile.open() <zipfile.ZipFile.open>` method can now be used to
write data into a ZIP file, as well as for extracting data.
(Contributed by Thomas Kluyver in :issue:`26039`.)


zlib
----

The :func:`~zlib.compress` and :func:`~zlib.decompress` functions now accept
keyword arguments.
(Contributed by Aviv Palivoda in :issue:`26243` and
Xiang Zhang in :issue:`16764` respectively.)


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

* The Python interpreter now uses a 16-bit wordcode instead of bytecode which
  made a number of opcode optimizations possible.
  (Contributed by Demur Rumed with input and reviews from
  Serhiy Storchaka and Victor Stinner in :issue:`26647` and :issue:`28050`.)

* The :class:`asyncio.Future` class now has an optimized C implementation.
  (Contributed by Yury Selivanov and INADA Naoki in :issue:`26081`.)

* The :class:`asyncio.Task` class now has an optimized
  C implementation. (Contributed by Yury Selivanov in :issue:`28544`.)

* Various implementation improvements in the :mod:`typing` module
  (such as caching of generic types) allow up to 30 times performance
  improvements and reduced memory footprint.

* The ASCII decoder is now up to 60 times as fast for error handlers
  ``surrogateescape``, ``ignore`` and ``replace`` (Contributed
  by Victor Stinner in :issue:`24870`).

* The ASCII and the Latin1 encoders are now up to 3 times as fast for the
  error handler ``surrogateescape``
  (Contributed by Victor Stinner in :issue:`25227`).

* The UTF-8 encoder is now up to 75 times as fast for error handlers
  ``ignore``, ``replace``, ``surrogateescape``, ``surrogatepass`` (Contributed
  by Victor Stinner in :issue:`25267`).

* The UTF-8 decoder is now up to 15 times as fast for error handlers
  ``ignore``, ``replace`` and ``surrogateescape`` (Contributed
  by Victor Stinner in :issue:`25301`).

* ``bytes % args`` is now up to 2 times faster. (Contributed by Victor Stinner
  in :issue:`25349`).

* ``bytearray % args`` is now between 2.5 and 5 times faster. (Contributed by
  Victor Stinner in :issue:`25399`).

* Optimize :meth:`bytes.fromhex` and :meth:`bytearray.fromhex`: they are now
  between 2x and 3.5x faster. (Contributed by Victor Stinner in :issue:`25401`).

* Optimize ``bytes.replace(b'', b'.')`` and ``bytearray.replace(b'', b'.')``:
  up to 80% faster. (Contributed by Josh Snider in :issue:`26574`).

* Allocator functions of the :c:func:`PyMem_Malloc` domain
  (:c:data:`PYMEM_DOMAIN_MEM`) now use the :ref:`pymalloc memory allocator
  <pymalloc>` instead of :c:func:`malloc` function of the C library. The
  pymalloc allocator is optimized for objects smaller or equal to 512 bytes
  with a short lifetime, and use :c:func:`malloc` for larger memory blocks.
  (Contributed by Victor Stinner in :issue:`26249`).

* :func:`pickle.load` and :func:`pickle.loads` are now up to 10% faster when
  deserializing many small objects (Contributed by Victor Stinner in
  :issue:`27056`).

* Passing :term:`keyword arguments <keyword argument>` to a function has an
  overhead in comparison with passing :term:`positional arguments
  <positional argument>`.  Now in extension functions implemented with using
  Argument Clinic this overhead is significantly decreased.
  (Contributed by Serhiy Storchaka in :issue:`27574`).

* Optimized :func:`~glob.glob` and :func:`~glob.iglob` functions in the
  :mod:`glob` module; they are now about 3--6 times faster.
  (Contributed by Serhiy Storchaka in :issue:`25596`).

* Optimized globbing in :mod:`pathlib` by using :func:`os.scandir`;
  it is now about 1.5--4 times faster.
  (Contributed by Serhiy Storchaka in :issue:`26032`).

* :class:`xml.etree.ElementTree` parsing, iteration and deepcopy performance
  has been significantly improved.
  (Contributed by Serhiy Storchaka in :issue:`25638`, :issue:`25873`,
  and :issue:`25869`.)

* Creation of :class:`fractions.Fraction` instances from floats and
  decimals is now 2 to 3 times faster.
  (Contributed by Serhiy Storchaka in :issue:`25971`.)


Build and C API Changes
=======================

* Python now requires some C99 support in the toolchain to build.
  Most notably, Python now uses standard integer types and macros in
  place of custom macros like ``PY_LONG_LONG``.
  For more information, see :pep:`7` and :issue:`17884`.

* Cross-compiling CPython with the Android NDK and the Android API level set to
  21 (Android 5.0 Lollilop) or greater runs successfully. While Android is not
  yet a supported platform, the Python test suite runs on the Android emulator
  with only about 16 tests failures. See the Android meta-issue :issue:`26865`.

* The ``--enable-optimizations`` configure flag has been added. Turning it on
  will activate expensive optimizations like PGO.
  (Original patch by Alecsandru Patrascu of Intel in :issue:`26359`.)

* The :term:`GIL <global interpreter lock>` must now be held when allocator
  functions of :c:data:`PYMEM_DOMAIN_OBJ` (ex: :c:func:`PyObject_Malloc`) and
  :c:data:`PYMEM_DOMAIN_MEM` (ex: :c:func:`PyMem_Malloc`) domains are called.

* New :c:func:`Py_FinalizeEx` API which indicates if flushing buffered data
  failed.
  (Contributed by Martin Panter in :issue:`5319`.)

* :c:func:`PyArg_ParseTupleAndKeywords` now supports :ref:`positional-only
  parameters <positional-only_parameter>`.  Positional-only parameters are
  defined by empty names.
  (Contributed by Serhiy Storchaka in :issue:`26282`).

* ``PyTraceback_Print`` method now abbreviates long sequences of repeated lines
  as ``"[Previous line repeated {count} more times]"``.
  (Contributed by Emanuel Barry in :issue:`26823`.)

* The new :c:func:`PyErr_SetImportErrorSubclass` function allows for
  specifying a subclass of :exc:`ImportError` to raise.
  (Contributed by Eric Snow in :issue:`15767`.)

* The new :c:func:`PyErr_ResourceWarning` function can be used to generate
  a :exc:`ResourceWarning` providing the source of the resource allocation.
  (Contributed by Victor Stinner in :issue:`26567`.)

* The new :c:func:`PyOS_FSPath` function returns the file system
  representation of a :term:`path-like object`.
  (Contributed by Brett Cannon in :issue:`27186`.)

* The :c:func:`PyUnicode_FSConverter` and :c:func:`PyUnicode_FSDecoder`
  functions will now accept :term:`path-like objects <path-like object>`.


Other Improvements
==================

* When :option:`--version` (short form: :option:`-V`) is supplied twice,
  Python prints :data:`sys.version` for detailed information.

  .. code-block:: shell-session

    $ ./python -VV
    Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
    [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]


Deprecated
==========

New Keywords
------------

``async`` and ``await`` are not recommended to be used as variable, class,
function or module names.  Introduced by :pep:`492` in Python 3.5, they will
become proper keywords in Python 3.7.  Starting in Python 3.6, the use of
``async`` or ``await`` as names will generate a :exc:`DeprecationWarning`.


Deprecated Python behavior
--------------------------

Raising the :exc:`StopIteration` exception inside a generator will now
generate a :exc:`DeprecationWarning`, and will trigger a :exc:`RuntimeError`
in Python 3.7.  See :ref:`whatsnew-pep-479` for details.

The :meth:`__aiter__` method is now expected to return an asynchronous
iterator directly instead of returning an awaitable as previously.
Doing the former will trigger a :exc:`DeprecationWarning`.  Backward
compatibility will be removed in Python 3.7.
(Contributed by Yury Selivanov in :issue:`27243`.)

A backslash-character pair that is not a valid escape sequence now generates
a :exc:`DeprecationWarning`.  Although this will eventually become a
:exc:`SyntaxError`, that will not be for several Python releases.
(Contributed by Emanuel Barry in :issue:`27364`.)

When performing a relative import, falling back on ``__name__`` and
``__path__`` from the calling module when ``__spec__`` or
``__package__`` are not defined now raises an :exc:`ImportWarning`.
(Contributed by Rose Ames in :issue:`25791`.)


Deprecated Python modules, functions and methods
------------------------------------------------

asynchat
~~~~~~~~

The :mod:`asynchat` has been deprecated in favor of :mod:`asyncio`.
(Contributed by Mariatta in :issue:`25002`.)


asyncore
~~~~~~~~

The :mod:`asyncore` has been deprecated in favor of :mod:`asyncio`.
(Contributed by Mariatta in :issue:`25002`.)


dbm
~~~

Unlike other :mod:`dbm` implementations, the :mod:`dbm.dumb` module
creates databases with the ``'rw'`` mode and allows modifying the database
opened with the ``'r'`` mode.  This behavior is now deprecated and will
be removed in 3.8.
(Contributed by Serhiy Storchaka in :issue:`21708`.)


distutils
~~~~~~~~~

The undocumented ``extra_path`` argument to the
:class:`~distutils.Distribution` constructor is now considered deprecated
and will raise a warning if set.   Support for this parameter will be
removed in a future Python release.  See :issue:`27919` for details.


grp
~~~

The support of non-integer arguments in :func:`~grp.getgrgid` has been
deprecated.
(Contributed by Serhiy Storchaka in :issue:`26129`.)


importlib
~~~~~~~~~

The :meth:`importlib.machinery.SourceFileLoader.load_module` and
:meth:`importlib.machinery.SourcelessFileLoader.load_module` methods
are now deprecated. They were the only remaining implementations of
:meth:`importlib.abc.Loader.load_module` in :mod:`importlib` that had not
been deprecated in previous versions of Python in favour of
:meth:`importlib.abc.Loader.exec_module`.

The :class:`importlib.machinery.WindowsRegistryFinder` class is now
deprecated. As of 3.6.0, it is still added to :attr:`sys.meta_path` by
default (on Windows), but this may change in future releases.

os
~~

Undocumented support of general :term:`bytes-like objects <bytes-like object>`
as paths in :mod:`os` functions, :func:`compile` and similar functions is
now deprecated.
(Contributed by Serhiy Storchaka in :issue:`25791` and :issue:`26754`.)

re
~~

Support for inline flags ``(?letters)`` in the middle of the regular
expression has been deprecated and will be removed in a future Python
version.  Flags at the start of a regular expression are still allowed.
(Contributed by Serhiy Storchaka in :issue:`22493`.)

ssl
~~~

OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported.
In the future the :mod:`ssl` module will require at least OpenSSL 1.0.2 or
1.1.0.

SSL-related arguments like ``certfile``, ``keyfile`` and ``check_hostname``
in :mod:`ftplib`, :mod:`http.client`, :mod:`imaplib`, :mod:`poplib`,
and :mod:`smtplib` have been deprecated in favor of ``context``.
(Contributed by Christian Heimes in :issue:`28022`.)

A couple of protocols and functions of the :mod:`ssl` module are now
deprecated. Some features will no longer be available in future versions
of OpenSSL. Other features are deprecated in favor of a different API.
(Contributed by Christian Heimes in :issue:`28022` and :issue:`26470`.)

tkinter
~~~~~~~

The :mod:`tkinter.tix` module is now deprecated.  :mod:`tkinter` users
should use :mod:`tkinter.ttk` instead.

venv
~~~~

The ``pyvenv`` script has been deprecated in favour of ``python3 -m venv``.
This prevents confusion as to what Python interpreter ``pyvenv`` is
connected to and thus what Python interpreter will be used by the virtual
environment.  (Contributed by Brett Cannon in :issue:`25154`.)


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

Undocumented functions :c:func:`PyUnicode_AsEncodedObject`,
:c:func:`PyUnicode_AsDecodedObject`, :c:func:`PyUnicode_AsEncodedUnicode`
and :c:func:`PyUnicode_AsDecodedUnicode` are deprecated now.
Use the :ref:`generic codec based API <codec-registry>` instead.


Deprecated Build Options
------------------------

The ``--with-system-ffi`` configure flag is now on by default on non-macOS
UNIX platforms.  It may be disabled by using ``--without-system-ffi``, but
using the flag is deprecated and will not be accepted in Python 3.7.
macOS is unaffected by this change.  Note that many OS distributors already
use the ``--with-system-ffi`` flag when building their system Python.


Removed
=======

API and Feature Removals
------------------------

* Unknown escapes consisting of ``'\'`` and an ASCII letter in
  regular expressions will now cause an error.  In replacement templates for
  :func:`re.sub` they are still allowed, but deprecated.
  The :const:`re.LOCALE` flag can now only be used with binary patterns.

* ``inspect.getmoduleinfo()`` was removed (was deprecated since CPython 3.3).
  :func:`inspect.getmodulename` should be used for obtaining the module
  name for a given path.
  (Contributed by Yury Selivanov in :issue:`13248`.)

* ``traceback.Ignore`` class and ``traceback.usage``, ``traceback.modname``,
  ``traceback.fullmodname``, ``traceback.find_lines_from_code``,
  ``traceback.find_lines``, ``traceback.find_strings``,
  ``traceback.find_executable_lines`` methods were removed from the
  :mod:`traceback` module. They were undocumented methods deprecated since
  Python 3.2 and equivalent functionality is available from private methods.

* The ``tk_menuBar()`` and ``tk_bindForTraversal()`` dummy methods in
  :mod:`tkinter` widget classes were removed (corresponding Tk commands
  were obsolete since Tk 4.0).

* The :meth:`~zipfile.ZipFile.open` method of the :class:`zipfile.ZipFile`
  class no longer supports the ``'U'`` mode (was deprecated since Python 3.4).
  Use :class:`io.TextIOWrapper` for reading compressed text files in
  :term:`universal newlines` mode.

* The undocumented ``IN``, ``CDROM``, ``DLFCN``, ``TYPES``, ``CDIO``, and
  ``STROPTS`` modules have been removed.  They had been available in the
  platform specific ``Lib/plat-*/`` directories, but were chronically out of
  date, inconsistently available across platforms, and unmaintained.  The
  script that created these modules is still available in the source
  distribution at :source:`Tools/scripts/h2py.py`.

* The deprecated ``asynchat.fifo`` class has been removed.


Porting to Python 3.6
=====================

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

Changes in 'python' Command Behavior
------------------------------------

* The output of a special Python build with defined ``COUNT_ALLOCS``,
  ``SHOW_ALLOC_COUNT`` or ``SHOW_TRACK_COUNT`` macros is now off by
  default.  It can be re-enabled using the ``-X showalloccount`` option.
  It now outputs to ``stderr`` instead of ``stdout``.
  (Contributed by Serhiy Storchaka in :issue:`23034`.)


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

* :func:`open() <open>` will no longer allow combining the ``'U'`` mode flag
  with ``'+'``.
  (Contributed by Jeff Balogh and John O'Connor in :issue:`2091`.)

* :mod:`sqlite3` no longer implicitly commits an open transaction before DDL
  statements.

* On Linux, :func:`os.urandom` now blocks until the system urandom entropy pool
  is initialized to increase the security.

* When :meth:`importlib.abc.Loader.exec_module` is defined,
  :meth:`importlib.abc.Loader.create_module` must also be defined.

* :c:func:`PyErr_SetImportError` now sets :exc:`TypeError` when its **msg**
  argument is not set. Previously only ``NULL`` was returned.

* The format of the ``co_lnotab`` attribute of code objects changed to support
  a negative line number delta. By default, Python does not emit bytecode with
  a negative line number delta. Functions using ``frame.f_lineno``,
  ``PyFrame_GetLineNumber()`` or ``PyCode_Addr2Line()`` are not affected.
  Functions directly decoding ``co_lnotab`` should be updated to use a signed
  8-bit integer type for the line number delta, but this is only required to
  support applications using a negative line number delta. See
  ``Objects/lnotab_notes.txt`` for the ``co_lnotab`` format and how to decode
  it, and see the :pep:`511` for the rationale.

* The functions in the :mod:`compileall` module now return booleans instead
  of ``1`` or ``0`` to represent success or failure, respectively. Thanks to
  booleans being a subclass of integers, this should only be an issue if you
  were doing identity checks for ``1`` or ``0``. See :issue:`25768`.

* Reading the :attr:`~urllib.parse.SplitResult.port` attribute of
  :func:`urllib.parse.urlsplit` and :func:`~urllib.parse.urlparse` results
  now raises :exc:`ValueError` for out-of-range values, rather than
  returning :const:`None`.  See :issue:`20059`.

* The :mod:`imp` module now raises a :exc:`DeprecationWarning` instead of
  :exc:`PendingDeprecationWarning`.

* The following modules have had missing APIs added to their :attr:`__all__`
  attributes to match the documented APIs:
  :mod:`calendar`, :mod:`cgi`, :mod:`csv`,
  :mod:`~xml.etree.ElementTree`, :mod:`enum`,
  :mod:`fileinput`, :mod:`ftplib`, :mod:`logging`, :mod:`mailbox`,
  :mod:`mimetypes`, :mod:`optparse`, :mod:`plistlib`, :mod:`smtpd`,
  :mod:`subprocess`, :mod:`tarfile`, :mod:`threading` and
  :mod:`wave`.  This means they will export new symbols when ``import *``
  is used.
  (Contributed by Joel Taddei and Jacek Kołodziej in :issue:`23883`.)

* When performing a relative import, if ``__package__`` does not compare equal
  to ``__spec__.parent`` then :exc:`ImportWarning` is raised.
  (Contributed by Brett Cannon in :issue:`25791`.)

* When a relative import is performed and no parent package is known, then
  :exc:`ImportError` will be raised. Previously, :exc:`SystemError` could be
  raised. (Contributed by Brett Cannon in :issue:`18018`.)

* Servers based on the :mod:`socketserver` module, including those
  defined in :mod:`http.server`, :mod:`xmlrpc.server` and
  :mod:`wsgiref.simple_server`, now only catch exceptions derived
  from :exc:`Exception`. Therefore if a request handler raises
  an exception like :exc:`SystemExit` or :exc:`KeyboardInterrupt`,
  :meth:`~socketserver.BaseServer.handle_error` is no longer called, and
  the exception will stop a single-threaded server. (Contributed by
  Martin Panter in :issue:`23430`.)

* :func:`spwd.getspnam` now raises a :exc:`PermissionError` instead of
  :exc:`KeyError` if the user doesn't have privileges.

* The :meth:`socket.socket.close` method now raises an exception if
  an error (e.g. ``EBADF``) was reported by the underlying system call.
  (Contributed by Martin Panter in :issue:`26685`.)

* The *decode_data* argument for the :class:`smtpd.SMTPChannel` and
  :class:`smtpd.SMTPServer` constructors is now ``False`` by default.
  This means that the argument passed to
  :meth:`~smtpd.SMTPServer.process_message` is now a bytes object by
  default, and ``process_message()`` will be passed keyword arguments.
  Code that has already been updated in accordance with the deprecation
  warning generated by 3.5 will not be affected.

* All optional arguments of the :func:`~json.dump`, :func:`~json.dumps`,
  :func:`~json.load` and :func:`~json.loads` functions and
  :class:`~json.JSONEncoder` and :class:`~json.JSONDecoder` class
  constructors in the :mod:`json` module are now :ref:`keyword-only
  <keyword-only_parameter>`.
  (Contributed by Serhiy Storchaka in :issue:`18726`.)

* Subclasses of :class:`type` which don't override ``type.__new__`` may no
  longer use the one-argument form to get the type of an object.

* As part of :pep:`487`, the handling of keyword arguments passed to
  :class:`type` (other than the metaclass hint, ``metaclass``) is now
  consistently delegated to :meth:`object.__init_subclass__`. This means that
  :meth:`type.__new__` and :meth:`type.__init__` both now accept arbitrary
  keyword arguments, but :meth:`object.__init_subclass__` (which is called from
  :meth:`type.__new__`) will reject them by default. Custom metaclasses
  accepting additional keyword arguments will need to adjust their calls to
  :meth:`type.__new__` (whether direct or via :class:`super`) accordingly.

* In :class:`distutils.command.sdist.sdist`, the ``default_format``
  attribute has been removed and is no longer honored. Instead, the
  gzipped tarfile format is the default on all platforms and no
  platform-specific selection is made.
  In environments where distributions are
  built on Windows and zip distributions are required, configure
  the project with a ``setup.cfg`` file containing the following::

    [sdist]
    formats=zip

  This behavior has also been backported to earlier Python versions
  by Setuptools 26.0.0.

* In the :mod:`urllib.request` module and the
  :meth:`http.client.HTTPConnection.request` method, if no Content-Length
  header field has been specified and the request body is a file object,
  it is now sent with HTTP 1.1 chunked encoding. If a file object has to
  be sent to a HTTP 1.0 server, the Content-Length value now has to be
  specified by the caller.
  (Contributed by Demian Brecht and Rolf Krahl with tweaks from
  Martin Panter in :issue:`12319`.)

* The :class:`~csv.DictReader` now returns rows of type
  :class:`~collections.OrderedDict`.
  (Contributed by Steve Holden in :issue:`27842`.)

* The :const:`crypt.METHOD_CRYPT` will no longer be added to ``crypt.methods``
  if unsupported by the platform.
  (Contributed by Victor Stinner in :issue:`25287`.)

* The *verbose* and *rename* arguments for
  :func:`~collections.namedtuple` are now keyword-only.
  (Contributed by Raymond Hettinger in :issue:`25628`.)

* On Linux, :func:`ctypes.util.find_library` now looks in
  ``LD_LIBRARY_PATH`` for shared libraries.
  (Contributed by Vinay Sajip in :issue:`9998`.)

* The :class:`imaplib.IMAP4` class now handles flags containing the
  ``']'`` character in messages sent from the server to improve
  real-world compatibility.
  (Contributed by Lita Cho in :issue:`21815`.)

* The :func:`mmap.write() <mmap.write>` function now returns the number
  of bytes written like other write methods.
  (Contributed by Jakub Stasiak in :issue:`26335`.)

* The :func:`pkgutil.iter_modules` and :func:`pkgutil.walk_packages`
  functions now return :class:`~pkgutil.ModuleInfo` named tuples.
  (Contributed by Ramchandra Apte in :issue:`17211`.)

* :func:`re.sub` now raises an error for invalid numerical group
  references in replacement templates even if the pattern is not
  found in the string.  The error message for invalid group references
  now includes the group index and the position of the reference.
  (Contributed by SilentGhost, Serhiy Storchaka in :issue:`25953`.)

* :class:`zipfile.ZipFile` will now raise :exc:`NotImplementedError` for
  unrecognized compression values.  Previously a plain :exc:`RuntimeError`
  was raised.  Additionally, calling :class:`~zipfile.ZipFile` methods
  on a closed ZipFile or calling the :meth:`~zipfile.ZipFile.write` method
  on a ZipFile created with mode ``'r'`` will raise a :exc:`ValueError`.
  Previously, a :exc:`RuntimeError` was raised in those scenarios.

* when custom metaclasses are combined with zero-argument :func:`super` or
  direct references from methods to the implicit ``__class__`` closure
  variable, the implicit ``__classcell__`` namespace entry must now be passed
  up to ``type.__new__`` for initialisation. Failing to do so will result in
  a :exc:`DeprecationWarning` in 3.6 and a :exc:`RuntimeWarning` in the future.

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

* The :c:func:`PyMem_Malloc` allocator family now uses the :ref:`pymalloc allocator
  <pymalloc>` rather than the system :c:func:`malloc`. Applications calling
  :c:func:`PyMem_Malloc` without holding the GIL can now crash. Set the
  :envvar:`PYTHONMALLOC` environment variable to ``debug`` to validate the
  usage of memory allocators in your application. See :issue:`26249`.

* :c:func:`Py_Exit` (and the main interpreter) now override the exit status
  with 120 if flushing buffered data failed.  See :issue:`5319`.


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

There have been several major changes to the :term:`bytecode` in Python 3.6.

* The Python interpreter now uses a 16-bit wordcode instead of bytecode.
  (Contributed by Demur Rumed with input and reviews from
  Serhiy Storchaka and Victor Stinner in :issue:`26647` and :issue:`28050`.)

* The new :opcode:`FORMAT_VALUE` and :opcode:`BUILD_STRING` opcodes as part
  of the  :ref:`formatted string literal <whatsnew36-pep498>` implementation.
  (Contributed by Eric Smith in :issue:`25483` and
  Serhiy Storchaka in :issue:`27078`.)

* The new :opcode:`BUILD_CONST_KEY_MAP` opcode to optimize the creation
  of dictionaries with constant keys.
  (Contributed by Serhiy Storchaka in :issue:`27140`.)

* The function call opcodes have been heavily reworked for better performance
  and simpler implementation.
  The :opcode:`MAKE_FUNCTION`, :opcode:`CALL_FUNCTION`,
  :opcode:`CALL_FUNCTION_KW` and :opcode:`BUILD_MAP_UNPACK_WITH_CALL` opcodes
  have been modified, the new :opcode:`CALL_FUNCTION_EX` and
  :opcode:`BUILD_TUPLE_UNPACK_WITH_CALL` have been added, and
  ``CALL_FUNCTION_VAR``, ``CALL_FUNCTION_VAR_KW`` and ``MAKE_CLOSURE`` opcodes
  have been removed.
  (Contributed by Demur Rumed in :issue:`27095`, and Serhiy Storchaka in
  :issue:`27213`, :issue:`28257`.)

* The new :opcode:`SETUP_ANNOTATIONS` and :opcode:`STORE_ANNOTATION` opcodes
  have been added to support the new :term:`variable annotation` syntax.
  (Contributed by Ivan Levkivskyi in :issue:`27985`.)
