370 lines
14 KiB
ReStructuredText
370 lines
14 KiB
ReStructuredText
****************************
|
|
What's New In Python 3.9
|
|
****************************
|
|
|
|
:Release: |release|
|
|
:Date: |today|
|
|
|
|
.. 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.9, compared to 3.8.
|
|
|
|
For full details, see the :ref:`changelog <changelog>`.
|
|
|
|
.. note::
|
|
|
|
Prerelease users should be aware that this document is currently in draft
|
|
form. It will be updated substantially as Python 3.9 moves towards release,
|
|
so it's worth checking back even after reading earlier versions.
|
|
|
|
|
|
Summary -- Release highlights
|
|
=============================
|
|
|
|
.. This section singles out the most important changes in Python 3.9.
|
|
Brevity is key.
|
|
|
|
|
|
.. PEP-sized items next.
|
|
|
|
|
|
|
|
New Features
|
|
============
|
|
|
|
|
|
|
|
Other Language Changes
|
|
======================
|
|
|
|
* :func:`__import__` now raises :exc:`ImportError` instead of
|
|
:exc:`ValueError`, which used to occur when a relative import went past
|
|
its top-level package.
|
|
(Contributed by Ngalim Siregar in :issue:`37444`.)
|
|
|
|
|
|
* Python now gets the absolute path of the script filename specified on
|
|
the command line (ex: ``python3 script.py``): the ``__file__`` attribute of
|
|
the :mod:`__main__` module, ``sys.argv[0]`` and ``sys.path[0]`` become an
|
|
absolute path, rather than a relative path. These paths now remain valid
|
|
after the current directory is changed by :func:`os.chdir`. As a side effect,
|
|
a traceback also displays the absolute path for :mod:`__main__` module frames
|
|
in this case.
|
|
(Contributed by Victor Stinner in :issue:`20443`.)
|
|
|
|
* In development mode and in debug build, *encoding* and *errors* arguments are
|
|
now checked on string encoding and decoding operations. Examples:
|
|
:func:`open`, :meth:`str.encode` and :meth:`bytes.decode`.
|
|
|
|
By default, for best performance, the *errors* argument is only checked at
|
|
the first encoding/decoding error and the *encoding* argument is sometimes
|
|
ignored for empty strings.
|
|
(Contributed by Victor Stinner in :issue:`37388`.)
|
|
|
|
* ``"".replace("", s, n)`` now returns ``s`` instead of an empty string for
|
|
all non-zero ``n``. It is now consistent with ``"".replace("", s)``.
|
|
There are similar changes for :class:`bytes` and :class:`bytearray` objects.
|
|
(Contributed by Serhiy Storchaka in :issue:`28029`.)
|
|
|
|
|
|
New Modules
|
|
===========
|
|
|
|
* None yet.
|
|
|
|
|
|
Improved Modules
|
|
================
|
|
|
|
ast
|
|
---
|
|
|
|
Added the *indent* option to :func:`~ast.dump` which allows it to produce a
|
|
multiline indented output.
|
|
(Contributed by Serhiy Storchaka in :issue:`37995`.)
|
|
|
|
Added :func:`ast.unparse` as a function in the :mod:`ast` module that can
|
|
be used to unparse an :class:`ast.AST` object and produce a string with code
|
|
that would produce an equivalent :class:`ast.AST` object when parsed.
|
|
(Contributed by Pablo Galindo and Batuhan Taskaya in :issue:`38870`.)
|
|
|
|
asyncio
|
|
-------
|
|
|
|
Added a new :term:`coroutine` :meth:`~asyncio.loop.shutdown_default_executor`
|
|
that schedules a shutdown for the default executor that waits on the
|
|
:class:`~concurrent.futures.ThreadPoolExecutor` to finish closing. Also,
|
|
:func:`asyncio.run` has been updated to use the new :term:`coroutine`.
|
|
(Contributed by Kyle Stanley in :issue:`34037`.)
|
|
|
|
Added :class:`asyncio.PidfdChildWatcher`, a Linux-specific child watcher
|
|
implementation that polls process file descriptors. (:issue:`38692`)
|
|
|
|
curses
|
|
------
|
|
|
|
Add :func:`curses.get_escdelay`, :func:`curses.set_escdelay`,
|
|
:func:`curses.get_tabsize`, and :func:`curses.set_tabsize` functions.
|
|
(Contributed by Anthony Sottile in :issue:`38312`.)
|
|
|
|
fcntl
|
|
-----
|
|
|
|
Added constants :data:`~fcntl.F_OFD_GETLK`, :data:`~fcntl.F_OFD_SETLK`
|
|
and :data:`~fcntl.F_OFD_SETLKW`.
|
|
(Contributed by Dong-hee Na in :issue:`38602`.)
|
|
|
|
os
|
|
--
|
|
|
|
Added :data:`~os.CLD_KILLED` and :data:`~os.CLD_STOPPED` for :attr:`si_code`.
|
|
(Contributed by Dong-hee Na in :issue:`38493`.)
|
|
|
|
Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and
|
|
:data:`os.P_PIDFD` (:issue:`38713`) for process management with file
|
|
descriptors.
|
|
|
|
threading
|
|
---------
|
|
|
|
In a subinterpreter, spawning a daemon thread now raises a :exc:`RuntimeError`. Daemon
|
|
threads were never supported in subinterpreters. Previously, the subinterpreter
|
|
finalization crashed with a Python fatal error if a daemon thread was still
|
|
running.
|
|
(Contributed by Victor Stinner in :issue:`37266`.)
|
|
|
|
venv
|
|
----
|
|
|
|
The activation scripts provided by :mod:`venv` now all specify their prompt
|
|
customization consistently by always using the value specified by
|
|
``__VENV_PROMPT__``. Previously some scripts unconditionally used
|
|
``__VENV_PROMPT__``, others only if it happened to be set (which was the default
|
|
case), and one used ``__VENV_NAME__`` instead.
|
|
(Contributed by Brett Cannon in :issue:`37663`.)
|
|
|
|
pathlib
|
|
-------
|
|
|
|
Added :meth:`pathlib.Path.readlink()` which acts similarly to
|
|
:func:`os.readlink`.
|
|
(Contributed by Girts Folkmanis in :issue:`30618`)
|
|
|
|
pprint
|
|
------
|
|
|
|
:mod:`pprint` can now pretty-print :class:`types.SimpleNamespace`.
|
|
(Contributed by Carl Bordum Hansen in :issue:`37376`.)
|
|
|
|
importlib
|
|
---------
|
|
|
|
To improve consistency with import statements, :func:`importlib.util.resolve_name`
|
|
now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative
|
|
import attempts.
|
|
(Contributed by Ngalim Siregar in :issue:`37444`.)
|
|
|
|
signal
|
|
------
|
|
|
|
Exposed the Linux-specific :func:`signal.pidfd_send_signal` for sending to
|
|
signals to a process using a file descriptor instead of a pid. (:issue:`38712`)
|
|
|
|
|
|
Optimizations
|
|
=============
|
|
|
|
|
|
Build and C API Changes
|
|
=======================
|
|
|
|
* Provide :c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall`
|
|
as regular functions for the limited API. Previously, there were defined as
|
|
macros, but these macros didn't work with the limited API which cannot access
|
|
``PyThreadState.recursion_depth`` field. Remove ``_Py_CheckRecursionLimit``
|
|
from the stable ABI.
|
|
(Contributed by Victor Stinner in :issue:`38644`.)
|
|
|
|
* Add a new public :c:func:`PyObject_CallNoArgs` function to the C API, which
|
|
calls a callable Python object without any arguments. It is the most efficient
|
|
way to call a callable Python object without any argument.
|
|
(Contributed by Victor Stinner in :issue:`37194`.)
|
|
|
|
* The global variable :c:data:`PyStructSequence_UnnamedField` is now a constant
|
|
and refers to a constant string.
|
|
(Contributed by Serhiy Storchaka in :issue:`38650`.)
|
|
|
|
* Exclude ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` macros of
|
|
``pyfpe.h`` from ``Py_LIMITED_API`` (stable API).
|
|
(Contributed by Victor Stinner in :issue:`38835`.)
|
|
|
|
* Remove ``PyMethod_ClearFreeList()`` and ``PyCFunction_ClearFreeList()``
|
|
functions: the free lists of bound method objects have been removed.
|
|
(Contributed by Inada Naoki and Victor Stinner in :issue:`37340`.)
|
|
|
|
* Remove ``PyUnicode_ClearFreeList()`` function: the Unicode free list has been
|
|
removed in Python 3.3.
|
|
(Contributed by Victor Stinner in :issue:`38896`.)
|
|
|
|
|
|
Deprecated
|
|
==========
|
|
|
|
* Currently :func:`math.factorial` accepts :class:`float` instances with
|
|
non-negative integer values (like ``5.0``). It raises a :exc:`ValueError`
|
|
for non-integral and negative floats. It is now deprecated. In future
|
|
Python versions it will raise a :exc:`TypeError` for all floats.
|
|
(Contributed by Serhiy Storchaka in :issue:`37315`.)
|
|
|
|
* The :mod:`parser` module is deprecated and will be removed in future versions
|
|
of Python. For the majority of use cases, users can leverage the Abstract Syntax
|
|
Tree (AST) generation and compilation stage, using the :mod:`ast` module.
|
|
|
|
* The :mod:`random` module currently accepts any hashable type as a
|
|
possible seed value. Unfortunately, some of those types are not
|
|
guaranteed to have a deterministic hash value. After Python 3.9,
|
|
the module will restrict its seeds to :const:`None`, :class:`int`,
|
|
:class:`float`, :class:`str`, :class:`bytes`, and :class:`bytearray`.
|
|
|
|
* Opening the :class:`~gzip.GzipFile` file for writing without specifying
|
|
the *mode* argument is deprecated. In future Python versions it will always
|
|
be opened for reading by default. Specify the *mode* argument for opening
|
|
it for writing and silencing a warning.
|
|
(Contributed by Serhiy Storchaka in :issue:`28286`.)
|
|
|
|
* Deprecated the ``split()`` method of :class:`_tkinter.TkappType` in
|
|
favour of the ``splitlist()`` method which has more consistent and
|
|
predicable behavior.
|
|
(Contributed by Serhiy Storchaka in :issue:`38371`.)
|
|
|
|
|
|
Removed
|
|
=======
|
|
|
|
* The abstract base classes in :mod:`collections.abc` no longer are
|
|
exposed in the regular :mod:`collections` module. This will help
|
|
create a clearer distinction between the concrete classes and the abstract
|
|
base classes.
|
|
|
|
* The undocumented ``sys.callstats()`` function has been removed. Since Python
|
|
3.7, it was deprecated and always returned :const:`None`. It required a special
|
|
build option ``CALL_PROFILE`` which was already removed in Python 3.7.
|
|
(Contributed by Victor Stinner in :issue:`37414`.)
|
|
|
|
* The ``sys.getcheckinterval()`` and ``sys.setcheckinterval()`` functions have
|
|
been removed. They were deprecated since Python 3.2. Use
|
|
:func:`sys.getswitchinterval` and :func:`sys.setswitchinterval` instead.
|
|
(Contributed by Victor Stinner in :issue:`37392`.)
|
|
|
|
* The C function ``PyImport_Cleanup()`` has been removed. It was documented as:
|
|
"Empty the module table. For internal use only."
|
|
(Contributed by Victor Stinner in :issue:`36710`.)
|
|
|
|
* ``_dummy_thread`` and ``dummy_threading`` modules have been removed. These
|
|
modules were deprecated since Python 3.7 which requires threading support.
|
|
(Contributed by Victor Stinner in :issue:`37312`.)
|
|
|
|
* ``aifc.openfp()`` alias to ``aifc.open()``, ``sunau.openfp()`` alias to
|
|
``sunau.open()``, and ``wave.openfp()`` alias to :func:`wave.open()` have been
|
|
removed. They were deprecated since Python 3.7.
|
|
(Contributed by Victor Stinner in :issue:`37320`.)
|
|
|
|
* The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread`
|
|
has been removed. It was deprecated since Python 3.8.
|
|
Use :meth:`~threading.Thread.is_alive()` instead.
|
|
(Contributed by Dong-hee Na in :issue:`37804`.)
|
|
|
|
* Methods ``getchildren()`` and ``getiterator()`` in the
|
|
:mod:`~xml.etree.ElementTree` module have been removed. They were
|
|
deprecated in Python 3.2. Use functions :func:`list` and :func:`iter`
|
|
instead. The ``xml.etree.cElementTree`` module has been removed.
|
|
(Contributed by Serhiy Storchaka in :issue:`36543`.)
|
|
|
|
* The old :mod:`plistlib` API has been removed, it was deprecated since Python
|
|
3.4. Use the :func:`~plistlib.load`, :func:`~plistlib.loads`, :func:`~plistlib.dump`, and
|
|
:func:`~plistlib.dumps` functions. Additionally, the *use_builtin_types* parameter was
|
|
removed, standard :class:`bytes` objects are always used instead.
|
|
(Contributed by Jon Janzen in :issue:`36409`.)
|
|
|
|
* The C function ``PyThreadState_DeleteCurrent()`` has been removed. It was not documented.
|
|
(Contributed by Joannah Nanjekye in :issue:`37878`.)
|
|
|
|
* The C function ``PyGen_NeedsFinalizing`` has been removed. It was not
|
|
documented, tested, or used anywhere within CPython after the implementation
|
|
of :pep:`442`. Patch by Joannah Nanjekye.
|
|
(Contributed by Joannah Nanjekye in :issue:`15088`)
|
|
|
|
|
|
Porting to Python 3.9
|
|
=====================
|
|
|
|
This section lists previously described changes and other bugfixes
|
|
that may require changes to your code.
|
|
|
|
|
|
Changes in the Python API
|
|
-------------------------
|
|
|
|
* :func:`open`, :func:`io.open`, :func:`codecs.open` and
|
|
:class:`fileinput.FileInput` no longer accept ``'U'`` ("universal newline")
|
|
in the file mode. This flag was deprecated since Python 3.3. In Python 3, the
|
|
"universal newline" is used by default when a file is open in text mode. The
|
|
:ref:`newline parameter <open-newline-parameter>` of :func:`open` controls
|
|
how universal newlines works.
|
|
(Contributed by Victor Stinner in :issue:`37330`.)
|
|
|
|
* :func:`__import__` and :func:`importlib.util.resolve_name` now raise
|
|
:exc:`ImportError` where it previously raised :exc:`ValueError`. Callers
|
|
catching the specific exception type and supporting both Python 3.9 and
|
|
earlier versions will need to catch both using ``except (ImportError, ValueError):``.
|
|
|
|
* The :mod:`venv` activation scripts no longer special-case when
|
|
``__VENV_PROMPT__`` is set to ``""``.
|
|
|
|
|
|
CPython bytecode changes
|
|
------------------------
|
|
|
|
* The :opcode:`LOAD_ASSERTION_ERROR` opcode was added for handling the
|
|
:keyword:`assert` statement. Previously, the assert statement would not work
|
|
correctly if the :exc:`AssertionError` exception was being shadowed.
|
|
(Contributed by Zackery Spytz in :issue:`34880`.)
|