| **************************** |
| 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`.) |
| |
| |
| Other CPython Implementation Changes |
| ==================================== |
| |
| * Special methods :meth:`complex.__complex__` and :meth:`bytes.__bytes__` are implemented to |
| support :class:`typing.SupportsComplex` and :class:`typing.SupportsBytes` protocols. |
| (Contributed by Mark Dickinson and Dong-hee Na in :issue:`24234`.) |
| |
| |
| 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`.) |
| |
| * :mod:`sqlite3` exceptions now include the SQLite error code as |
| :attr:`~sqlite3.Error.sqlite_errorcode` and the SQLite error name as |
| :attr:`~sqlite3.Error.sqlite_errorname`. |
| (Contributed by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland in |
| :issue:`16379`.) |
| |
| |
| Removed |
| ======= |
| |
| * :class:`smtpd.MailmanProxy` is now removed as it is unusable without |
| an external module, ``mailman``. (Contributed by Dong-hee Na in :issue:`35800`.) |
| |
| * The ``binhex`` module, deprecated in Python 3.9, is now removed. |
| The following :mod:`binascii` functions, deprecated in Python 3.9, are now |
| also removed: |
| |
| * ``a2b_hqx()``, ``b2a_hqx()``; |
| * ``rlecode_hqx()``, ``rledecode_hqx()``. |
| |
| The :func:`binascii.crc_hqx` function remains available. |
| |
| (Contributed by Victor Stinner in :issue:`45085`.) |
| |
| * The distutils ``bdist_msi`` command, deprecated in Python 3.9, is now removed. |
| Use ``bdist_wheel`` (wheel packages) instead. |
| (Contributed by Hugo van Kemenade in :issue:`45124`.) |
| |
| 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 |
| ========== |
| |
| * The :mod:`lib2to3` package is now deprecated and may not be able to parse |
| Python 3.10 or newer. See the :pep:`617` (New PEG parser for CPython). |
| (Contributed by Victor Stinner in :issue:`40360`.) |
| |
| * :class:`webbrowser.MacOSX` is deprecated and will be removed in Python 3.13. |
| It is untested and undocumented and also not used by webbrowser itself. |
| (Contributed by Dong-hee Na in :issue:`42255`.) |
| |
| |
| 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`.) |
| |
| * :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`.) |
| |
| |
| C API Changes |
| ============= |
| * Add a new :c:func:`PyType_GetName` function to get type's short name. |
| (Contributed by Hai Shi in :issue:`42035`.) |
| |
| * Add a new :c:func:`PyType_GetQualName` function to get type's qualified name. |
| (Contributed by Hai Shi in :issue:`42035`.) |
| |
| New Features |
| ------------ |
| |
| Porting to Python 3.11 |
| ---------------------- |
| |
| * The old trashcan macros (``Py_TRASHCAN_SAFE_BEGIN``/``Py_TRASHCAN_SAFE_END``) |
| are now deprecated. They should be replaced by the new macros |
| ``Py_TRASHCAN_BEGIN`` and ``Py_TRASHCAN_END``. |
| |
| A tp_dealloc function that has the old macros, such as:: |
| |
| static void |
| mytype_dealloc(mytype *p) |
| { |
| PyObject_GC_UnTrack(p); |
| Py_TRASHCAN_SAFE_BEGIN(p); |
| ... |
| Py_TRASHCAN_SAFE_END |
| } |
| |
| should migrate to the new macros as follows:: |
| |
| static void |
| mytype_dealloc(mytype *p) |
| { |
| PyObject_GC_UnTrack(p); |
| Py_TRASHCAN_BEGIN(p, mytype_dealloc) |
| ... |
| Py_TRASHCAN_END |
| } |
| |
| Note that ``Py_TRASHCAN_BEGIN`` has a second argument which |
| should be the deallocation function it is in. |
| |
| To support older Python versions in the same codebase, you |
| can define the following macros and use them throughout |
| the code (credit: these were copied from the ``mypy`` codebase):: |
| |
| #if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 8 |
| # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) |
| # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END |
| #else |
| # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) |
| # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) |
| #endif |
| |
| * 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`.) |
| |
| * The behavior of returning a value from a :class:`~unittest.TestCase` and |
| :class:`~unittest.IsolatedAsyncioTestCase` test methods (other than the default ``None`` |
| value), is now deprecated. |