mirror of https://github.com/python/cpython
354 lines
12 KiB
ReStructuredText
354 lines
12 KiB
ReStructuredText
****************************
|
|
What's New In Python 3.11
|
|
****************************
|
|
|
|
: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.11, compared to 3.10.
|
|
|
|
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.11 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.11.
|
|
Brevity is key.
|
|
|
|
|
|
.. PEP-sized items next.
|
|
|
|
|
|
|
|
New Features
|
|
============
|
|
|
|
.. _whatsnew311-pep657:
|
|
|
|
Enhanced error locations in tracebacks
|
|
--------------------------------------
|
|
|
|
When printing tracebacks, the interpreter will now point to the exact expression
|
|
that caused the error instead of just the line. For example:
|
|
|
|
.. code-block:: python
|
|
|
|
Traceback (most recent call last):
|
|
File "distance.py", line 11, in <module>
|
|
print(manhattan_distance(p1, p2))
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
File "distance.py", line 6, in manhattan_distance
|
|
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
|
|
^^^^^^^^^
|
|
AttributeError: 'NoneType' object has no attribute 'x'
|
|
|
|
Previous versions of the interpreter would point to just the line making it
|
|
ambiguous which object was ``None``. These enhanced errors can also be helpful
|
|
when dealing with deeply nested dictionary objects and multiple function calls,
|
|
|
|
.. code-block:: python
|
|
|
|
Traceback (most recent call last):
|
|
File "query.py", line 37, in <module>
|
|
magic_arithmetic('foo')
|
|
^^^^^^^^^^^^^^^^^^^^^^^
|
|
File "query.py", line 18, in magic_arithmetic
|
|
return add_counts(x) / 25
|
|
^^^^^^^^^^^^^
|
|
File "query.py", line 24, in add_counts
|
|
return 25 + query_user(user1) + query_user(user2)
|
|
^^^^^^^^^^^^^^^^^
|
|
File "query.py", line 32, in query_user
|
|
return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
|
|
~~~~~~~~~~~~~~~~~~^^^^^
|
|
TypeError: 'NoneType' object is not subscriptable
|
|
|
|
as well as complex arithmetic expressions:
|
|
|
|
.. code-block:: python
|
|
|
|
Traceback (most recent call last):
|
|
File "calculation.py", line 54, in <module>
|
|
result = (x / y / z) * (a / b / c)
|
|
~~~~~~^~~
|
|
ZeroDivisionError: division by zero
|
|
|
|
See :pep:`657` for more details. (Contributed by Pablo Galindo, Batuhan Taskaya
|
|
and Ammar Askar in :issue:`43950`.)
|
|
|
|
.. note::
|
|
This feature requires storing column positions in code objects which may
|
|
result in a small increase of disk usage of compiled Python files or
|
|
interpreter memory usage. To avoid storing the extra information and/or
|
|
deactivate printing the extra traceback information, the
|
|
:option:`-X` ``no_debug_ranges`` command line flag or the :envvar:`PYTHONNODEBUGRANGES`
|
|
environment variable can be used.
|
|
|
|
Column information for code objects
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The information used by the enhanced traceback feature is made available as a
|
|
general API that can be used to correlate bytecode instructions with source
|
|
code. This information can be retrieved using:
|
|
|
|
- The :meth:`codeobject.co_positions` method in Python.
|
|
- The :c:func:`PyCode_Addr2Location` function in the C-API.
|
|
|
|
The :option:`-X` ``no_debug_ranges`` option and the environment variable
|
|
:envvar:`PYTHONNODEBUGRANGES` can be used to disable this feature.
|
|
|
|
See :pep:`657` for more details. (Contributed by Pablo Galindo, Batuhan Taskaya
|
|
and Ammar Askar in :issue:`43950`.)
|
|
|
|
|
|
Other Language Changes
|
|
======================
|
|
|
|
* Asynchronous comprehensions are now allowed inside comprehensions in
|
|
asynchronous functions. Outer comprehensions implicitly become
|
|
asynchronous. (Contributed by Serhiy Storchaka in :issue:`33346`.)
|
|
|
|
* A :exc:`TypeError` is now raised instead of an :exc:`AttributeError` in
|
|
:meth:`contextlib.ExitStack.enter_context` and
|
|
:meth:`contextlib.AsyncExitStack.enter_async_context` for objects which do not
|
|
support the :term:`context manager` or :term:`asynchronous context manager`
|
|
protocols correspondingly.
|
|
(Contributed by Serhiy Storchaka in :issue:`44471`.)
|
|
|
|
* A :exc:`TypeError` is now raised instead of an :exc:`AttributeError` in
|
|
:keyword:`with` and :keyword:`async with` statements for objects which do not
|
|
support the :term:`context manager` or :term:`asynchronous context manager`
|
|
protocols correspondingly.
|
|
(Contributed by Serhiy Storchaka in :issue:`12022`.)
|
|
|
|
|
|
New Modules
|
|
===========
|
|
|
|
* None yet.
|
|
|
|
|
|
Improved Modules
|
|
================
|
|
|
|
fractions
|
|
---------
|
|
|
|
Support :PEP:`515`-style initialization of :class:`~fractions.Fraction` from
|
|
string. (Contributed by Sergey B Kirpichev in :issue:`44258`.)
|
|
|
|
|
|
math
|
|
----
|
|
|
|
* Add :func:`math.cbrt`: return the cube root of x.
|
|
(Contributed by Ajith Ramachandran in :issue:`44357`.)
|
|
|
|
* The behaviour of two :func:`math.pow` corner cases was changed, for
|
|
consistency with the IEEE 754 specification. The operations
|
|
``math.pow(0.0, -math.inf)`` and ``math.pow(-0.0, -math.inf)`` now return
|
|
``inf``. Previously they raised :exc:`ValueError`. (Contributed by Mark
|
|
Dickinson in :issue:`44339`.)
|
|
|
|
|
|
os
|
|
--
|
|
|
|
* On Windows, :func:`os.urandom` uses ``BCryptGenRandom()`` instead of ``CryptGenRandom()``
|
|
which is deprecated.
|
|
(Contributed by Dong-hee Na in :issue:`44611`.)
|
|
|
|
|
|
sqlite3
|
|
-------
|
|
|
|
* You can now disable the authorizer by passing :const:`None` to
|
|
:meth:`~sqlite3.Connection.set_authorizer`.
|
|
(Contributed by Erlend E. Aasland in :issue:`44491`.)
|
|
|
|
* Collation name :meth:`~sqlite3.Connection.create_collation` can now
|
|
contain any Unicode character. Collation names with invalid characters
|
|
now raise :exc:`UnicodeEncodeError` instead of :exc:`sqlite3.ProgrammingError`.
|
|
(Contributed by Erlend E. Aasland in :issue:`44688`.)
|
|
|
|
|
|
Removed
|
|
=======
|
|
* :class:`smtpd.MailmanProxy` is now removed as it is unusable without
|
|
an external module, ``mailman``. (Contributed by Dong-hee Na in :issue:`35800`.)
|
|
|
|
|
|
Optimizations
|
|
=============
|
|
|
|
* Compiler now optimizes simple C-style formatting with literal format
|
|
containing only format codes ``%s``, ``%r`` and ``%a`` and makes it as
|
|
fast as corresponding f-string expression.
|
|
(Contributed by Serhiy Storchaka in :issue:`28307`.)
|
|
|
|
* "Zero-cost" exceptions are implemented. The cost of ``try`` statements is
|
|
almost eliminated when no exception is raised.
|
|
(Contributed by Mark Shannon in :issue:`40222`.)
|
|
|
|
* Method calls with keywords are now faster due to bytecode
|
|
changes which avoid creating bound method instances. Previously, this
|
|
optimization was applied only to method calls with purely positional
|
|
arguments.
|
|
(Contributed by Ken Jin and Mark Shannon in :issue:`26110`, based on ideas
|
|
implemented in PyPy.)
|
|
|
|
* :file:`.pdbrc` is now read with ``'utf-8'`` encoding.
|
|
|
|
|
|
CPython bytecode changes
|
|
========================
|
|
|
|
* Added a new :opcode:`CALL_METHOD_KW` opcode. Calls a method in a similar
|
|
fashion as :opcode:`CALL_METHOD`, but also supports keyword arguments. Works
|
|
in tandem with :opcode:`LOAD_METHOD`.
|
|
|
|
|
|
Build Changes
|
|
=============
|
|
|
|
|
|
Deprecated
|
|
==========
|
|
|
|
|
|
|
|
Removed
|
|
=======
|
|
|
|
* The :func:`@asyncio.coroutine <asyncio.coroutine>` :term:`decorator` enabling
|
|
legacy generator-based coroutines to be compatible with async/await code.
|
|
The function has been deprecated since Python 3.8 and the removal was
|
|
initially scheduled for Python 3.10. Use :keyword:`async def` instead.
|
|
(Contributed by Illia Volochii in :issue:`43216`.)
|
|
|
|
* :class:`asyncio.coroutines.CoroWrapper` used for wrapping legacy
|
|
generator-based coroutine objects in the debug mode.
|
|
(Contributed by Illia Volochii in :issue:`43216`.)
|
|
|
|
Porting to Python 3.11
|
|
======================
|
|
|
|
This section lists previously described changes and other bugfixes
|
|
that may require changes to your code.
|
|
|
|
|
|
Changes in the Python API
|
|
-------------------------
|
|
|
|
* Prohibited passing non-:class:`concurrent.futures.ThreadPoolExecutor`
|
|
executors to :meth:`loop.set_default_executor` following a deprecation in
|
|
Python 3.8.
|
|
(Contributed by Illia Volochii in :issue:`43234`.)
|
|
|
|
|
|
C API Changes
|
|
=============
|
|
* Add a new :c:func:`PyType_GetName` function to get type's short name.
|
|
(Contributed by Hai Shi in :issue:`42035`.)
|
|
|
|
New Features
|
|
------------
|
|
|
|
Porting to Python 3.11
|
|
----------------------
|
|
|
|
* The :c:func:`PyType_Ready` function now raises an error if a type is defined
|
|
with the :const:`Py_TPFLAGS_HAVE_GC` flag set but has no traverse function
|
|
(:c:member:`PyTypeObject.tp_traverse`).
|
|
(Contributed by Victor Stinner in :issue:`44263`.)
|
|
|
|
* Heap types with the :const:`Py_TPFLAGS_IMMUTABLETYPE` flag can now inherit
|
|
the :pep:`590` vectorcall protocol. Previously, this was only possible for
|
|
:ref:`static types <static-types>`.
|
|
(Contributed by Erlend E. Aasland in :issue:`43908`)
|
|
|
|
Deprecated
|
|
----------
|
|
|
|
Removed
|
|
-------
|
|
|
|
* :c:func:`PyFrame_BlockSetup` and :c:func:`PyFrame_BlockPop` have been
|
|
removed.
|
|
(Contributed by Mark Shannon in :issue:`40222`.)
|
|
|
|
* Deprecate the following functions to configure the Python initialization:
|
|
|
|
* :c:func:`PySys_AddWarnOptionUnicode`
|
|
* :c:func:`PySys_AddWarnOption`
|
|
* :c:func:`PySys_AddXOption`
|
|
* :c:func:`PySys_HasWarnOptions`
|
|
* :c:func:`Py_SetPath`
|
|
* :c:func:`Py_SetProgramName`
|
|
* :c:func:`Py_SetPythonHome`
|
|
* :c:func:`Py_SetStandardStreamEncoding`
|
|
* :c:func:`_Py_SetProgramFullPath`
|
|
|
|
Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization Configuration
|
|
<init-config>` instead (:pep:`587`).
|
|
(Contributed by Victor Stinner in :issue:`44113`.)
|
|
|
|
* The following deprecated functions and methods are removed in the :mod:`gettext`
|
|
module: :func:`~gettext.lgettext`, :func:`~gettext.ldgettext`,
|
|
:func:`~gettext.lngettext` and :func:`~gettext.ldngettext`.
|
|
|
|
Function :func:`~gettext.bind_textdomain_codeset`, methods
|
|
:meth:`~gettext.NullTranslations.output_charset` and
|
|
:meth:`~gettext.NullTranslations.set_output_charset`, and the *codeset*
|
|
parameter of functions :func:`~gettext.translation` and
|
|
:func:`~gettext.install` are also removed, since they are only used for
|
|
the ``l*gettext()`` functions.
|
|
(Contributed by Dong-hee Na and Serhiy Storchaka in :issue:`44235`.)
|