mirror of https://github.com/python/cpython
2709 lines
104 KiB
ReStructuredText
2709 lines
104 KiB
ReStructuredText
|
|
****************************
|
|
What's New In Python 3.13
|
|
****************************
|
|
|
|
:Editors: Adam Turner and Thomas Wouters
|
|
|
|
.. 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 issue number as a comment:
|
|
|
|
XXX Describe the transmogrify() function added to the socket
|
|
module.
|
|
(Contributed by P.Y. Developer in :gh:`12345`.)
|
|
|
|
This saves the maintainer the effort of going through the VCS log
|
|
when researching a change.
|
|
|
|
This article explains the new features in Python 3.13, compared to 3.12.
|
|
Python 3.13 was released on October 7, 2024.
|
|
For full details, see the :ref:`changelog <changelog>`.
|
|
|
|
.. seealso::
|
|
|
|
:pep:`719` -- Python 3.13 Release Schedule
|
|
|
|
|
|
Summary -- Release Highlights
|
|
=============================
|
|
|
|
.. This section singles out the most important changes in Python 3.13.
|
|
Brevity is key.
|
|
|
|
Python 3.13 is the latest stable release of the Python programming
|
|
language, with a mix of changes to the language, the implementation
|
|
and the standard library.
|
|
The biggest changes include a new `interactive interpreter
|
|
<whatsnew313-better-interactive-interpreter_>`_,
|
|
experimental support for running in a `free-threaded mode
|
|
<whatsnew313-free-threaded-cpython_>`_ (:pep:`703`),
|
|
and a `Just-In-Time compiler <whatsnew313-jit-compiler_>`_ (:pep:`744`).
|
|
|
|
Error messages continue to improve, with tracebacks now highlighted in color
|
|
by default. The :func:`locals` builtin now has :ref:`defined semantics
|
|
<whatsnew313-locals-semantics>` for changing the returned mapping,
|
|
and type parameters now support default values.
|
|
|
|
The library changes contain removal of deprecated APIs and modules,
|
|
as well as the usual improvements in user-friendliness and correctness.
|
|
Several legacy standard library modules have now `been removed
|
|
<whatsnew313-pep594_>`_ following their deprecation in Python 3.11 (:pep:`594`).
|
|
|
|
This article doesn't attempt to provide a complete specification
|
|
of all new features, but instead gives a convenient overview.
|
|
For full details refer to the documentation,
|
|
such as the :ref:`Library Reference <library-index>`
|
|
and :ref:`Language Reference <reference-index>`.
|
|
To understand the complete implementation and design rationale for a change,
|
|
refer to the PEP for a particular new feature;
|
|
but note that PEPs usually are not kept up-to-date
|
|
once a feature has been fully implemented.
|
|
See `Porting to Python 3.13`_ for guidance on upgrading from
|
|
earlier versions of Python.
|
|
|
|
--------------
|
|
|
|
.. PEP-sized items next.
|
|
|
|
Interpreter improvements:
|
|
|
|
* A greatly improved :ref:`interactive interpreter
|
|
<whatsnew313-better-interactive-interpreter>` and
|
|
:ref:`improved error messages <whatsnew313-improved-error-messages>`.
|
|
* :pep:`667`: The :func:`locals` builtin now has
|
|
:ref:`defined semantics <whatsnew313-locals-semantics>` when mutating the
|
|
returned mapping. Python debuggers and similar tools may now more reliably
|
|
update local variables in optimized scopes even during concurrent code
|
|
execution.
|
|
* :pep:`703`: CPython 3.13 has experimental support for running with the
|
|
:term:`global interpreter lock` disabled. See :ref:`Free-threaded CPython
|
|
<whatsnew313-free-threaded-cpython>` for more details.
|
|
* :pep:`744`: A basic :ref:`JIT compiler <whatsnew313-jit-compiler>` was added.
|
|
It is currently disabled by default (though we may turn it on later).
|
|
Performance improvements are modest -- we expect to improve this
|
|
over the next few releases.
|
|
* Color support in the new :ref:`interactive interpreter
|
|
<whatsnew313-better-interactive-interpreter>`,
|
|
as well as in :ref:`tracebacks <whatsnew313-improved-error-messages>`
|
|
and :ref:`doctest <whatsnew313-doctest>` output.
|
|
This can be disabled through the :envvar:`PYTHON_COLORS` and |NO_COLOR|_
|
|
environment variables.
|
|
|
|
Python data model improvements:
|
|
|
|
* :attr:`~type.__static_attributes__` stores the names of attributes accessed
|
|
through ``self.X`` in any function in a class body.
|
|
* :attr:`~type.__firstlineno__` records the first line number of a class
|
|
definition.
|
|
|
|
Significant improvements in the standard library:
|
|
|
|
* Add a new :exc:`PythonFinalizationError` exception, raised when an operation
|
|
is blocked during :term:`finalization <interpreter shutdown>`.
|
|
* The :mod:`argparse` module now supports deprecating command-line options,
|
|
positional arguments, and subcommands.
|
|
* The new functions :func:`base64.z85encode` and :func:`base64.z85decode`
|
|
support encoding and decoding `Z85 data`_.
|
|
* The :mod:`copy` module now has a :func:`copy.replace` function,
|
|
with support for many builtin types and any class defining
|
|
the :func:`~object.__replace__` method.
|
|
* The new :mod:`dbm.sqlite3` module is now the default :mod:`dbm` backend.
|
|
* The :mod:`os` module has a :ref:`suite of new functions <os-timerfd>`
|
|
for working with Linux's timer notification file descriptors.
|
|
* The :mod:`random` module now has a :ref:`command-line interface <random-cli>`.
|
|
|
|
Security improvements:
|
|
|
|
* :func:`ssl.create_default_context` sets :data:`ssl.VERIFY_X509_PARTIAL_CHAIN`
|
|
and :data:`ssl.VERIFY_X509_STRICT` as default flags.
|
|
|
|
C API improvements:
|
|
|
|
* The :c:data:`Py_mod_gil` slot is now used to indicate that
|
|
an extension module supports running with the :term:`GIL` disabled.
|
|
* The :doc:`PyTime C API </c-api/time>` has been added,
|
|
providing access to system clocks.
|
|
* :c:type:`PyMutex` is a new lightweight mutex that occupies a single byte.
|
|
* There is a new :ref:`suite of functions <c-api-monitoring>`
|
|
for generating :pep:`669` monitoring events in the C API.
|
|
|
|
New typing features:
|
|
|
|
* :pep:`696`: Type parameters (:data:`typing.TypeVar`, :data:`typing.ParamSpec`,
|
|
and :data:`typing.TypeVarTuple`) now support defaults.
|
|
* :pep:`702`: The new :func:`warnings.deprecated` decorator adds support
|
|
for marking deprecations in the type system and at runtime.
|
|
* :pep:`705`: :data:`typing.ReadOnly` can be used to mark an item of a
|
|
:class:`typing.TypedDict` as read-only for type checkers.
|
|
* :pep:`742`: :data:`typing.TypeIs` provides more intuitive
|
|
type narrowing behavior, as an alternative to :data:`typing.TypeGuard`.
|
|
|
|
Platform support:
|
|
|
|
* :pep:`730`: Apple's iOS is now an :ref:`officially supported platform
|
|
<whatsnew313-platform-support>`, at :pep:`tier 3 <11#tier-3>`.
|
|
* :pep:`738`: Android is now an :ref:`officially supported platform
|
|
<whatsnew313-platform-support>`, at :pep:`tier 3 <11#tier-3>`.
|
|
* ``wasm32-wasi`` is now supported as a :pep:`tier 2 <11#tier-2>` platform.
|
|
* ``wasm32-emscripten`` is no longer an officially supported platform.
|
|
|
|
Important removals:
|
|
|
|
* :ref:`PEP 594 <whatsnew313-pep594>`: The remaining 19 "dead batteries"
|
|
(legacy stdlib modules) have been removed from the standard library:
|
|
:mod:`!aifc`, :mod:`!audioop`, :mod:`!cgi`, :mod:`!cgitb`, :mod:`!chunk`,
|
|
:mod:`!crypt`, :mod:`!imghdr`, :mod:`!mailcap`, :mod:`!msilib`, :mod:`!nis`,
|
|
:mod:`!nntplib`, :mod:`!ossaudiodev`, :mod:`!pipes`, :mod:`!sndhdr`,
|
|
:mod:`!spwd`, :mod:`!sunau`, :mod:`!telnetlib`, :mod:`!uu` and :mod:`!xdrlib`.
|
|
* Remove the :program:`2to3` tool and :mod:`!lib2to3` module
|
|
(deprecated in Python 3.11).
|
|
* Remove the :mod:`!tkinter.tix` module (deprecated in Python 3.6).
|
|
* Remove the :func:`!locale.resetlocale` function.
|
|
* Remove the :mod:`!typing.io` and :mod:`!typing.re` namespaces.
|
|
* Remove chained :class:`classmethod` descriptors.
|
|
|
|
Release schedule changes:
|
|
|
|
:pep:`602` ("Annual Release Cycle for Python") has been updated
|
|
to extend the full support ('bugfix') period for new releases to two years.
|
|
This updated policy means that:
|
|
|
|
* Python 3.9--3.12 have one and a half years of full support,
|
|
followed by three and a half years of security fixes.
|
|
* Python 3.13 and later have two years of full support,
|
|
followed by three years of security fixes.
|
|
|
|
|
|
New Features
|
|
============
|
|
|
|
|
|
.. _whatsnew313-better-interactive-interpreter:
|
|
|
|
A better interactive interpreter
|
|
--------------------------------
|
|
|
|
Python now uses a new :term:`interactive` shell by default, based on code
|
|
from the `PyPy project`_.
|
|
When the user starts the :term:`REPL` from an interactive terminal,
|
|
the following new features are now supported:
|
|
|
|
* Multiline editing with history preservation.
|
|
* Direct support for REPL-specific commands like :kbd:`help`, :kbd:`exit`,
|
|
and :kbd:`quit`, without the need to call them as functions.
|
|
* Prompts and tracebacks with :ref:`color enabled by default
|
|
<using-on-controlling-color>`.
|
|
* Interactive help browsing using :kbd:`F1` with a separate command
|
|
history.
|
|
* History browsing using :kbd:`F2` that skips output as well as the
|
|
:term:`>>>` and :term:`...` prompts.
|
|
* "Paste mode" with :kbd:`F3` that makes pasting larger blocks of code
|
|
easier (press :kbd:`F3` again to return to the regular prompt).
|
|
|
|
To disable the new interactive shell,
|
|
set the :envvar:`PYTHON_BASIC_REPL` environment variable.
|
|
For more on interactive mode, see :ref:`tut-interac`.
|
|
|
|
(Contributed by Pablo Galindo Salgado, Łukasz Langa, and
|
|
Lysandros Nikolaou in :gh:`111201` based on code from the PyPy project.
|
|
Windows support contributed by Dino Viehland and Anthony Shaw.)
|
|
|
|
.. _`PyPy project`: https://pypy.org/
|
|
|
|
|
|
.. _whatsnew313-improved-error-messages:
|
|
|
|
Improved error messages
|
|
-----------------------
|
|
|
|
* The interpreter now uses color by default when displaying tracebacks in the
|
|
terminal. This feature :ref:`can be controlled <using-on-controlling-color>`
|
|
via the new :envvar:`PYTHON_COLORS` environment variable as well as
|
|
the canonical |NO_COLOR|_ and |FORCE_COLOR|_ environment variables.
|
|
(Contributed by Pablo Galindo Salgado in :gh:`112730`.)
|
|
|
|
.. Apparently this how you hack together a formatted link:
|
|
(https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)
|
|
|
|
.. |FORCE_COLOR| replace:: ``FORCE_COLOR``
|
|
.. _FORCE_COLOR: https://force-color.org/
|
|
|
|
.. |NO_COLOR| replace:: ``NO_COLOR``
|
|
.. _NO_COLOR: https://no-color.org/
|
|
|
|
* A common mistake is to write a script with the same name as a
|
|
standard library module. When this results in errors, we now
|
|
display a more helpful error message:
|
|
|
|
.. code-block:: pytb
|
|
|
|
$ python random.py
|
|
Traceback (most recent call last):
|
|
File "/home/me/random.py", line 1, in <module>
|
|
import random
|
|
File "/home/me/random.py", line 3, in <module>
|
|
print(random.randint(5))
|
|
^^^^^^^^^^^^^^
|
|
AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and the import system gives it precedence)
|
|
|
|
Similarly, if a script has the same name as a third-party
|
|
module that it attempts to import and this results in errors,
|
|
we also display a more helpful error message:
|
|
|
|
.. code-block:: pytb
|
|
|
|
$ python numpy.py
|
|
Traceback (most recent call last):
|
|
File "/home/me/numpy.py", line 1, in <module>
|
|
import numpy as np
|
|
File "/home/me/numpy.py", line 3, in <module>
|
|
np.array([1, 2, 3])
|
|
^^^^^^^^
|
|
AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a third-party module you intended to import)
|
|
|
|
(Contributed by Shantanu Jain in :gh:`95754`.)
|
|
|
|
* The error message now tries to suggest the correct keyword argument
|
|
when an incorrect keyword argument is passed to a function.
|
|
|
|
.. code-block:: pycon
|
|
|
|
>>> "Better error messages!".split(max_split=1)
|
|
Traceback (most recent call last):
|
|
File "<python-input-0>", line 1, in <module>
|
|
"Better error messages!".split(max_split=1)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
|
|
TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
|
|
|
|
(Contributed by Pablo Galindo Salgado and Shantanu Jain in :gh:`107944`.)
|
|
|
|
|
|
.. _whatsnew313-free-threaded-cpython:
|
|
|
|
Free-threaded CPython
|
|
---------------------
|
|
|
|
CPython now has experimental support for running in a free-threaded mode,
|
|
with the :term:`global interpreter lock` (GIL) disabled.
|
|
This is an experimental feature and therefore is not enabled by default.
|
|
The free-threaded mode requires a different executable,
|
|
usually called ``python3.13t`` or ``python3.13t.exe``.
|
|
Pre-built binaries marked as *free-threaded* can be installed as part of
|
|
the official :ref:`Windows <install-freethreaded-windows>`
|
|
and :ref:`macOS <install-freethreaded-macos>` installers,
|
|
or CPython can be built from source with the :option:`--disable-gil` option.
|
|
|
|
Free-threaded execution allows for full utilization of the available
|
|
processing power by running threads in parallel on available CPU cores.
|
|
While not all software will benefit from this automatically, programs
|
|
designed with threading in mind will run faster on multi-core hardware.
|
|
**The free-threaded mode is experimental** and work is ongoing to improve it:
|
|
expect some bugs and a substantial single-threaded performance hit.
|
|
Free-threaded builds of CPython support optionally running with the GIL
|
|
enabled at runtime using the environment variable :envvar:`PYTHON_GIL` or
|
|
the command-line option :option:`-X gil=1`.
|
|
|
|
To check if the current interpreter supports free-threading, :option:`python -VV <-V>`
|
|
and :attr:`sys.version` contain "experimental free-threading build".
|
|
The new :func:`!sys._is_gil_enabled` function can be used to check whether
|
|
the GIL is actually disabled in the running process.
|
|
|
|
C-API extension modules need to be built specifically for the free-threaded
|
|
build. Extensions that support running with the :term:`GIL` disabled should
|
|
use the :c:data:`Py_mod_gil` slot. Extensions using single-phase init should
|
|
use :c:func:`PyUnstable_Module_SetGIL` to indicate whether they support
|
|
running with the GIL disabled. Importing C extensions that don't use these
|
|
mechanisms will cause the GIL to be enabled, unless the GIL was explicitly
|
|
disabled with the :envvar:`PYTHON_GIL` environment variable or the
|
|
:option:`-X gil=0` option.
|
|
pip 24.1 or newer is required to install packages with C extensions in the
|
|
free-threaded build.
|
|
|
|
This work was made possible thanks to many individuals and
|
|
organizations, including the large community of contributors to Python
|
|
and third-party projects to test and enable free-threading support.
|
|
Notable contributors include:
|
|
Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers,
|
|
Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers,
|
|
Lysandros Nikolaou, and many others.
|
|
Many of these contributors are employed by Meta, which has
|
|
provided significant engineering resources to support this project.
|
|
|
|
.. seealso::
|
|
|
|
:pep:`703` "Making the Global Interpreter Lock Optional in CPython"
|
|
contains rationale and information surrounding this work.
|
|
|
|
`Porting Extension Modules to Support Free-Threading
|
|
<https://py-free-threading.github.io/porting/>`_: A community-maintained
|
|
porting guide for extension authors.
|
|
|
|
|
|
.. _whatsnew313-jit-compiler:
|
|
|
|
An experimental just-in-time (JIT) compiler
|
|
-------------------------------------------
|
|
|
|
When CPython is configured and built using
|
|
the :option:`!--enable-experimental-jit` option,
|
|
a just-in-time (JIT) compiler is added which may speed up some Python programs.
|
|
On Windows, use ``PCbuild/build.bat --experimental-jit`` to enable the JIT
|
|
or ``--experimental-jit-interpreter`` to enable the Tier 2 interpreter.
|
|
Build requirements and further supporting information `are contained at`__
|
|
:file:`Tools/jit/README.md`.
|
|
|
|
__ https://github.com/python/cpython/blob/main/Tools/jit/README.md
|
|
|
|
The :option:`!--enable-experimental-jit` option takes these (optional) values,
|
|
defaulting to ``yes`` if :option:`!--enable-experimental-jit` is present
|
|
without the optional value.
|
|
|
|
* ``no``: Disable the entire Tier 2 and JIT pipeline.
|
|
* ``yes``: Enable the JIT.
|
|
To disable the JIT at runtime, pass the environment variable ``PYTHON_JIT=0``.
|
|
* ``yes-off``: Build the JIT but disable it by default.
|
|
To enable the JIT at runtime, pass the environment variable ``PYTHON_JIT=1``.
|
|
* ``interpreter``: Enable the Tier 2 interpreter but disable the JIT.
|
|
The interpreter can be disabled by running with ``PYTHON_JIT=0``.
|
|
|
|
The internal architecture is roughly as follows:
|
|
|
|
* We start with specialized *Tier 1 bytecode*.
|
|
See :ref:`What's new in 3.11 <whatsnew311-pep659>` for details.
|
|
* When the Tier 1 bytecode gets hot enough, it gets translated
|
|
to a new purely internal intermediate representation (IR),
|
|
called the *Tier 2 IR*, and sometimes referred to as micro-ops ("uops").
|
|
* The Tier 2 IR uses the same stack-based virtual machine as Tier 1,
|
|
but the instruction format is better suited to translation to machine code.
|
|
* We have several optimization passes for Tier 2 IR, which are applied
|
|
before it is interpreted or translated to machine code.
|
|
* There is a Tier 2 interpreter, but it is mostly intended for debugging
|
|
the earlier stages of the optimization pipeline.
|
|
The Tier 2 interpreter can be enabled by configuring Python
|
|
with ``--enable-experimental-jit=interpreter``.
|
|
* When the JIT is enabled, the optimized
|
|
Tier 2 IR is translated to machine code, which is then executed.
|
|
* The machine code translation process uses a technique called
|
|
*copy-and-patch*. It has no runtime dependencies, but there is a new
|
|
build-time dependency on LLVM.
|
|
|
|
.. seealso:: :pep:`744`
|
|
|
|
(JIT by Brandt Bucher, inspired by a paper by Haoran Xu and Fredrik Kjolstad.
|
|
Tier 2 IR by Mark Shannon and Guido van Rossum.
|
|
Tier 2 optimizer by Ken Jin.)
|
|
|
|
|
|
.. _whatsnew313-locals-semantics:
|
|
|
|
Defined mutation semantics for :py:func:`locals`
|
|
------------------------------------------------
|
|
|
|
Historically, the expected result of mutating the return value of
|
|
:func:`locals` has been left to individual Python implementations to define.
|
|
Starting from Python 3.13, :pep:`667` standardises
|
|
the historical behavior of CPython for most code execution scopes,
|
|
but changes :term:`optimized scopes <optimized scope>`
|
|
(functions, generators, coroutines, comprehensions, and generator expressions)
|
|
to explicitly return independent snapshots of the currently assigned local
|
|
variables, including locally referenced nonlocal variables captured in closures.
|
|
|
|
This change to the semantics of :func:`locals` in optimized scopes also
|
|
affects the default behavior of code execution functions that implicitly
|
|
target :func:`!locals` if no explicit namespace is provided
|
|
(such as :func:`exec` and :func:`eval`).
|
|
In previous versions, whether or not changes could be accessed by calling
|
|
:func:`!locals` after calling the code execution function was
|
|
implementation-dependent. In CPython specifically, such code would typically
|
|
appear to work as desired, but could sometimes fail in optimized scopes based
|
|
on other code (including debuggers and code execution tracing tools)
|
|
potentially resetting the shared snapshot in that scope.
|
|
Now, the code will always run against an independent snapshot of
|
|
the local variables in optimized scopes, and hence the changes will never
|
|
be visible in subsequent calls to :func:`!locals`.
|
|
To access the changes made in these cases, an explicit namespace reference
|
|
must now be passed to the relevant function.
|
|
Alternatively, it may make sense to update affected code to use a higher level
|
|
code execution API that returns the resulting code execution namespace
|
|
(e.g. :func:`runpy.run_path` when executing Python files from disk).
|
|
|
|
To ensure debuggers and similar tools can reliably update local variables in
|
|
scopes affected by this change, :attr:`FrameType.f_locals <frame.f_locals>` now
|
|
returns a write-through proxy to the frame's local and locally referenced
|
|
nonlocal variables in these scopes, rather than returning an inconsistently
|
|
updated shared ``dict`` instance with undefined runtime semantics.
|
|
|
|
See :pep:`667` for more details, including related C API changes
|
|
and deprecations. Porting notes are also provided below for the affected
|
|
:ref:`Python APIs <pep667-porting-notes-py>` and :ref:`C APIs
|
|
<pep667-porting-notes-c>`.
|
|
|
|
(PEP and implementation contributed by Mark Shannon and Tian Gao in
|
|
:gh:`74929`. Documentation updates provided by Guido van Rossum and
|
|
Alyssa Coghlan.)
|
|
|
|
|
|
.. _whatsnew313-platform-support:
|
|
|
|
Support for mobile platforms
|
|
----------------------------
|
|
|
|
:pep:`730`: iOS is now a :pep:`11` supported platform, with the
|
|
``arm64-apple-ios`` and ``arm64-apple-ios-simulator`` targets at tier 3
|
|
(iPhone and iPad devices released after 2013 and the Xcode iOS simulator
|
|
running on Apple silicon hardware, respectively).
|
|
``x86_64-apple-ios-simulator``
|
|
(the Xcode iOS simulator running on older ``x86_64`` hardware)
|
|
is not a tier 3 supported platform, but will have best-effort support.
|
|
(PEP written and implementation contributed by Russell Keith-Magee in
|
|
:gh:`114099`.)
|
|
|
|
:pep:`738`: Android is now a :pep:`11` supported platform, with the
|
|
``aarch64-linux-android`` and ``x86_64-linux-android`` targets at tier 3.
|
|
The 32-bit targets ``arm-linux-androideabi`` and ``i686-linux-android``
|
|
are not tier 3 supported platforms, but will have best-effort support.
|
|
(PEP written and implementation contributed by Malcolm Smith in
|
|
:gh:`116622`.)
|
|
|
|
.. seealso:: :pep:`730`, :pep:`738`
|
|
|
|
|
|
Other Language Changes
|
|
======================
|
|
|
|
* The compiler now strips common leading whitespace
|
|
from every line in a docstring.
|
|
This reduces the size of the :term:`bytecode cache <bytecode>`
|
|
(such as ``.pyc`` files), with reductions in file size of around 5%,
|
|
for example in :mod:`!sqlalchemy.orm.session` from SQLAlchemy 2.0.
|
|
This change affects tools that use docstrings, such as :mod:`doctest`.
|
|
|
|
.. doctest::
|
|
|
|
>>> def spam():
|
|
... """
|
|
... This is a docstring with
|
|
... leading whitespace.
|
|
...
|
|
... It even has multiple paragraphs!
|
|
... """
|
|
...
|
|
>>> spam.__doc__
|
|
'\nThis is a docstring with\n leading whitespace.\n\nIt even has multiple paragraphs!\n'
|
|
|
|
(Contributed by Inada Naoki in :gh:`81283`.)
|
|
|
|
* :ref:`Annotation scopes <annotation-scopes>` within class scopes
|
|
can now contain lambdas and comprehensions.
|
|
Comprehensions that are located within class scopes
|
|
are not inlined into their parent scope.
|
|
|
|
.. code-block:: python
|
|
|
|
class C[T]:
|
|
type Alias = lambda: T
|
|
|
|
(Contributed by Jelle Zijlstra in :gh:`109118` and :gh:`118160`.)
|
|
|
|
* :ref:`Future statements <future>` are no longer triggered by
|
|
relative imports of the :mod:`__future__` module,
|
|
meaning that statements of the form ``from .__future__ import ...``
|
|
are now simply standard relative imports, with no special features activated.
|
|
(Contributed by Jeremiah Gabriel Pascual in :gh:`118216`.)
|
|
|
|
* :keyword:`global` declarations are now permitted in :keyword:`except` blocks
|
|
when that global is used in the :keyword:`else` block.
|
|
Previously this raised an erroneous :exc:`SyntaxError`.
|
|
(Contributed by Irit Katriel in :gh:`111123`.)
|
|
|
|
* Add :envvar:`PYTHON_FROZEN_MODULES`, a new environment variable that
|
|
determines whether frozen modules are ignored by the import machinery,
|
|
equivalent to the :option:`-X frozen_modules <-X>` command-line option.
|
|
(Contributed by Yilei Yang in :gh:`111374`.)
|
|
|
|
* Add :ref:`support for the perf profiler <perf_profiling>` working
|
|
without `frame pointers <https://en.wikipedia.org/wiki/Call_stack>`_ through
|
|
the new environment variable :envvar:`PYTHON_PERF_JIT_SUPPORT`
|
|
and command-line option :option:`-X perf_jit <-X>`.
|
|
(Contributed by Pablo Galindo in :gh:`118518`.)
|
|
|
|
* The location of a :file:`.python_history` file can be changed via the
|
|
new :envvar:`PYTHON_HISTORY` environment variable.
|
|
(Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade
|
|
in :gh:`73965`.)
|
|
|
|
* Classes have a new :attr:`~type.__static_attributes__` attribute.
|
|
This is populated by the compiler with a tuple of the class's attribute names
|
|
which are assigned through ``self.<name>`` from any function in its body.
|
|
(Contributed by Irit Katriel in :gh:`115775`.)
|
|
|
|
* The compiler now creates a :attr:`!__firstlineno__` attribute on classes
|
|
with the line number of the first line of the class definition.
|
|
(Contributed by Serhiy Storchaka in :gh:`118465`.)
|
|
|
|
* The :func:`exec` and :func:`eval` builtins now accept
|
|
the *globals* and *locals* arguments as keywords.
|
|
(Contributed by Raphael Gaschignard in :gh:`105879`)
|
|
|
|
* The :func:`compile` builtin now accepts a new flag,
|
|
``ast.PyCF_OPTIMIZED_AST``, which is similar to ``ast.PyCF_ONLY_AST``
|
|
except that the returned AST is optimized according to
|
|
the value of the *optimize* argument.
|
|
(Contributed by Irit Katriel in :gh:`108113`).
|
|
|
|
* Add a :attr:`~property.__name__` attribute on :class:`property` objects.
|
|
(Contributed by Eugene Toder in :gh:`101860`.)
|
|
|
|
* Add :exc:`PythonFinalizationError`, a new exception derived from
|
|
:exc:`RuntimeError` and used to signal when operations are blocked
|
|
during :term:`finalization <interpreter shutdown>`.
|
|
The following callables now raise :exc:`!PythonFinalizationError`,
|
|
instead of :exc:`RuntimeError`:
|
|
|
|
* :func:`_thread.start_new_thread`
|
|
* :func:`os.fork`
|
|
* :func:`os.forkpty`
|
|
* :class:`subprocess.Popen`
|
|
|
|
(Contributed by Victor Stinner in :gh:`114570`.)
|
|
|
|
* Allow the *count* argument of :meth:`str.replace` to be a keyword.
|
|
(Contributed by Hugo van Kemenade in :gh:`106487`.)
|
|
|
|
* Many functions now emit a warning if a boolean value is passed as
|
|
a file descriptor argument.
|
|
This can help catch some errors earlier.
|
|
(Contributed by Serhiy Storchaka in :gh:`82626`.)
|
|
|
|
* Added :attr:`!name` and :attr:`!mode` attributes
|
|
for compressed and archived file-like objects in
|
|
the :mod:`bz2`, :mod:`lzma`, :mod:`tarfile`, and :mod:`zipfile` modules.
|
|
(Contributed by Serhiy Storchaka in :gh:`115961`.)
|
|
|
|
|
|
New Modules
|
|
===========
|
|
|
|
* :mod:`dbm.sqlite3`: An SQLite backend for :mod:`dbm`.
|
|
(Contributed by Raymond Hettinger and Erlend E. Aasland in :gh:`100414`.)
|
|
|
|
|
|
Improved Modules
|
|
================
|
|
|
|
|
|
argparse
|
|
--------
|
|
|
|
* Add the *deprecated* parameter to the
|
|
:meth:`~argparse.ArgumentParser.add_argument`
|
|
and :meth:`!add_parser` methods, to enable deprecating
|
|
command-line options, positional arguments, and subcommands.
|
|
(Contributed by Serhiy Storchaka in :gh:`83648`.)
|
|
|
|
|
|
array
|
|
-----
|
|
|
|
* Add the ``'w'`` type code (``Py_UCS4``) for Unicode characters.
|
|
It should be used instead of the deprecated ``'u'`` type code.
|
|
(Contributed by Inada Naoki in :gh:`80480`.)
|
|
|
|
* Register :class:`array.array` as a :class:`~collections.abc.MutableSequence`
|
|
by implementing the :meth:`~array.array.clear` method.
|
|
(Contributed by Mike Zimin in :gh:`114894`.)
|
|
|
|
|
|
ast
|
|
---
|
|
|
|
* The constructors of node types in the :mod:`ast` module are now
|
|
stricter in the arguments they accept,
|
|
with more intuitive behavior when arguments are omitted.
|
|
|
|
If an optional field on an AST node is not included as an argument when
|
|
constructing an instance, the field will now be set to ``None``. Similarly,
|
|
if a list field is omitted, that field will now be set to an empty list,
|
|
and if an :class:`!expr_context` field is omitted, it defaults to
|
|
:class:`Load() <ast.Load>`.
|
|
(Previously, in all cases, the attribute would be missing on the newly
|
|
constructed AST node instance.)
|
|
|
|
In all other cases, where a required argument is omitted,
|
|
the node constructor will emit a :exc:`DeprecationWarning`.
|
|
This will raise an exception in Python 3.15.
|
|
Similarly, passing a keyword argument to the constructor
|
|
that does not map to a field on the AST node is now deprecated,
|
|
and will raise an exception in Python 3.15.
|
|
|
|
These changes do not apply to user-defined subclasses of :class:`ast.AST`
|
|
unless the class opts in to the new behavior
|
|
by defining the :attr:`.AST._field_types` mapping.
|
|
|
|
(Contributed by Jelle Zijlstra in :gh:`105858`, :gh:`117486`, and :gh:`118851`.)
|
|
|
|
* :func:`ast.parse` now accepts an optional argument *optimize*
|
|
which is passed on to :func:`compile`.
|
|
This makes it possible to obtain an optimized AST.
|
|
(Contributed by Irit Katriel in :gh:`108113`.)
|
|
|
|
|
|
asyncio
|
|
-------
|
|
|
|
* :func:`asyncio.as_completed` now returns an object that is both an
|
|
:term:`asynchronous iterator` and a plain :term:`iterator`
|
|
of :term:`awaitables <awaitable>`.
|
|
The awaitables yielded by asynchronous iteration include original task
|
|
or future objects that were passed in,
|
|
making it easier to associate results with the tasks being completed.
|
|
(Contributed by Justin Arthur in :gh:`77714`.)
|
|
|
|
* :meth:`asyncio.loop.create_unix_server` will now automatically remove
|
|
the Unix socket when the server is closed.
|
|
(Contributed by Pierre Ossman in :gh:`111246`.)
|
|
|
|
* :meth:`.DatagramTransport.sendto` will now send zero-length
|
|
datagrams if called with an empty bytes object.
|
|
The transport flow control also now accounts for the datagram header
|
|
when calculating the buffer size.
|
|
(Contributed by Jamie Phan in :gh:`115199`.)
|
|
|
|
* Add :meth:`Queue.shutdown <asyncio.Queue.shutdown>`
|
|
and :exc:`~asyncio.QueueShutDown` to manage queue termination.
|
|
(Contributed by Laurie Opperman and Yves Duprat in :gh:`104228`.)
|
|
|
|
* Add the :meth:`.Server.close_clients` and :meth:`.Server.abort_clients`
|
|
methods, which more forcefully close an asyncio server.
|
|
(Contributed by Pierre Ossman in :gh:`113538`.)
|
|
|
|
* Accept a tuple of separators in :meth:`.StreamReader.readuntil`,
|
|
stopping when any one of them is encountered.
|
|
(Contributed by Bruce Merry in :gh:`81322`.)
|
|
|
|
* Improve the behavior of :class:`~asyncio.TaskGroup` when
|
|
an external cancellation collides with an internal cancellation.
|
|
For example, when two task groups are nested
|
|
and both experience an exception in a child task simultaneously,
|
|
it was possible that the outer task group would hang,
|
|
because its internal cancellation was swallowed by the inner task group.
|
|
|
|
In the case where a task group is cancelled externally
|
|
and also must raise an :exc:`ExceptionGroup`,
|
|
it will now call the parent task's :meth:`~asyncio.Task.cancel` method.
|
|
This ensures that a :exc:`~asyncio.CancelledError` will be raised
|
|
at the next :keyword:`await`, so the cancellation is not lost.
|
|
|
|
An added benefit of these changes is that task groups now preserve
|
|
the cancellation count (:meth:`~asyncio.Task.cancelling`).
|
|
|
|
In order to handle some corner cases, :meth:`~asyncio.Task.uncancel` may now
|
|
reset the undocumented ``_must_cancel`` flag
|
|
when the cancellation count reaches zero.
|
|
|
|
(Inspired by an issue reported by Arthur Tacca in :gh:`116720`.)
|
|
|
|
* When :meth:`.TaskGroup.create_task` is called on an inactive
|
|
:class:`~asyncio.TaskGroup`, the given coroutine will be closed (which
|
|
prevents a :exc:`RuntimeWarning` about the given coroutine being
|
|
never awaited).
|
|
(Contributed by Arthur Tacca and Jason Zhang in :gh:`115957`.)
|
|
|
|
|
|
base64
|
|
------
|
|
|
|
* Add :func:`~base64.z85encode` and :func:`~base64.z85decode` functions
|
|
for encoding :class:`bytes` as `Z85 data`_
|
|
and decoding Z85-encoded data to :class:`!bytes`.
|
|
(Contributed by Matan Perelman in :gh:`75299`.)
|
|
|
|
.. _Z85 data: https://rfc.zeromq.org/spec/32/
|
|
|
|
|
|
compileall
|
|
----------
|
|
|
|
* The default number of worker threads and processes is now selected using
|
|
:func:`os.process_cpu_count` instead of :func:`os.cpu_count`.
|
|
(Contributed by Victor Stinner in :gh:`109649`.)
|
|
|
|
|
|
concurrent.futures
|
|
------------------
|
|
|
|
* The default number of worker threads and processes is now selected using
|
|
:func:`os.process_cpu_count` instead of :func:`os.cpu_count`.
|
|
(Contributed by Victor Stinner in :gh:`109649`.)
|
|
|
|
|
|
configparser
|
|
------------
|
|
|
|
* :class:`~configparser.ConfigParser` now has support for unnamed sections,
|
|
which allows for top-level key-value pairs.
|
|
This can be enabled with the new *allow_unnamed_section* parameter.
|
|
(Contributed by Pedro Sousa Lacerda in :gh:`66449`.)
|
|
|
|
|
|
copy
|
|
----
|
|
|
|
* The new :func:`~copy.replace` function and the :meth:`replace protocol
|
|
<object.__replace__>` make creating modified copies of objects much simpler.
|
|
This is especially useful when working with immutable objects.
|
|
The following types support the :func:`~copy.replace` function
|
|
and implement the replace protocol:
|
|
|
|
* :func:`collections.namedtuple`
|
|
* :class:`dataclasses.dataclass`
|
|
* :class:`datetime.datetime`, :class:`datetime.date`, :class:`datetime.time`
|
|
* :class:`inspect.Signature`, :class:`inspect.Parameter`
|
|
* :class:`types.SimpleNamespace`
|
|
* :ref:`code objects <code-objects>`
|
|
|
|
Any user-defined class can also support :func:`copy.replace` by defining
|
|
the :meth:`~object.__replace__` method.
|
|
(Contributed by Serhiy Storchaka in :gh:`108751`.)
|
|
|
|
|
|
ctypes
|
|
------
|
|
|
|
* As a consequence of necessary internal refactoring, initialization of
|
|
internal metaclasses now happens in ``__init__`` rather
|
|
than in ``__new__``. This affects projects that subclass these internal
|
|
metaclasses to provide custom initialization.
|
|
Generally:
|
|
|
|
- Custom logic that was done in ``__new__`` after calling ``super().__new__``
|
|
should be moved to ``__init__``.
|
|
- To create a class, call the metaclass, not only the metaclass's
|
|
``__new__`` method.
|
|
|
|
See :gh:`124520` for discussion and links to changes in some affected
|
|
projects.
|
|
|
|
* :class:`ctypes.Structure` objects have a new :attr:`~ctypes.Structure._align_`
|
|
attribute which allows the alignment of the structure being packed to/from
|
|
memory to be specified explicitly.
|
|
(Contributed by Matt Sanderson in :gh:`112433`)
|
|
|
|
dbm
|
|
---
|
|
|
|
* Add :mod:`dbm.sqlite3`, a new module which implements an SQLite backend,
|
|
and make it the default :mod:`!dbm` backend.
|
|
(Contributed by Raymond Hettinger and Erlend E. Aasland in :gh:`100414`.)
|
|
|
|
* Allow removing all items from the database through
|
|
the new :meth:`.gdbm.clear` and :meth:`.ndbm.clear` methods.
|
|
(Contributed by Donghee Na in :gh:`107122`.)
|
|
|
|
|
|
dis
|
|
---
|
|
|
|
* Change the output of :mod:`dis` module functions to show logical
|
|
labels for jump targets and exception handlers, rather than offsets.
|
|
The offsets can be added with the new
|
|
:option:`-O <dis --show-offsets>` command-line option
|
|
or the *show_offsets* argument.
|
|
(Contributed by Irit Katriel in :gh:`112137`.)
|
|
|
|
* :meth:`~dis.get_instructions` no longer represents cache entries
|
|
as separate instructions.
|
|
Instead, it returns them as part of the :class:`~dis.Instruction`,
|
|
in the new *cache_info* field.
|
|
The *show_caches* argument to :meth:`~dis.get_instructions` is deprecated
|
|
and no longer has any effect.
|
|
(Contributed by Irit Katriel in :gh:`112962`.)
|
|
|
|
|
|
.. _whatsnew313-doctest:
|
|
|
|
doctest
|
|
-------
|
|
|
|
* :mod:`doctest` output is now colored by default.
|
|
This can be controlled via the new :envvar:`PYTHON_COLORS` environment
|
|
variable as well as the canonical |NO_COLOR|_
|
|
and |FORCE_COLOR|_ environment variables.
|
|
See also :ref:`using-on-controlling-color`.
|
|
(Contributed by Hugo van Kemenade in :gh:`117225`.)
|
|
|
|
* The :meth:`.DocTestRunner.run` method now counts the number of skipped tests.
|
|
Add the :attr:`.DocTestRunner.skips` and :attr:`.TestResults.skipped` attributes.
|
|
(Contributed by Victor Stinner in :gh:`108794`.)
|
|
|
|
|
|
email
|
|
-----
|
|
|
|
* Headers with embedded newlines are now quoted on output.
|
|
The :mod:`~email.generator` will now refuse to serialize (write) headers
|
|
that are improperly folded or delimited, such that they would be parsed as
|
|
multiple headers or joined with adjacent data.
|
|
If you need to turn this safety feature off,
|
|
set :attr:`~email.policy.Policy.verify_generated_headers`.
|
|
(Contributed by Bas Bloemsaat and Petr Viktorin in :gh:`121650`.)
|
|
|
|
* :func:`~email.utils.getaddresses` and :func:`~email.utils.parseaddr` now
|
|
return ``('', '')`` pairs in more situations where invalid email addresses
|
|
are encountered instead of potentially inaccurate values.
|
|
The two functions have a new optional *strict* parameter (default ``True``).
|
|
To get the old behavior (accepting malformed input), use ``strict=False``.
|
|
``getattr(email.utils, 'supports_strict_parsing', False)`` can be used
|
|
to check if the *strict* parameter is available.
|
|
(Contributed by Thomas Dwyer and Victor Stinner for :gh:`102988` to improve
|
|
the :cve:`2023-27043` fix.)
|
|
|
|
|
|
fractions
|
|
---------
|
|
|
|
* :class:`~fractions.Fraction` objects now support the standard
|
|
:ref:`format specification mini-language <formatspec>` rules
|
|
for fill, alignment, sign handling, minimum width, and grouping.
|
|
(Contributed by Mark Dickinson in :gh:`111320`.)
|
|
|
|
|
|
glob
|
|
----
|
|
|
|
* Add :func:`~glob.translate`, a function to convert a path specification
|
|
with shell-style wildcards to a regular expression.
|
|
(Contributed by Barney Gale in :gh:`72904`.)
|
|
|
|
|
|
importlib
|
|
---------
|
|
|
|
* The following functions in :mod:`importlib.resources` now allow accessing
|
|
a directory (or tree) of resources, using multiple positional arguments
|
|
(the *encoding* and *errors* arguments in the text-reading functions
|
|
are now keyword-only):
|
|
|
|
* :func:`~importlib.resources.is_resource`
|
|
* :func:`~importlib.resources.open_binary`
|
|
* :func:`~importlib.resources.open_text`
|
|
* :func:`~importlib.resources.path`
|
|
* :func:`~importlib.resources.read_binary`
|
|
* :func:`~importlib.resources.read_text`
|
|
|
|
These functions are no longer deprecated and are not scheduled for removal.
|
|
(Contributed by Petr Viktorin in :gh:`116608`.)
|
|
|
|
* :func:`~importlib.resources.contents` remains deprecated in favor of
|
|
the fully-featured :class:`~importlib.resources.abc.Traversable` API.
|
|
However, there is now no plan to remove it.
|
|
(Contributed by Petr Viktorin in :gh:`116608`.)
|
|
|
|
|
|
io
|
|
--
|
|
|
|
* The :class:`~io.IOBase` finalizer now logs any errors raised by
|
|
the :meth:`~io.IOBase.close` method with :data:`sys.unraisablehook`.
|
|
Previously, errors were ignored silently by default,
|
|
and only logged in :ref:`Python Development Mode <devmode>`
|
|
or when using a :ref:`Python debug build <debug-build>`.
|
|
(Contributed by Victor Stinner in :gh:`62948`.)
|
|
|
|
|
|
ipaddress
|
|
---------
|
|
|
|
* Add the :attr:`.IPv4Address.ipv6_mapped` property,
|
|
which returns the IPv4-mapped IPv6 address.
|
|
(Contributed by Charles Machalow in :gh:`109466`.)
|
|
|
|
* Fix ``is_global`` and ``is_private`` behavior in
|
|
:class:`~ipaddress.IPv4Address`, :class:`~ipaddress.IPv6Address`,
|
|
:class:`~ipaddress.IPv4Network`, and :class:`~ipaddress.IPv6Network`.
|
|
(Contributed by Jakub Stasiak in :gh:`113171`.)
|
|
|
|
|
|
itertools
|
|
---------
|
|
|
|
* :func:`~itertools.batched` has a new *strict* parameter,
|
|
which raises a :exc:`ValueError` if the final batch is shorter
|
|
than the specified batch size.
|
|
(Contributed by Raymond Hettinger in :gh:`113202`.)
|
|
|
|
|
|
marshal
|
|
-------
|
|
|
|
* Add the *allow_code* parameter in module functions.
|
|
Passing ``allow_code=False`` prevents serialization and de-serialization
|
|
of code objects which are incompatible between Python versions.
|
|
(Contributed by Serhiy Storchaka in :gh:`113626`.)
|
|
|
|
|
|
math
|
|
----
|
|
|
|
* The new function :func:`~math.fma` performs fused multiply-add operations.
|
|
This computes ``x * y + z`` with only a single round,
|
|
and so avoids any intermediate loss of precision.
|
|
It wraps the ``fma()`` function provided by C99,
|
|
and follows the specification of the IEEE 754 "fusedMultiplyAdd" operation
|
|
for special cases.
|
|
(Contributed by Mark Dickinson and Victor Stinner in :gh:`73468`.)
|
|
|
|
|
|
mimetypes
|
|
---------
|
|
|
|
* Add the :func:`~mimetypes.guess_file_type` function to guess a MIME type
|
|
from a filesystem path.
|
|
Using paths with :func:`~mimetypes.guess_type` is now :term:`soft deprecated`.
|
|
(Contributed by Serhiy Storchaka in :gh:`66543`.)
|
|
|
|
|
|
mmap
|
|
----
|
|
|
|
* :class:`~mmap.mmap` is now protected from crashing on Windows when the
|
|
mapped memory is inaccessible due to file system errors or access violations.
|
|
(Contributed by Jannis Weigend in :gh:`118209`.)
|
|
|
|
* :class:`~mmap.mmap` has a new :meth:`~mmap.mmap.seekable` method
|
|
that can be used when a seekable file-like object is required.
|
|
The :meth:`~mmap.mmap.seek` method now returns the new absolute position.
|
|
(Contributed by Donghee Na and Sylvie Liberman in :gh:`111835`.)
|
|
|
|
* The new UNIX-only *trackfd* parameter for :class:`~mmap.mmap` controls
|
|
file descriptor duplication;
|
|
if false, the file descriptor specified by *fileno* will not be duplicated.
|
|
(Contributed by Zackery Spytz and Petr Viktorin in :gh:`78502`.)
|
|
|
|
|
|
multiprocessing
|
|
---------------
|
|
|
|
* The default number of worker threads and processes is now selected using
|
|
:func:`os.process_cpu_count` instead of :func:`os.cpu_count`.
|
|
(Contributed by Victor Stinner in :gh:`109649`.)
|
|
|
|
|
|
os
|
|
--
|
|
|
|
* Add :func:`~os.process_cpu_count` function to get the number
|
|
of logical CPU cores usable by the calling thread of the current process.
|
|
(Contributed by Victor Stinner in :gh:`109649`.)
|
|
|
|
* :func:`~os.cpu_count` and :func:`~os.process_cpu_count` can be overridden
|
|
through the new environment variable :envvar:`PYTHON_CPU_COUNT`
|
|
or the new command-line option :option:`-X cpu_count <-X>`.
|
|
This option is useful for users who need to limit CPU resources
|
|
of a container system without having to modify application code
|
|
or the container itself.
|
|
(Contributed by Donghee Na in :gh:`109595`.)
|
|
|
|
* Add a :ref:`low level interface <os-timerfd>` to Linux's
|
|
:manpage:`timer file descriptors <timerfd_create(2)>`
|
|
via :func:`~os.timerfd_create`,
|
|
:func:`~os.timerfd_settime`, :func:`~os.timerfd_settime_ns`,
|
|
:func:`~os.timerfd_gettime`, :func:`~os.timerfd_gettime_ns`,
|
|
:const:`~os.TFD_NONBLOCK`, :const:`~os.TFD_CLOEXEC`,
|
|
:const:`~os.TFD_TIMER_ABSTIME`, and :const:`~os.TFD_TIMER_CANCEL_ON_SET`
|
|
(Contributed by Masaru Tsuchiyama in :gh:`108277`.)
|
|
|
|
* :func:`~os.lchmod` and the *follow_symlinks* argument of :func:`~os.chmod`
|
|
are both now available on Windows.
|
|
Note that the default value of *follow_symlinks*
|
|
in :func:`!lchmod` is ``False`` on Windows.
|
|
(Contributed by Serhiy Storchaka in :gh:`59616`.)
|
|
|
|
* :func:`~os.fchmod` and support for file descriptors in :func:`~os.chmod`
|
|
are both now available on Windows.
|
|
(Contributed by Serhiy Storchaka in :gh:`113191`.)
|
|
|
|
* On Windows, :func:`~os.mkdir` and :func:`~os.makedirs` now support passing
|
|
a *mode* value of ``0o700`` to apply access control to the new directory.
|
|
This implicitly affects :func:`tempfile.mkdtemp`
|
|
and is a mitigation for :cve:`2024-4030`.
|
|
Other values for *mode* continue to be ignored.
|
|
(Contributed by Steve Dower in :gh:`118486`.)
|
|
|
|
* :func:`~os.posix_spawn` now accepts ``None`` for the *env* argument,
|
|
which makes the newly spawned process use the current process environment.
|
|
(Contributed by Jakub Kulik in :gh:`113119`.)
|
|
|
|
* :func:`~os.posix_spawn` can now use the :attr:`~os.POSIX_SPAWN_CLOSEFROM`
|
|
attribute in the *file_actions* parameter on platforms that support
|
|
:c:func:`!posix_spawn_file_actions_addclosefrom_np`.
|
|
(Contributed by Jakub Kulik in :gh:`113117`.)
|
|
|
|
|
|
os.path
|
|
-------
|
|
|
|
* Add :func:`~os.path.isreserved` to check if a path is reserved
|
|
on the current system.
|
|
This function is only available on Windows.
|
|
(Contributed by Barney Gale in :gh:`88569`.)
|
|
|
|
* On Windows, :func:`~os.path.isabs` no longer considers paths
|
|
starting with exactly one slash (``\`` or ``/``) to be absolute.
|
|
(Contributed by Barney Gale and Jon Foster in :gh:`44626`.)
|
|
|
|
* :func:`~os.path.realpath` now resolves MS-DOS style file names
|
|
even if the file is not accessible.
|
|
(Contributed by Moonsik Park in :gh:`82367`.)
|
|
|
|
|
|
pathlib
|
|
-------
|
|
|
|
* Add :exc:`~pathlib.UnsupportedOperation`, which is raised instead of
|
|
:exc:`NotImplementedError` when a path operation isn't supported.
|
|
(Contributed by Barney Gale in :gh:`89812`.)
|
|
|
|
* Add a new constructor for creating :class:`~pathlib.Path` objects
|
|
from 'file' URIs (``file:///``), :meth:`.Path.from_uri`.
|
|
(Contributed by Barney Gale in :gh:`107465`.)
|
|
|
|
* Add :meth:`.PurePath.full_match` for matching paths with
|
|
shell-style wildcards, including the recursive wildcard "``**``".
|
|
(Contributed by Barney Gale in :gh:`73435`.)
|
|
|
|
* Add the :attr:`.PurePath.parser` class attribute to store the
|
|
implementation of :mod:`os.path` used
|
|
for low-level path parsing and joining.
|
|
This will be either :mod:`!posixpath` or :mod:`!ntpath`.
|
|
|
|
* Add *recurse_symlinks* keyword-only argument to
|
|
:meth:`.Path.glob` and :meth:`~pathlib.Path.rglob`.
|
|
(Contributed by Barney Gale in :gh:`77609`.)
|
|
|
|
* :meth:`.Path.glob` and :meth:`~pathlib.Path.rglob`
|
|
now return files and directories when given a pattern that ends with "``**``".
|
|
Previously, only directories were returned.
|
|
(Contributed by Barney Gale in :gh:`70303`.)
|
|
|
|
* Add the *follow_symlinks* keyword-only argument to
|
|
:meth:`Path.is_file <pathlib.Path.is_file>`,
|
|
:meth:`Path.is_dir <pathlib.Path.is_dir>`,
|
|
:meth:`.Path.owner`, and :meth:`.Path.group`.
|
|
(Contributed by Barney Gale in :gh:`105793` and Kamil Turek in :gh:`107962`.)
|
|
|
|
|
|
pdb
|
|
---
|
|
|
|
* :func:`breakpoint` and :func:`~pdb.set_trace` now enter the debugger immediately
|
|
rather than on the next line of code to be executed. This change prevents the
|
|
debugger from breaking outside of the context when :func:`!breakpoint` is positioned
|
|
at the end of the context.
|
|
(Contributed by Tian Gao in :gh:`118579`.)
|
|
|
|
* ``sys.path[0]`` is no longer replaced by the directory of the script
|
|
being debugged when :attr:`sys.flags.safe_path` is set.
|
|
(Contributed by Tian Gao and Christian Walther in :gh:`111762`.)
|
|
|
|
* :mod:`zipapp` is now supported as a debugging target.
|
|
(Contributed by Tian Gao in :gh:`118501`.)
|
|
|
|
* Add ability to move between chained exceptions during
|
|
post-mortem debugging in :func:`~pdb.pm` using
|
|
the new :pdbcmd:`exceptions [exc_number] <exceptions>` command for Pdb.
|
|
(Contributed by Matthias Bussonnier in :gh:`106676`.)
|
|
|
|
* Expressions and statements whose prefix is a pdb command are now correctly
|
|
identified and executed.
|
|
(Contributed by Tian Gao in :gh:`108464`.)
|
|
|
|
|
|
queue
|
|
-----
|
|
|
|
* Add :meth:`Queue.shutdown <queue.Queue.shutdown>` and :exc:`~queue.ShutDown`
|
|
to manage queue termination.
|
|
(Contributed by Laurie Opperman and Yves Duprat in :gh:`104750`.)
|
|
|
|
|
|
random
|
|
------
|
|
|
|
* Add a :ref:`command-line interface <random-cli>`.
|
|
(Contributed by Hugo van Kemenade in :gh:`118131`.)
|
|
|
|
|
|
re
|
|
--
|
|
|
|
* Rename :exc:`!re.error` to :exc:`~re.PatternError` for improved clarity.
|
|
:exc:`!re.error` is kept for backward compatibility.
|
|
|
|
|
|
shutil
|
|
------
|
|
|
|
* Support the *dir_fd* and *follow_symlinks* keyword arguments
|
|
in :func:`~shutil.chown`.
|
|
(Contributed by Berker Peksag and Tahia K in :gh:`62308`)
|
|
|
|
|
|
site
|
|
----
|
|
|
|
* :file:`.pth` files are now decoded using UTF-8 first,
|
|
and then with the :term:`locale encoding` if UTF-8 decoding fails.
|
|
(Contributed by Inada Naoki in :gh:`117802`.)
|
|
|
|
|
|
sqlite3
|
|
-------
|
|
|
|
* A :exc:`ResourceWarning` is now emitted if a :class:`~sqlite3.Connection`
|
|
object is not :meth:`closed <sqlite3.Connection.close>` explicitly.
|
|
(Contributed by Erlend E. Aasland in :gh:`105539`.)
|
|
|
|
* Add the *filter* keyword-only parameter to :meth:`.Connection.iterdump`
|
|
for filtering database objects to dump.
|
|
(Contributed by Mariusz Felisiak in :gh:`91602`.)
|
|
|
|
|
|
ssl
|
|
---
|
|
|
|
* The :func:`~ssl.create_default_context` API now includes
|
|
:data:`~ssl.VERIFY_X509_PARTIAL_CHAIN` and :data:`~ssl.VERIFY_X509_STRICT`
|
|
in its default flags.
|
|
|
|
.. note::
|
|
|
|
:data:`~ssl.VERIFY_X509_STRICT` may reject pre-:rfc:`5280`
|
|
or malformed certificates that the underlying OpenSSL implementation
|
|
might otherwise accept.
|
|
Whilst disabling this is not recommended, you can do so using:
|
|
|
|
.. code-block:: python
|
|
|
|
import ssl
|
|
|
|
ctx = ssl.create_default_context()
|
|
ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
|
|
|
|
(Contributed by William Woodruff in :gh:`112389`.)
|
|
|
|
|
|
statistics
|
|
----------
|
|
|
|
* Add :func:`~statistics.kde` for kernel density estimation.
|
|
This makes it possible to estimate a continuous probability density function
|
|
from a fixed number of discrete samples.
|
|
(Contributed by Raymond Hettinger in :gh:`115863`.)
|
|
|
|
* Add :func:`~statistics.kde_random` for sampling from an
|
|
estimated probability density function created by :func:`~statistics.kde`.
|
|
(Contributed by Raymond Hettinger in :gh:`115863`.)
|
|
|
|
|
|
.. _whatsnew313-subprocess:
|
|
|
|
subprocess
|
|
----------
|
|
|
|
* The :mod:`subprocess` module now uses the :func:`~os.posix_spawn` function in
|
|
more situations.
|
|
|
|
Notably, when *close_fds* is ``True`` (the default),
|
|
:func:`~os.posix_spawn` will be used when the C library provides
|
|
:c:func:`!posix_spawn_file_actions_addclosefrom_np`,
|
|
which includes recent versions of Linux, FreeBSD, and Solaris.
|
|
On Linux, this should perform similarly to the existing
|
|
Linux :c:func:`!vfork` based code.
|
|
|
|
A private control knob :attr:`!subprocess._USE_POSIX_SPAWN` can
|
|
be set to ``False`` if you need to force :mod:`subprocess`
|
|
to never use :func:`~os.posix_spawn`.
|
|
Please report your reason and platform details in
|
|
the :ref:`issue tracker <using-the-tracker>` if you set this
|
|
so that we can improve our API selection logic for everyone.
|
|
(Contributed by Jakub Kulik in :gh:`113117`.)
|
|
|
|
|
|
sys
|
|
---
|
|
|
|
* Add the :func:`~sys._is_interned` function to test if a string was interned.
|
|
This function is not guaranteed to exist in all implementations of Python.
|
|
(Contributed by Serhiy Storchaka in :gh:`78573`.)
|
|
|
|
|
|
tempfile
|
|
--------
|
|
|
|
* On Windows, the default mode ``0o700`` used by :func:`tempfile.mkdtemp` now
|
|
limits access to the new directory due to changes to :func:`os.mkdir`.
|
|
This is a mitigation for :cve:`2024-4030`.
|
|
(Contributed by Steve Dower in :gh:`118486`.)
|
|
|
|
|
|
time
|
|
----
|
|
|
|
* On Windows, :func:`~time.monotonic` now uses the
|
|
``QueryPerformanceCounter()`` clock for a resolution of 1 microsecond,
|
|
instead of the ``GetTickCount64()`` clock which has
|
|
a resolution of 15.6 milliseconds.
|
|
(Contributed by Victor Stinner in :gh:`88494`.)
|
|
|
|
* On Windows, :func:`~time.time` now uses the
|
|
``GetSystemTimePreciseAsFileTime()`` clock for a resolution of 1 microsecond,
|
|
instead of the ``GetSystemTimeAsFileTime()`` clock which has
|
|
a resolution of 15.6 milliseconds.
|
|
(Contributed by Victor Stinner in :gh:`63207`.)
|
|
|
|
|
|
tkinter
|
|
-------
|
|
|
|
* Add :mod:`tkinter` widget methods:
|
|
:meth:`!tk_busy_hold`, :meth:`!tk_busy_configure`,
|
|
:meth:`!tk_busy_cget`, :meth:`!tk_busy_forget`,
|
|
:meth:`!tk_busy_current`, and :meth:`!tk_busy_status`.
|
|
(Contributed by Miguel, klappnase and Serhiy Storchaka in :gh:`72684`.)
|
|
|
|
* The :mod:`tkinter` widget method :meth:`!wm_attributes` now accepts
|
|
the attribute name without the minus prefix to get window attributes,
|
|
for example ``w.wm_attributes('alpha')``
|
|
and allows specifying attributes and values to set as keyword arguments,
|
|
for example ``w.wm_attributes(alpha=0.5)``.
|
|
(Contributed by Serhiy Storchaka in :gh:`43457`.)
|
|
|
|
* :meth:`!wm_attributes` can now return attributes as a :class:`dict`,
|
|
by using the new optional keyword-only parameter *return_python_dict*.
|
|
(Contributed by Serhiy Storchaka in :gh:`43457`.)
|
|
|
|
* :meth:`!Text.count` can now return a simple :class:`int`
|
|
when the new optional keyword-only parameter *return_ints* is used.
|
|
Otherwise, the single count is returned as a 1-tuple or ``None``.
|
|
(Contributed by Serhiy Storchaka in :gh:`97928`.)
|
|
|
|
* Support the "vsapi" element type in
|
|
the :meth:`~tkinter.ttk.Style.element_create` method of
|
|
:class:`tkinter.ttk.Style`.
|
|
(Contributed by Serhiy Storchaka in :gh:`68166`.)
|
|
|
|
* Add the :meth:`!after_info` method for Tkinter widgets.
|
|
(Contributed by Cheryl Sabella in :gh:`77020`.)
|
|
|
|
* Add a new :meth:`!copy_replace` method to :class:`!PhotoImage`
|
|
to copy a region from one image to another,
|
|
possibly with pixel zooming, subsampling, or both.
|
|
(Contributed by Serhiy Storchaka in :gh:`118225`.)
|
|
|
|
* Add *from_coords* parameter to the :class:`!PhotoImage` methods
|
|
:meth:`!copy`, :meth:`!zoom` and :meth:`!subsample`.
|
|
Add *zoom* and *subsample* parameters to the :class:`!PhotoImage` method
|
|
:meth:`!copy`.
|
|
(Contributed by Serhiy Storchaka in :gh:`118225`.)
|
|
|
|
* Add the :class:`!PhotoImage` methods
|
|
:meth:`!read` to read an image from a file
|
|
and :meth:`!data` to get the image data.
|
|
Add *background* and *grayscale* parameters to the :meth:`!write` method.
|
|
(Contributed by Serhiy Storchaka in :gh:`118271`.)
|
|
|
|
|
|
traceback
|
|
---------
|
|
|
|
* Add the :attr:`~traceback.TracebackException.exc_type_str` attribute
|
|
to :class:`~traceback.TracebackException`,
|
|
which holds a string display of the *exc_type*.
|
|
Deprecate the :attr:`~traceback.TracebackException.exc_type` attribute,
|
|
which holds the type object itself.
|
|
Add parameter *save_exc_type* (default ``True``)
|
|
to indicate whether ``exc_type`` should be saved.
|
|
(Contributed by Irit Katriel in :gh:`112332`.)
|
|
|
|
* Add a new *show_group* keyword-only parameter to
|
|
:meth:`.TracebackException.format_exception_only` to (recursively) format
|
|
the nested exceptions of a :exc:`BaseExceptionGroup` instance.
|
|
(Contributed by Irit Katriel in :gh:`105292`.)
|
|
|
|
|
|
types
|
|
-----
|
|
|
|
* :class:`~types.SimpleNamespace` can now take a single positional argument
|
|
to initialise the namespace's arguments.
|
|
This argument must either be a mapping or an iterable of key-value pairs.
|
|
(Contributed by Serhiy Storchaka in :gh:`108191`.)
|
|
|
|
|
|
typing
|
|
------
|
|
|
|
* :pep:`705`: Add :data:`~typing.ReadOnly`, a special typing construct
|
|
to mark a :class:`~typing.TypedDict` item as read-only for type checkers.
|
|
|
|
* :pep:`742`: Add :data:`~typing.TypeIs`, a typing construct
|
|
that can be used to instruct a type checker how to narrow a type.
|
|
|
|
* Add :data:`~typing.NoDefault`, a sentinel object used to represent
|
|
the defaults of some parameters in the :mod:`typing` module.
|
|
(Contributed by Jelle Zijlstra in :gh:`116126`.)
|
|
|
|
* Add :func:`~typing.get_protocol_members` to return the set of members
|
|
defining a :class:`typing.Protocol`.
|
|
(Contributed by Jelle Zijlstra in :gh:`104873`.)
|
|
|
|
* Add :func:`~typing.is_protocol` to check whether a class
|
|
is a :class:`~typing.Protocol`.
|
|
(Contributed by Jelle Zijlstra in :gh:`104873`.)
|
|
|
|
* :data:`~typing.ClassVar` can now be nested in :data:`~typing.Final`,
|
|
and vice versa.
|
|
(Contributed by Mehdi Drissi in :gh:`89547`.)
|
|
|
|
|
|
unicodedata
|
|
-----------
|
|
|
|
* Update the Unicode database to `version 15.1.0`__.
|
|
(Contributed by James Gerity in :gh:`109559`.)
|
|
|
|
__ https://www.unicode.org/versions/Unicode15.1.0/
|
|
|
|
|
|
venv
|
|
----
|
|
|
|
* Add support for creating source control management (SCM) ignore files
|
|
in a virtual environment's directory.
|
|
By default, Git is supported.
|
|
This is implemented as opt-in via the API,
|
|
which can be extended to support other SCMs
|
|
(:class:`~venv.EnvBuilder` and :func:`~venv.create`),
|
|
and opt-out via the CLI, using :option:`!--without-scm-ignore-files`.
|
|
(Contributed by Brett Cannon in :gh:`108125`.)
|
|
|
|
|
|
warnings
|
|
--------
|
|
|
|
* :pep:`702`: The new :func:`warnings.deprecated` decorator provides a way to
|
|
communicate deprecations to a :term:`static type checker`
|
|
and to warn on usage of deprecated classes and functions.
|
|
A :exc:`DeprecationWarning` may also be emitted when
|
|
a decorated function or class is used at runtime.
|
|
(Contributed by Jelle Zijlstra in :gh:`104003`.)
|
|
|
|
|
|
xml
|
|
---
|
|
|
|
* Allow controlling Expat >=2.6.0 reparse deferral (:cve:`2023-52425`)
|
|
by adding five new methods:
|
|
|
|
* :meth:`xml.etree.ElementTree.XMLParser.flush`
|
|
* :meth:`xml.etree.ElementTree.XMLPullParser.flush`
|
|
* :meth:`xml.parsers.expat.xmlparser.GetReparseDeferralEnabled`
|
|
* :meth:`xml.parsers.expat.xmlparser.SetReparseDeferralEnabled`
|
|
* :meth:`!xml.sax.expatreader.ExpatParser.flush`
|
|
|
|
(Contributed by Sebastian Pipping in :gh:`115623`.)
|
|
|
|
* Add the :meth:`!close` method for the iterator returned by
|
|
:func:`~xml.etree.ElementTree.iterparse` for explicit cleanup.
|
|
(Contributed by Serhiy Storchaka in :gh:`69893`.)
|
|
|
|
|
|
zipimport
|
|
---------
|
|
|
|
* Add support for ZIP64_ format files.
|
|
Everybody loves huge data, right?
|
|
(Contributed by Tim Hatch in :gh:`94146`.)
|
|
|
|
.. _ZIP64: https://en.wikipedia.org/wiki/Zip_(file_format)#ZIP64
|
|
|
|
|
|
Optimizations
|
|
=============
|
|
|
|
* Several standard library modules have had
|
|
their import times significantly improved.
|
|
For example, the import time of the :mod:`typing` module
|
|
has been reduced by around a third by removing dependencies
|
|
on :mod:`re` and :mod:`contextlib`.
|
|
Other modules to enjoy import-time speedups include
|
|
:mod:`email.utils`, :mod:`enum`, :mod:`functools`,
|
|
:mod:`importlib.metadata`, and :mod:`threading`.
|
|
(Contributed by Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas,
|
|
and others in :gh:`109653`.)
|
|
|
|
* :func:`textwrap.indent` is now around 30% faster than before for large input.
|
|
(Contributed by Inada Naoki in :gh:`107369`.)
|
|
|
|
* The :mod:`subprocess` module now uses the :func:`~os.posix_spawn` function in
|
|
more situations, including when *close_fds* is ``True`` (the default)
|
|
on many modern platforms.
|
|
This should provide a notable performance increase
|
|
when launching processes on FreeBSD and Solaris.
|
|
See the :ref:`subprocess <whatsnew313-subprocess>` section above for details.
|
|
(Contributed by Jakub Kulik in :gh:`113117`.)
|
|
|
|
|
|
Removed Modules And APIs
|
|
========================
|
|
|
|
|
|
.. _whatsnew313-pep594:
|
|
|
|
PEP 594: Remove "dead batteries" from the standard library
|
|
----------------------------------------------------------
|
|
|
|
:pep:`594` proposed removing 19 modules from the standard library,
|
|
colloquially referred to as 'dead batteries' due to their
|
|
historic, obsolete, or insecure status.
|
|
All of the following modules were deprecated in Python 3.11,
|
|
and are now removed:
|
|
|
|
* :mod:`!aifc`
|
|
* :mod:`!audioop`
|
|
* :mod:`!chunk`
|
|
* :mod:`!cgi` and :mod:`!cgitb`
|
|
|
|
* :class:`!cgi.FieldStorage` can typically be replaced with
|
|
:func:`urllib.parse.parse_qsl` for ``GET`` and ``HEAD`` requests,
|
|
and the :mod:`email.message` module or the :pypi:`multipart` library
|
|
for ``POST`` and ``PUT`` requests.
|
|
|
|
* :func:`!cgi.parse` can be replaced by calling
|
|
:func:`urllib.parse.parse_qs` directly on the desired query string,
|
|
unless the input is ``multipart/form-data``,
|
|
which should be replaced as described below for :func:`!cgi.parse_multipart`.
|
|
|
|
* :func:`!cgi.parse_header` can be replaced with the functionality
|
|
in the :mod:`email` package, which implements the same MIME RFCs.
|
|
For example, with :class:`email.message.EmailMessage`:
|
|
|
|
.. code-block:: python
|
|
|
|
from email.message import EmailMessage
|
|
|
|
msg = EmailMessage()
|
|
msg['content-type'] = 'application/json; charset="utf8"'
|
|
main, params = msg.get_content_type(), msg['content-type'].params
|
|
|
|
* :func:`!cgi.parse_multipart` can be replaced with the functionality
|
|
in the :mod:`email` package, which implements the same MIME RFCs,
|
|
or with the :pypi:`multipart` library.
|
|
For example, the :class:`email.message.EmailMessage`
|
|
and :class:`email.message.Message` classes.
|
|
|
|
* :mod:`!crypt` and the private :mod:`!_crypt` extension.
|
|
The :mod:`hashlib` module may be an appropriate replacement
|
|
when simply hashing a value is required.
|
|
Otherwise, various third-party libraries on PyPI are available:
|
|
|
|
* :pypi:`bcrypt`:
|
|
Modern password hashing for your software and your servers.
|
|
* :pypi:`passlib`:
|
|
Comprehensive password hashing framework supporting over 30 schemes.
|
|
* :pypi:`argon2-cffi`:
|
|
The secure Argon2 password hashing algorithm.
|
|
* :pypi:`legacycrypt`:
|
|
:mod:`ctypes` wrapper to the POSIX crypt library call
|
|
and associated functionality.
|
|
* :pypi:`crypt_r`:
|
|
Fork of the :mod:`!crypt` module,
|
|
wrapper to the :manpage:`crypt_r(3)` library call
|
|
and associated functionality.
|
|
|
|
* :mod:`!imghdr`:
|
|
The :pypi:`filetype`, :pypi:`puremagic`, or :pypi:`python-magic` libraries
|
|
should be used as replacements.
|
|
For example, the :func:`!puremagic.what` function can be used
|
|
to replace the :func:`!imghdr.what` function for all file formats
|
|
that were supported by :mod:`!imghdr`.
|
|
* :mod:`!mailcap`:
|
|
Use the :mod:`mimetypes` module instead.
|
|
* :mod:`!msilib`
|
|
* :mod:`!nis`
|
|
* :mod:`!nntplib`:
|
|
Use the :pypi:`pynntp` library from PyPI instead.
|
|
* :mod:`!ossaudiodev`:
|
|
For audio playback, use the :pypi:`pygame` library from PyPI instead.
|
|
* :mod:`!pipes`:
|
|
Use the :mod:`subprocess` module instead.
|
|
* :mod:`!sndhdr`:
|
|
The :pypi:`filetype`, :pypi:`puremagic`, or :pypi:`python-magic` libraries
|
|
should be used as replacements.
|
|
* :mod:`!spwd`:
|
|
Use the :pypi:`python-pam` library from PyPI instead.
|
|
* :mod:`!sunau`
|
|
* :mod:`!telnetlib`,
|
|
Use the :pypi:`telnetlib3` or :pypi:`Exscript` libraries from PyPI instead.
|
|
* :mod:`!uu`:
|
|
Use the :mod:`base64` module instead, as a modern alternative.
|
|
* :mod:`!xdrlib`
|
|
|
|
(Contributed by Victor Stinner and Zachary Ware in :gh:`104773` and :gh:`104780`.)
|
|
|
|
|
|
2to3
|
|
----
|
|
|
|
* Remove the :program:`2to3` program and the :mod:`!lib2to3` module,
|
|
previously deprecated in Python 3.11.
|
|
(Contributed by Victor Stinner in :gh:`104780`.)
|
|
|
|
|
|
builtins
|
|
--------
|
|
|
|
* Remove support for chained :class:`classmethod` descriptors
|
|
(introduced in :gh:`63272`).
|
|
These can no longer be used to wrap other descriptors,
|
|
such as :class:`property`.
|
|
The core design of this feature was flawed and led to several problems.
|
|
To "pass-through" a :class:`classmethod`, consider using
|
|
the :attr:`!__wrapped__` attribute that was added in Python 3.10.
|
|
(Contributed by Raymond Hettinger in :gh:`89519`.)
|
|
|
|
* Raise a :exc:`RuntimeError` when calling :meth:`frame.clear`
|
|
on a suspended frame (as has always been the case for an executing frame).
|
|
(Contributed by Irit Katriel in :gh:`79932`.)
|
|
|
|
|
|
configparser
|
|
------------
|
|
|
|
* Remove the undocumented :class:`!LegacyInterpolation` class,
|
|
deprecated in the docstring since Python 3.2,
|
|
and at runtime since Python 3.11.
|
|
(Contributed by Hugo van Kemenade in :gh:`104886`.)
|
|
|
|
|
|
importlib.metadata
|
|
------------------
|
|
|
|
* Remove deprecated subscript (:meth:`~object.__getitem__`) access for
|
|
:ref:`EntryPoint <entry-points>` objects.
|
|
(Contributed by Jason R. Coombs in :gh:`113175`.)
|
|
|
|
|
|
locale
|
|
------
|
|
|
|
* Remove the :func:`!locale.resetlocale` function, deprecated in Python 3.11.
|
|
Use ``locale.setlocale(locale.LC_ALL, "")`` instead.
|
|
(Contributed by Victor Stinner in :gh:`104783`.)
|
|
|
|
|
|
opcode
|
|
------
|
|
|
|
* Move :attr:`!opcode.ENABLE_SPECIALIZATION` to :attr:`!_opcode.ENABLE_SPECIALIZATION`.
|
|
This field was added in 3.12, it was never documented,
|
|
and is not intended for external use.
|
|
(Contributed by Irit Katriel in :gh:`105481`.)
|
|
|
|
* Remove :func:`!opcode.is_pseudo`, :attr:`!opcode.MIN_PSEUDO_OPCODE`,
|
|
and :attr:`!opcode.MAX_PSEUDO_OPCODE`, which were added in Python 3.12,
|
|
but were neither documented nor exposed through :mod:`dis`,
|
|
and were not intended to be used externally.
|
|
(Contributed by Irit Katriel in :gh:`105481`.)
|
|
|
|
|
|
pathlib
|
|
-------
|
|
|
|
* Remove the ability to use :class:`~pathlib.Path` objects as context managers.
|
|
This functionality was deprecated and has had no effect since Python 3.9.
|
|
(Contributed by Barney Gale in :gh:`83863`.)
|
|
|
|
|
|
re
|
|
--
|
|
|
|
* Remove the undocumented, deprecated, and broken
|
|
:func:`!re.template` function and :attr:`!re.TEMPLATE` / :attr:`!re.T` flag.
|
|
(Contributed by Serhiy Storchaka and Nikita Sobolev in :gh:`105687`.)
|
|
|
|
|
|
tkinter.tix
|
|
-----------
|
|
|
|
* Remove the :mod:`!tkinter.tix` module, deprecated in Python 3.6.
|
|
The third-party Tix library which the module wrapped is unmaintained.
|
|
(Contributed by Zachary Ware in :gh:`75552`.)
|
|
|
|
|
|
turtle
|
|
------
|
|
|
|
* Remove the :meth:`!RawTurtle.settiltangle` method,
|
|
deprecated in the documentation since Python 3.1
|
|
and at runtime since Python 3.11.
|
|
(Contributed by Hugo van Kemenade in :gh:`104876`.)
|
|
|
|
|
|
typing
|
|
------
|
|
|
|
* Remove the :mod:`!typing.io` and :mod:`!typing.re` namespaces,
|
|
deprecated since Python 3.8.
|
|
The items in those namespaces can be imported directly
|
|
from the :mod:`typing` module.
|
|
(Contributed by Sebastian Rittau in :gh:`92871`.)
|
|
|
|
* Remove the keyword-argument method of creating
|
|
:class:`~typing.TypedDict` types, deprecated in Python 3.11.
|
|
(Contributed by Tomas Roun in :gh:`104786`.)
|
|
|
|
|
|
unittest
|
|
--------
|
|
|
|
* Remove the following :mod:`unittest` functions, deprecated in Python 3.11:
|
|
|
|
* :func:`!unittest.findTestCases`
|
|
* :func:`!unittest.makeSuite`
|
|
* :func:`!unittest.getTestCaseNames`
|
|
|
|
Use :class:`~unittest.TestLoader` methods instead:
|
|
|
|
* :meth:`~unittest.TestLoader.loadTestsFromModule`
|
|
* :meth:`~unittest.TestLoader.loadTestsFromTestCase`
|
|
* :meth:`~unittest.TestLoader.getTestCaseNames`
|
|
|
|
(Contributed by Hugo van Kemenade in :gh:`104835`.)
|
|
|
|
* Remove the untested and undocumented :meth:`!TestProgram.usageExit`
|
|
method, deprecated in Python 3.11.
|
|
(Contributed by Hugo van Kemenade in :gh:`104992`.)
|
|
|
|
|
|
urllib
|
|
------
|
|
|
|
* Remove the *cafile*, *capath*, and *cadefault* parameters of the
|
|
:func:`urllib.request.urlopen` function, deprecated in Python 3.6.
|
|
Use the *context* parameter instead with an :class:`~ssl.SSLContext` instance.
|
|
The :meth:`ssl.SSLContext.load_cert_chain` function
|
|
can be used to load specific certificates,
|
|
or let :func:`ssl.create_default_context` select
|
|
the operating system's trusted certificate authority (CA) certificates.
|
|
(Contributed by Victor Stinner in :gh:`105382`.)
|
|
|
|
|
|
webbrowser
|
|
----------
|
|
|
|
* Remove the untested and undocumented :class:`!MacOSX` class,
|
|
deprecated in Python 3.11.
|
|
Use the :class:`!MacOSXOSAScript` class (introduced in Python 3.2) instead.
|
|
(Contributed by Hugo van Kemenade in :gh:`104804`.)
|
|
|
|
* Remove the deprecated :attr:`!MacOSXOSAScript._name` attribute.
|
|
Use the :attr:`MacOSXOSAScript.name <webbrowser.controller.name>`
|
|
attribute instead.
|
|
(Contributed by Nikita Sobolev in :gh:`105546`.)
|
|
|
|
|
|
New Deprecations
|
|
================
|
|
|
|
* :ref:`User-defined functions <user-defined-funcs>`:
|
|
|
|
* Deprecate assignment to a function's :attr:`~function.__code__` attribute,
|
|
where the new code object's type does not match the function's type.
|
|
The different types are:
|
|
plain function, generator, async generator, and coroutine.
|
|
(Contributed by Irit Katriel in :gh:`81137`.)
|
|
|
|
* :mod:`array`:
|
|
|
|
* Deprecate the ``'u'`` format code (:c:type:`wchar_t`) at runtime.
|
|
This format code has been deprecated in documentation since Python 3.3,
|
|
and will be removed in Python 3.16.
|
|
Use the ``'w'`` format code (:c:type:`Py_UCS4`)
|
|
for Unicode characters instead.
|
|
(Contributed by Hugo van Kemenade in :gh:`80480`.)
|
|
|
|
* :mod:`ctypes`:
|
|
|
|
* Deprecate the undocumented :func:`!SetPointerType` function,
|
|
to be removed in Python 3.15.
|
|
(Contributed by Victor Stinner in :gh:`105733`.)
|
|
|
|
* :term:`Soft-deprecate <soft deprecated>` the :func:`~ctypes.ARRAY`
|
|
function in favour of ``type * length`` multiplication.
|
|
(Contributed by Victor Stinner in :gh:`105733`.)
|
|
|
|
* :mod:`decimal`:
|
|
|
|
* Deprecate the non-standard and undocumented :class:`~decimal.Decimal`
|
|
format specifier ``'N'``,
|
|
which is only supported in the :mod:`!decimal` module's C implementation.
|
|
(Contributed by Serhiy Storchaka in :gh:`89902`.)
|
|
|
|
* :mod:`dis`:
|
|
|
|
* Deprecate the :attr:`!HAVE_ARGUMENT` separator.
|
|
Check membership in :data:`~dis.hasarg` instead.
|
|
(Contributed by Irit Katriel in :gh:`109319`.)
|
|
|
|
* :mod:`getopt` and :mod:`optparse`:
|
|
|
|
* Both modules are now :term:`soft deprecated`,
|
|
with :mod:`argparse` preferred for new projects.
|
|
This is a new soft-deprecation for the :mod:`!getopt` module,
|
|
whereas the :mod:`!optparse` module was already *de facto* soft deprecated.
|
|
(Contributed by Victor Stinner in :gh:`106535`.)
|
|
|
|
* :mod:`gettext`:
|
|
|
|
* Deprecate non-integer numbers as arguments to functions and methods
|
|
that consider plural forms in the :mod:`!gettext` module,
|
|
even if no translation was found.
|
|
(Contributed by Serhiy Storchaka in :gh:`88434`.)
|
|
|
|
* :mod:`glob`:
|
|
|
|
* Deprecate the undocumented :func:`!glob0` and :func:`!glob1` functions.
|
|
Use :func:`~glob.glob` and pass a :term:`path-like object` specifying
|
|
the root directory to the *root_dir* parameter instead.
|
|
(Contributed by Barney Gale in :gh:`117337`.)
|
|
|
|
* :mod:`http.server`:
|
|
|
|
* Deprecate :class:`~http.server.CGIHTTPRequestHandler`,
|
|
to be removed in Python 3.15.
|
|
Process-based CGI HTTP servers have been out of favor for a very long time.
|
|
This code was outdated, unmaintained, and rarely used.
|
|
It has a high potential for both security and functionality bugs.
|
|
(Contributed by Gregory P. Smith in :gh:`109096`.)
|
|
|
|
* Deprecate the :option:`!--cgi` flag to
|
|
the :program:`python -m http.server` command-line interface,
|
|
to be removed in Python 3.15.
|
|
(Contributed by Gregory P. Smith in :gh:`109096`.)
|
|
|
|
* :mod:`mimetypes`:
|
|
|
|
* :term:`Soft-deprecate <soft deprecated>` file path arguments
|
|
to :func:`~mimetypes.guess_type`,
|
|
use :func:`~mimetypes.guess_file_type` instead.
|
|
(Contributed by Serhiy Storchaka in :gh:`66543`.)
|
|
|
|
* :mod:`re`:
|
|
|
|
* Deprecate passing the optional *maxsplit*, *count*, or *flags* arguments
|
|
as positional arguments to the module-level
|
|
:func:`~re.split`, :func:`~re.sub`, and :func:`~re.subn` functions.
|
|
These parameters will become :ref:`keyword-only <keyword-only_parameter>`
|
|
in a future version of Python.
|
|
(Contributed by Serhiy Storchaka in :gh:`56166`.)
|
|
|
|
* :mod:`pathlib`:
|
|
|
|
* Deprecate :meth:`.PurePath.is_reserved`,
|
|
to be removed in Python 3.15.
|
|
Use :func:`os.path.isreserved` to detect reserved paths on Windows.
|
|
(Contributed by Barney Gale in :gh:`88569`.)
|
|
|
|
* :mod:`platform`:
|
|
|
|
* Deprecate :func:`~platform.java_ver`,
|
|
to be removed in Python 3.15.
|
|
This function is only useful for Jython support, has a confusing API,
|
|
and is largely untested.
|
|
(Contributed by Nikita Sobolev in :gh:`116349`.)
|
|
|
|
* :mod:`pydoc`:
|
|
|
|
* Deprecate the undocumented :func:`!ispackage` function.
|
|
(Contributed by Zackery Spytz in :gh:`64020`.)
|
|
|
|
* :mod:`sqlite3`:
|
|
|
|
* Deprecate passing more than one positional argument to
|
|
the :func:`~sqlite3.connect` function
|
|
and the :class:`~sqlite3.Connection` constructor.
|
|
The remaining parameters will become keyword-only in Python 3.15.
|
|
(Contributed by Erlend E. Aasland in :gh:`107948`.)
|
|
|
|
* Deprecate passing name, number of arguments, and the callable as keyword
|
|
arguments for :meth:`.Connection.create_function`
|
|
and :meth:`.Connection.create_aggregate`
|
|
These parameters will become positional-only in Python 3.15.
|
|
(Contributed by Erlend E. Aasland in :gh:`108278`.)
|
|
|
|
* Deprecate passing the callback callable by keyword for the
|
|
:meth:`~sqlite3.Connection.set_authorizer`,
|
|
:meth:`~sqlite3.Connection.set_progress_handler`, and
|
|
:meth:`~sqlite3.Connection.set_trace_callback`
|
|
:class:`~sqlite3.Connection` methods.
|
|
The callback callables will become positional-only in Python 3.15.
|
|
(Contributed by Erlend E. Aasland in :gh:`108278`.)
|
|
|
|
* :mod:`sys`:
|
|
|
|
* Deprecate the :func:`~sys._enablelegacywindowsfsencoding` function,
|
|
to be removed in Python 3.16.
|
|
Use the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable instead.
|
|
(Contributed by Inada Naoki in :gh:`73427`.)
|
|
|
|
* :mod:`tarfile`:
|
|
|
|
* Deprecate the undocumented and unused :attr:`!TarFile.tarfile` attribute,
|
|
to be removed in Python 3.16.
|
|
(Contributed in :gh:`115256`.)
|
|
|
|
* :mod:`traceback`:
|
|
|
|
* Deprecate the :attr:`.TracebackException.exc_type` attribute.
|
|
Use :attr:`.TracebackException.exc_type_str` instead.
|
|
(Contributed by Irit Katriel in :gh:`112332`.)
|
|
|
|
* :mod:`typing`:
|
|
|
|
* Deprecate the undocumented keyword argument syntax for creating
|
|
:class:`~typing.NamedTuple` classes
|
|
(e.g. ``Point = NamedTuple("Point", x=int, y=int)``),
|
|
to be removed in Python 3.15.
|
|
Use the class-based syntax or the functional syntax instead.
|
|
(Contributed by Alex Waygood in :gh:`105566`.)
|
|
|
|
* Deprecate omitting the *fields* parameter when creating
|
|
a :class:`~typing.NamedTuple` or :class:`typing.TypedDict` class,
|
|
and deprecate passing ``None`` to the *fields* parameter of both types.
|
|
Python 3.15 will require a valid sequence for the *fields* parameter.
|
|
To create a NamedTuple class with zero fields,
|
|
use ``class NT(NamedTuple): pass`` or ``NT = NamedTuple("NT", ())``.
|
|
To create a TypedDict class with zero fields,
|
|
use ``class TD(TypedDict): pass`` or ``TD = TypedDict("TD", {})``.
|
|
(Contributed by Alex Waygood in :gh:`105566` and :gh:`105570`.)
|
|
|
|
* Deprecate the :func:`typing.no_type_check_decorator` decorator function,
|
|
to be removed in in Python 3.15.
|
|
After eight years in the :mod:`typing` module,
|
|
it has yet to be supported by any major type checker.
|
|
(Contributed by Alex Waygood in :gh:`106309`.)
|
|
|
|
* Deprecate :data:`typing.AnyStr`.
|
|
In Python 3.16, it will be removed from ``typing.__all__``,
|
|
and a :exc:`DeprecationWarning` will be emitted at runtime
|
|
when it is imported or accessed.
|
|
It will be removed entirely in Python 3.18.
|
|
Use the new :ref:`type parameter syntax <type-params>` instead.
|
|
(Contributed by Michael The in :gh:`107116`.)
|
|
|
|
* :mod:`wave`:
|
|
|
|
* Deprecate the :meth:`~wave.Wave_read.getmark`, :meth:`!setmark`,
|
|
and :meth:`~wave.Wave_read.getmarkers` methods of
|
|
the :class:`~wave.Wave_read` and :class:`~wave.Wave_write` classes,
|
|
to be removed in Python 3.15.
|
|
(Contributed by Victor Stinner in :gh:`105096`.)
|
|
|
|
.. Add deprecations above alphabetically, not here at the end.
|
|
|
|
.. include:: ../deprecations/pending-removal-in-3.14.rst
|
|
|
|
.. include:: ../deprecations/pending-removal-in-3.15.rst
|
|
|
|
.. include:: ../deprecations/pending-removal-in-3.16.rst
|
|
|
|
.. include:: ../deprecations/pending-removal-in-future.rst
|
|
|
|
CPython Bytecode Changes
|
|
========================
|
|
|
|
* The oparg of :opcode:`YIELD_VALUE` is now
|
|
``1`` if the yield is part of a yield-from or await, and ``0`` otherwise.
|
|
The oparg of :opcode:`RESUME` was changed to add a bit indicating
|
|
if the except-depth is 1, which is needed to optimize closing of generators.
|
|
(Contributed by Irit Katriel in :gh:`111354`.)
|
|
|
|
|
|
C API Changes
|
|
=============
|
|
|
|
New Features
|
|
------------
|
|
|
|
* Add the :ref:`PyMonitoring C API <c-api-monitoring>`
|
|
for generating :pep:`669` monitoring events:
|
|
|
|
* :c:type:`PyMonitoringState`
|
|
* :c:func:`PyMonitoring_FirePyStartEvent`
|
|
* :c:func:`PyMonitoring_FirePyResumeEvent`
|
|
* :c:func:`PyMonitoring_FirePyReturnEvent`
|
|
* :c:func:`PyMonitoring_FirePyYieldEvent`
|
|
* :c:func:`PyMonitoring_FireCallEvent`
|
|
* :c:func:`PyMonitoring_FireLineEvent`
|
|
* :c:func:`PyMonitoring_FireJumpEvent`
|
|
* :c:func:`PyMonitoring_FireBranchEvent`
|
|
* :c:func:`PyMonitoring_FireCReturnEvent`
|
|
* :c:func:`PyMonitoring_FirePyThrowEvent`
|
|
* :c:func:`PyMonitoring_FireRaiseEvent`
|
|
* :c:func:`PyMonitoring_FireCRaiseEvent`
|
|
* :c:func:`PyMonitoring_FireReraiseEvent`
|
|
* :c:func:`PyMonitoring_FireExceptionHandledEvent`
|
|
* :c:func:`PyMonitoring_FirePyUnwindEvent`
|
|
* :c:func:`PyMonitoring_FireStopIterationEvent`
|
|
* :c:func:`PyMonitoring_EnterScope`
|
|
* :c:func:`PyMonitoring_ExitScope`
|
|
|
|
(Contributed by Irit Katriel in :gh:`111997`).
|
|
|
|
* Add :c:type:`PyMutex`, a lightweight mutex that occupies a single byte,
|
|
and the new :c:func:`PyMutex_Lock` and :c:func:`PyMutex_Unlock` functions.
|
|
:c:func:`!PyMutex_Lock` will release the :term:`GIL` (if currently held)
|
|
if the operation needs to block.
|
|
(Contributed by Sam Gross in :gh:`108724`.)
|
|
|
|
* Add the :ref:`PyTime C API <c-api-time>` to provide access to system clocks:
|
|
|
|
* :c:type:`PyTime_t`.
|
|
* :c:var:`PyTime_MIN` and :c:var:`PyTime_MAX`.
|
|
* :c:func:`PyTime_AsSecondsDouble`.
|
|
* :c:func:`PyTime_Monotonic`.
|
|
* :c:func:`PyTime_MonotonicRaw`.
|
|
* :c:func:`PyTime_PerfCounter`.
|
|
* :c:func:`PyTime_PerfCounterRaw`.
|
|
* :c:func:`PyTime_Time`.
|
|
* :c:func:`PyTime_TimeRaw`.
|
|
|
|
(Contributed by Victor Stinner and Petr Viktorin in :gh:`110850`.)
|
|
|
|
* Add the :c:func:`PyDict_ContainsString` function
|
|
with the same behavior as :c:func:`PyDict_Contains`,
|
|
but *key* is specified as a :c:expr:`const char*` UTF-8 encoded bytes string,
|
|
rather than a :c:expr:`PyObject*`.
|
|
(Contributed by Victor Stinner in :gh:`108314`.)
|
|
|
|
* Add the :c:func:`PyDict_GetItemRef` and :c:func:`PyDict_GetItemStringRef`
|
|
functions,
|
|
which behave similarly to :c:func:`PyDict_GetItemWithError`,
|
|
but return a :term:`strong reference` instead of a :term:`borrowed reference`.
|
|
Moreover, these functions return ``-1`` on error,
|
|
removing the need to check :c:func:`!PyErr_Occurred`.
|
|
(Contributed by Victor Stinner in :gh:`106004`.)
|
|
|
|
* Add the :c:func:`PyDict_SetDefaultRef` function,
|
|
which behaves similarly to :c:func:`PyDict_SetDefault`,
|
|
but returns a :term:`strong reference` instead of a :term:`borrowed reference`.
|
|
This function returns ``-1`` on error,
|
|
``0`` on insertion,
|
|
and ``1`` if the key was already present in the dictionary.
|
|
(Contributed by Sam Gross in :gh:`112066`.)
|
|
|
|
* Add the :c:func:`PyDict_Pop` and :c:func:`PyDict_PopString` functions
|
|
to remove a key from a dictionary and optionally return the removed value.
|
|
This is similar to :meth:`dict.pop`,
|
|
though there is no default value,
|
|
and :exc:`KeyError` is not raised for missing keys.
|
|
(Contributed by Stefan Behnel and Victor Stinner in :gh:`111262`.)
|
|
|
|
* Add the :c:func:`PyMapping_GetOptionalItem`
|
|
and :c:func:`PyMapping_GetOptionalItemString` functions
|
|
as alternatives to :c:func:`PyObject_GetItem`
|
|
and :c:func:`PyMapping_GetItemString` respectively.
|
|
The new functions do not raise :exc:`KeyError`
|
|
if the requested key is missing from the mapping.
|
|
These variants are more convenient and faster
|
|
if a missing key should not be treated as a failure.
|
|
(Contributed by Serhiy Storchaka in :gh:`106307`.)
|
|
|
|
* Add the :c:func:`PyObject_GetOptionalAttr`
|
|
and :c:func:`PyObject_GetOptionalAttrString` functions
|
|
as alternatives to :c:func:`PyObject_GetAttr`
|
|
and :c:func:`PyObject_GetAttrString` respectively.
|
|
The new functions do not raise :exc:`AttributeError`
|
|
if the requested attribute is not found on the object.
|
|
These variants are more convenient and faster
|
|
if the missing attribute should not be treated as a failure.
|
|
(Contributed by Serhiy Storchaka in :gh:`106521`.)
|
|
|
|
* Add the :c:func:`PyErr_FormatUnraisable` function
|
|
as an extension to :c:func:`PyErr_WriteUnraisable`
|
|
that allows customizing the warning message.
|
|
(Contributed by Serhiy Storchaka in :gh:`108082`.)
|
|
|
|
* Add new functions that return a :term:`strong reference` instead of
|
|
a :term:`borrowed reference` for frame locals, globals, and builtins,
|
|
as part of :ref:`PEP 667 <whatsnew313-locals-semantics>`:
|
|
|
|
* :c:func:`PyEval_GetFrameBuiltins` replaces :c:func:`PyEval_GetBuiltins`
|
|
* :c:func:`PyEval_GetFrameGlobals` replaces :c:func:`PyEval_GetGlobals`
|
|
* :c:func:`PyEval_GetFrameLocals` replaces :c:func:`PyEval_GetLocals`
|
|
|
|
(Contributed by Mark Shannon and Tian Gao in :gh:`74929`.)
|
|
|
|
* Add the :c:func:`Py_GetConstant` and :c:func:`Py_GetConstantBorrowed`
|
|
functions to get :term:`strong <strong reference>`
|
|
or :term:`borrowed <borrowed reference>` references to constants.
|
|
For example, ``Py_GetConstant(Py_CONSTANT_ZERO)`` returns a strong reference
|
|
to the constant zero.
|
|
(Contributed by Victor Stinner in :gh:`115754`.)
|
|
|
|
* Add the :c:func:`PyImport_AddModuleRef` function
|
|
as a replacement for :c:func:`PyImport_AddModule`
|
|
that returns a :term:`strong reference` instead of a :term:`borrowed reference`.
|
|
(Contributed by Victor Stinner in :gh:`105922`.)
|
|
|
|
* Add the :c:func:`Py_IsFinalizing` function to check
|
|
whether the main Python interpreter is
|
|
:term:`shutting down <interpreter shutdown>`.
|
|
(Contributed by Victor Stinner in :gh:`108014`.)
|
|
|
|
* Add the :c:func:`PyList_GetItemRef` function
|
|
as a replacement for :c:func:`PyList_GetItem`
|
|
that returns a :term:`strong reference` instead of a :term:`borrowed reference`.
|
|
(Contributed by Sam Gross in :gh:`114329`.)
|
|
|
|
* Add the :c:func:`PyList_Extend` and :c:func:`PyList_Clear` functions,
|
|
mirroring the Python :meth:`!list.extend` and :meth:`!list.clear` methods.
|
|
(Contributed by Victor Stinner in :gh:`111138`.)
|
|
|
|
* Add the :c:func:`PyLong_AsInt` function.
|
|
It behaves similarly to :c:func:`PyLong_AsLong`,
|
|
but stores the result in a C :c:expr:`int` instead of a C :c:expr:`long`.
|
|
(Contributed by Victor Stinner in :gh:`108014`.)
|
|
|
|
* Add the :c:func:`PyLong_AsNativeBytes`, :c:func:`PyLong_FromNativeBytes`,
|
|
and :c:func:`PyLong_FromUnsignedNativeBytes` functions
|
|
to simplify converting between native integer types
|
|
and Python :class:`int` objects.
|
|
(Contributed by Steve Dower in :gh:`111140`.)
|
|
|
|
* Add :c:func:`PyModule_Add` function, which is similar to
|
|
:c:func:`PyModule_AddObjectRef` and :c:func:`PyModule_AddObject`,
|
|
but always steals a reference to the value.
|
|
(Contributed by Serhiy Storchaka in :gh:`86493`.)
|
|
|
|
* Add the :c:func:`PyObject_GenericHash` function
|
|
that implements the default hashing function of a Python object.
|
|
(Contributed by Serhiy Storchaka in :gh:`113024`.)
|
|
|
|
* Add the :c:func:`Py_HashPointer` function to hash a raw pointer.
|
|
(Contributed by Victor Stinner in :gh:`111545`.)
|
|
|
|
* Add the :c:func:`PyObject_VisitManagedDict` and
|
|
:c:func:`PyObject_ClearManagedDict` functions.
|
|
which must be called by the traverse and clear functions of a type using
|
|
the :c:macro:`Py_TPFLAGS_MANAGED_DICT` flag.
|
|
The `pythoncapi-compat project`_ can be used to
|
|
use these functions with Python 3.11 and 3.12.
|
|
(Contributed by Victor Stinner in :gh:`107073`.)
|
|
|
|
* Add the :c:func:`PyRefTracer_SetTracer`
|
|
and :c:func:`PyRefTracer_GetTracer` functions,
|
|
which enable tracking object creation and destruction
|
|
in the same way that the :mod:`tracemalloc` module does.
|
|
(Contributed by Pablo Galindo in :gh:`93502`.)
|
|
|
|
* Add the :c:func:`PySys_AuditTuple` function
|
|
as an alternative to :c:func:`PySys_Audit`
|
|
that takes event arguments as a Python :class:`tuple` object.
|
|
(Contributed by Victor Stinner in :gh:`85283`.)
|
|
|
|
* Add the :c:func:`PyThreadState_GetUnchecked()` function
|
|
as an alternative to :c:func:`PyThreadState_Get()`
|
|
that doesn't kill the process with a fatal error if it is ``NULL``.
|
|
The caller is responsible for checking if the result is ``NULL``.
|
|
(Contributed by Victor Stinner in :gh:`108867`.)
|
|
|
|
* Add the :c:func:`PyType_GetFullyQualifiedName` function
|
|
to get the type's fully qualified name.
|
|
The module name is prepended if :attr:`type.__module__` is
|
|
a string and is not equal to either ``'builtins'`` or ``'__main__'``.
|
|
(Contributed by Victor Stinner in :gh:`111696`.)
|
|
|
|
* Add the :c:func:`PyType_GetModuleName` function
|
|
to get the type's module name. This is equivalent to getting the
|
|
:attr:`type.__module__` attribute.
|
|
(Contributed by Eric Snow and Victor Stinner in :gh:`111696`.)
|
|
|
|
* Add the :c:func:`PyUnicode_EqualToUTF8AndSize`
|
|
and :c:func:`PyUnicode_EqualToUTF8` functions
|
|
to compare a Unicode object with a :c:expr:`const char*` UTF-8 encoded string
|
|
and ``1`` if they are equal or ``0`` otherwise.
|
|
These functions do not raise exceptions.
|
|
(Contributed by Serhiy Storchaka in :gh:`110289`.)
|
|
|
|
* Add the :c:func:`PyWeakref_GetRef` function
|
|
as an alternative to :c:func:`PyWeakref_GetObject`
|
|
that returns a :term:`strong reference`
|
|
or ``NULL`` if the referent is no longer live.
|
|
(Contributed by Victor Stinner in :gh:`105927`.)
|
|
|
|
* Add fixed variants of functions which silently ignore errors:
|
|
|
|
* :c:func:`PyObject_HasAttrWithError` replaces :c:func:`PyObject_HasAttr`.
|
|
* :c:func:`PyObject_HasAttrStringWithError`
|
|
replaces :c:func:`PyObject_HasAttrString`.
|
|
* :c:func:`PyMapping_HasKeyWithError` replaces :c:func:`PyMapping_HasKey`.
|
|
* :c:func:`PyMapping_HasKeyStringWithError`
|
|
replaces :c:func:`PyMapping_HasKeyString`.
|
|
|
|
The new functions return ``-1`` for errors
|
|
and the standard ``1`` for true and ``0`` for false.
|
|
|
|
(Contributed by Serhiy Storchaka in :gh:`108511`.)
|
|
|
|
|
|
Changed C APIs
|
|
--------------
|
|
|
|
* The *keywords* parameter of :c:func:`PyArg_ParseTupleAndKeywords`
|
|
and :c:func:`PyArg_VaParseTupleAndKeywords`
|
|
now has type :c:expr:`char * const *` in C
|
|
and :c:expr:`const char * const *` in C++,
|
|
instead of :c:expr:`char **`.
|
|
In C++, this makes these functions compatible with arguments
|
|
of type :c:expr:`const char * const *`, :c:expr:`const char **`,
|
|
or :c:expr:`char * const *` without an explicit type cast.
|
|
In C, the functions only support arguments of type :c:expr:`char * const *`.
|
|
This can be overridden with the :c:macro:`PY_CXX_CONST` macro.
|
|
(Contributed by Serhiy Storchaka in :gh:`65210`.)
|
|
|
|
* :c:func:`PyArg_ParseTupleAndKeywords` now supports
|
|
non-ASCII keyword parameter names.
|
|
(Contributed by Serhiy Storchaka in :gh:`110815`.)
|
|
|
|
* The :c:func:`!PyCode_GetFirstFree` function is now unstable API
|
|
and is now named :c:func:`PyUnstable_Code_GetFirstFree`.
|
|
(Contributed by Bogdan Romanyuk in :gh:`115781`.)
|
|
|
|
* The :c:func:`PyDict_GetItem`, :c:func:`PyDict_GetItemString`,
|
|
:c:func:`PyMapping_HasKey`, :c:func:`PyMapping_HasKeyString`,
|
|
:c:func:`PyObject_HasAttr`, :c:func:`PyObject_HasAttrString`,
|
|
and :c:func:`PySys_GetObject` functions,
|
|
each of which clears all errors which occurred when calling them
|
|
now reports these errors using :func:`sys.unraisablehook`.
|
|
You may replace them with other functions as recommended in the documentation.
|
|
(Contributed by Serhiy Storchaka in :gh:`106672`.)
|
|
|
|
* Add support for the ``%T``, ``%#T``, ``%N`` and ``%#N`` formats
|
|
to :c:func:`PyUnicode_FromFormat`:
|
|
|
|
* ``%T``: Get the fully qualified name of an object type
|
|
* ``%#T``: As above, but use a colon as the separator
|
|
* ``%N``: Get the fully qualified name of a type
|
|
* ``%#N``: As above, but use a colon as the separator
|
|
|
|
See :pep:`737` for more information.
|
|
(Contributed by Victor Stinner in :gh:`111696`.)
|
|
|
|
* You no longer have to define the ``PY_SSIZE_T_CLEAN`` macro before
|
|
including :file:`Python.h` when using ``#`` formats in
|
|
:ref:`format codes <arg-parsing-string-and-buffers>`.
|
|
APIs accepting the format codes always use ``Py_ssize_t`` for ``#`` formats.
|
|
(Contributed by Inada Naoki in :gh:`104922`.)
|
|
|
|
* If Python is built in :ref:`debug mode <debug-build>`
|
|
or :option:`with assertions <--with-assertions>`,
|
|
:c:func:`PyTuple_SET_ITEM` and :c:func:`PyList_SET_ITEM`
|
|
now check the index argument with an assertion.
|
|
(Contributed by Victor Stinner in :gh:`106168`.)
|
|
|
|
|
|
Limited C API Changes
|
|
---------------------
|
|
|
|
* The following functions are now included in the Limited C API:
|
|
|
|
* :c:func:`PyMem_RawMalloc`
|
|
* :c:func:`PyMem_RawCalloc`
|
|
* :c:func:`PyMem_RawRealloc`
|
|
* :c:func:`PyMem_RawFree`
|
|
* :c:func:`PySys_Audit`
|
|
* :c:func:`PySys_AuditTuple`
|
|
* :c:func:`PyType_GetModuleByDef`
|
|
|
|
(Contributed by Victor Stinner in :gh:`85283`, :gh:`85283`, and :gh:`116936`.)
|
|
|
|
* Python built with :option:`--with-trace-refs` (tracing references)
|
|
now supports the :ref:`Limited API <limited-c-api>`.
|
|
(Contributed by Victor Stinner in :gh:`108634`.)
|
|
|
|
|
|
Removed C APIs
|
|
--------------
|
|
|
|
* Remove several functions, macros, variables, etc
|
|
with names prefixed by ``_Py`` or ``_PY`` (which are considered private).
|
|
If your project is affected by one of these removals
|
|
and you believe that the removed API should remain available,
|
|
please :ref:`open a new issue <using-the-tracker>` to request a public C API
|
|
and add ``cc: @vstinner`` to the issue to notify Victor Stinner.
|
|
(Contributed by Victor Stinner in :gh:`106320`.)
|
|
|
|
* Remove old buffer protocols deprecated in Python 3.0.
|
|
Use :ref:`bufferobjects` instead.
|
|
|
|
* :c:func:`!PyObject_CheckReadBuffer`:
|
|
Use :c:func:`PyObject_CheckBuffer` to test
|
|
whether the object supports the buffer protocol.
|
|
Note that :c:func:`PyObject_CheckBuffer` doesn't guarantee
|
|
that :c:func:`PyObject_GetBuffer` will succeed.
|
|
To test if the object is actually readable,
|
|
see the next example of :c:func:`PyObject_GetBuffer`.
|
|
|
|
* :c:func:`!PyObject_AsCharBuffer`, :c:func:`!PyObject_AsReadBuffer`:
|
|
Use :c:func:`PyObject_GetBuffer` and :c:func:`PyBuffer_Release` instead:
|
|
|
|
.. code-block:: c
|
|
|
|
Py_buffer view;
|
|
if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) {
|
|
return NULL;
|
|
}
|
|
// Use `view.buf` and `view.len` to read from the buffer.
|
|
// You may need to cast buf as `(const char*)view.buf`.
|
|
PyBuffer_Release(&view);
|
|
|
|
* :c:func:`!PyObject_AsWriteBuffer`:
|
|
Use :c:func:`PyObject_GetBuffer` and :c:func:`PyBuffer_Release` instead:
|
|
|
|
.. code-block:: c
|
|
|
|
Py_buffer view;
|
|
if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) {
|
|
return NULL;
|
|
}
|
|
// Use `view.buf` and `view.len` to write to the buffer.
|
|
PyBuffer_Release(&view);
|
|
|
|
(Contributed by Inada Naoki in :gh:`85275`.)
|
|
|
|
* Remove various functions deprecated in Python 3.9:
|
|
|
|
* :c:func:`!PyEval_CallObject`, :c:func:`!PyEval_CallObjectWithKeywords`:
|
|
Use :c:func:`PyObject_CallNoArgs` or :c:func:`PyObject_Call` instead.
|
|
|
|
.. warning::
|
|
|
|
In :c:func:`PyObject_Call`, positional arguments must be a :class:`tuple`
|
|
and must not be ``NULL``,
|
|
and keyword arguments must be a :class:`dict` or ``NULL``,
|
|
whereas the removed functions checked argument types
|
|
and accepted ``NULL`` positional and keyword arguments.
|
|
To replace ``PyEval_CallObjectWithKeywords(func, NULL, kwargs)`` with
|
|
:c:func:`PyObject_Call`,
|
|
pass an empty tuple as positional arguments using
|
|
:c:func:`PyTuple_New(0) <PyTuple_New>`.
|
|
|
|
* :c:func:`!PyEval_CallFunction`:
|
|
Use :c:func:`PyObject_CallFunction` instead.
|
|
* :c:func:`!PyEval_CallMethod`:
|
|
Use :c:func:`PyObject_CallMethod` instead.
|
|
* :c:func:`!PyCFunction_Call`:
|
|
Use :c:func:`PyObject_Call` instead.
|
|
|
|
(Contributed by Victor Stinner in :gh:`105107`.)
|
|
|
|
* Remove the following old functions to configure the Python initialization,
|
|
deprecated in Python 3.11:
|
|
|
|
* :c:func:`!PySys_AddWarnOptionUnicode`:
|
|
Use :c:member:`PyConfig.warnoptions` instead.
|
|
* :c:func:`!PySys_AddWarnOption`:
|
|
Use :c:member:`PyConfig.warnoptions` instead.
|
|
* :c:func:`!PySys_AddXOption`:
|
|
Use :c:member:`PyConfig.xoptions` instead.
|
|
* :c:func:`!PySys_HasWarnOptions`:
|
|
Use :c:member:`PyConfig.xoptions` instead.
|
|
* :c:func:`!PySys_SetPath`:
|
|
Set :c:member:`PyConfig.module_search_paths` instead.
|
|
* :c:func:`!Py_SetPath`:
|
|
Set :c:member:`PyConfig.module_search_paths` instead.
|
|
* :c:func:`!Py_SetStandardStreamEncoding`:
|
|
Set :c:member:`PyConfig.stdio_encoding` instead,
|
|
and set also maybe :c:member:`PyConfig.legacy_windows_stdio` (on Windows).
|
|
* :c:func:`!_Py_SetProgramFullPath`:
|
|
Set :c:member:`PyConfig.executable` instead.
|
|
|
|
Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization
|
|
Configuration <init-config>` instead (:pep:`587`), added to Python 3.8.
|
|
(Contributed by Victor Stinner in :gh:`105145`.)
|
|
|
|
* Remove :c:func:`!PyEval_AcquireLock` and :c:func:`!PyEval_ReleaseLock` functions,
|
|
deprecated in Python 3.2.
|
|
They didn't update the current thread state.
|
|
They can be replaced with:
|
|
|
|
* :c:func:`PyEval_SaveThread` and :c:func:`PyEval_RestoreThread`;
|
|
* low-level :c:func:`PyEval_AcquireThread` and :c:func:`PyEval_RestoreThread`;
|
|
* or :c:func:`PyGILState_Ensure` and :c:func:`PyGILState_Release`.
|
|
|
|
(Contributed by Victor Stinner in :gh:`105182`.)
|
|
|
|
* Remove the :c:func:`!PyEval_ThreadsInitialized` function,
|
|
deprecated in Python 3.9.
|
|
Since Python 3.7, :c:func:`!Py_Initialize` always creates the GIL:
|
|
calling :c:func:`!PyEval_InitThreads` does nothing and
|
|
:c:func:`!PyEval_ThreadsInitialized` always returns non-zero.
|
|
(Contributed by Victor Stinner in :gh:`105182`.)
|
|
|
|
* Remove the :c:func:`!_PyInterpreterState_Get` alias to
|
|
:c:func:`PyInterpreterState_Get()`
|
|
which was kept for backward compatibility with Python 3.8.
|
|
The `pythoncapi-compat project`_ can be used to get
|
|
:c:func:`PyInterpreterState_Get()` on Python 3.8 and older.
|
|
(Contributed by Victor Stinner in :gh:`106320`.)
|
|
|
|
* Remove the private :c:func:`!_PyObject_FastCall` function:
|
|
use :c:func:`!PyObject_Vectorcall` which is available since Python 3.8
|
|
(:pep:`590`).
|
|
(Contributed by Victor Stinner in :gh:`106023`.)
|
|
|
|
* Remove the ``cpython/pytime.h`` header file,
|
|
which only contained private functions.
|
|
(Contributed by Victor Stinner in :gh:`106316`.)
|
|
|
|
* Remove the undocumented ``PY_TIMEOUT_MAX`` constant from the limited C API.
|
|
(Contributed by Victor Stinner in :gh:`110014`.)
|
|
|
|
* Remove the old trashcan macros ``Py_TRASHCAN_SAFE_BEGIN``
|
|
and ``Py_TRASHCAN_SAFE_END``.
|
|
Replace both with the new macros ``Py_TRASHCAN_BEGIN``
|
|
and ``Py_TRASHCAN_END``.
|
|
(Contributed by Irit Katriel in :gh:`105111`.)
|
|
|
|
Deprecated C APIs
|
|
-----------------
|
|
|
|
* Deprecate old Python initialization functions:
|
|
|
|
* :c:func:`PySys_ResetWarnOptions`:
|
|
Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead.
|
|
* :c:func:`Py_GetExecPrefix`:
|
|
Get :data:`sys.exec_prefix` instead.
|
|
* :c:func:`Py_GetPath`:
|
|
Get :data:`sys.path` instead.
|
|
* :c:func:`Py_GetPrefix`:
|
|
Get :data:`sys.prefix` instead.
|
|
* :c:func:`Py_GetProgramFullPath`:
|
|
Get :data:`sys.executable` instead.
|
|
* :c:func:`Py_GetProgramName`:
|
|
Get :data:`sys.executable` instead.
|
|
* :c:func:`Py_GetPythonHome`:
|
|
Get :c:member:`PyConfig.home`
|
|
or the :envvar:`PYTHONHOME` environment variable instead.
|
|
|
|
(Contributed by Victor Stinner in :gh:`105145`.)
|
|
|
|
* :term:`Soft deprecate <soft deprecated>` the
|
|
:c:func:`PyEval_GetBuiltins`, :c:func:`PyEval_GetGlobals`,
|
|
and :c:func:`PyEval_GetLocals` functions,
|
|
which return a :term:`borrowed reference`.
|
|
(Soft deprecated as part of :pep:`667`.)
|
|
|
|
* Deprecate the :c:func:`PyImport_ImportModuleNoBlock` function,
|
|
which is just an alias to :c:func:`PyImport_ImportModule` since Python 3.3.
|
|
(Contributed by Victor Stinner in :gh:`105396`.)
|
|
|
|
* :term:`Soft deprecate <soft deprecated>` the
|
|
:c:func:`PyModule_AddObject` function.
|
|
It should be replaced with :c:func:`PyModule_Add`
|
|
or :c:func:`PyModule_AddObjectRef`.
|
|
(Contributed by Serhiy Storchaka in :gh:`86493`.)
|
|
|
|
* Deprecate the old ``Py_UNICODE`` and ``PY_UNICODE_TYPE`` types
|
|
and the :c:macro:`!Py_UNICODE_WIDE` define.
|
|
Use the :c:type:`wchar_t` type directly instead.
|
|
Since Python 3.3, ``Py_UNICODE`` and ``PY_UNICODE_TYPE``
|
|
are just aliases to :c:type:`!wchar_t`.
|
|
(Contributed by Victor Stinner in :gh:`105156`.)
|
|
|
|
* Deprecate the :c:func:`PyWeakref_GetObject` and
|
|
:c:func:`PyWeakref_GET_OBJECT` functions,
|
|
which return a :term:`borrowed reference`.
|
|
Replace them with the new :c:func:`PyWeakref_GetRef` function,
|
|
which returns a :term:`strong reference`.
|
|
The `pythoncapi-compat project`_ can be used to get
|
|
:c:func:`PyWeakref_GetRef` on Python 3.12 and older.
|
|
(Contributed by Victor Stinner in :gh:`105927`.)
|
|
|
|
.. Add deprecations above alphabetically, not here at the end.
|
|
|
|
.. include:: ../deprecations/c-api-pending-removal-in-3.14.rst
|
|
|
|
.. include:: ../deprecations/c-api-pending-removal-in-3.15.rst
|
|
|
|
.. include:: ../deprecations/c-api-pending-removal-in-future.rst
|
|
|
|
.. _pythoncapi-compat project: https://github.com/python/pythoncapi-compat/
|
|
|
|
Build Changes
|
|
=============
|
|
|
|
* ``arm64-apple-ios`` and ``arm64-apple-ios-simulator`` are both
|
|
now :pep:`11` tier 3 platforms.
|
|
(:ref:`PEP 730 <whatsnew313-platform-support>` written
|
|
and implementation contributed by Russell Keith-Magee in :gh:`114099`.)
|
|
|
|
* ``aarch64-linux-android`` and ``x86_64-linux-android`` are both
|
|
now :pep:`11` tier 3 platforms.
|
|
(:ref:`PEP 738 <whatsnew313-platform-support>` written
|
|
and implementation contributed by Malcolm Smith in :gh:`116622`.)
|
|
|
|
* ``wasm32-wasi`` is now a :pep:`11` tier 2 platform.
|
|
(Contributed by Brett Cannon in :gh:`115192`.)
|
|
|
|
* ``wasm32-emscripten`` is no longer a :pep:`11` supported platform.
|
|
(Contributed by Brett Cannon in :gh:`115192`.)
|
|
|
|
* Building CPython now requires a compiler with support for the C11 atomic
|
|
library, GCC built-in atomic functions, or MSVC interlocked intrinsics.
|
|
|
|
* Autoconf 2.71 and aclocal 1.16.5 are now required to regenerate
|
|
the :file:`configure` script.
|
|
(Contributed by Christian Heimes in :gh:`89886` and by Victor Stinner in :gh:`112090`.)
|
|
|
|
* SQLite 3.15.2 or newer is required to build
|
|
the :mod:`sqlite3` extension module.
|
|
(Contributed by Erlend Aasland in :gh:`105875`.)
|
|
|
|
* CPython now bundles the `mimalloc library`_ by default.
|
|
It is licensed under the MIT license;
|
|
see :ref:`mimalloc license <mimalloc-license>`.
|
|
The bundled mimalloc has custom changes, see :gh:`113141` for details.
|
|
(Contributed by Dino Viehland in :gh:`109914`.)
|
|
|
|
.. _mimalloc library: https://github.com/microsoft/mimalloc/
|
|
|
|
* The :file:`configure` option :option:`--with-system-libmpdec`
|
|
now defaults to ``yes``.
|
|
The bundled copy of ``libmpdecimal`` will be removed in Python 3.15.
|
|
|
|
* Python built with :file:`configure` :option:`--with-trace-refs`
|
|
(tracing references) is now ABI compatible with the Python release build
|
|
and :ref:`debug build <debug-build>`.
|
|
(Contributed by Victor Stinner in :gh:`108634`.)
|
|
|
|
* On POSIX systems, the pkg-config (``.pc``) filenames now include the ABI
|
|
flags. For example, the free-threaded build generates ``python-3.13t.pc``
|
|
and the debug build generates ``python-3.13d.pc``.
|
|
|
|
* The ``errno``, ``fcntl``, ``grp``, ``md5``, ``pwd``, ``resource``,
|
|
``termios``, ``winsound``,
|
|
``_ctypes_test``, ``_multiprocessing.posixshmem``, ``_scproxy``, ``_stat``,
|
|
``_statistics``, ``_testconsole``, ``_testimportmultiple`` and ``_uuid``
|
|
C extensions are now built with the :ref:`limited C API <limited-c-api>`.
|
|
(Contributed by Victor Stinner in :gh:`85283`.)
|
|
|
|
|
|
Porting to Python 3.13
|
|
======================
|
|
|
|
This section lists previously described changes and other bugfixes
|
|
that may require changes to your code.
|
|
|
|
Changes in the Python API
|
|
-------------------------
|
|
|
|
.. _pep667-porting-notes-py:
|
|
|
|
* :ref:`PEP 667 <whatsnew313-locals-semantics>` introduces several changes
|
|
to the semantics of :func:`locals` and :attr:`f_locals <frame.f_locals>`:
|
|
|
|
* Calling :func:`locals` in an :term:`optimized scope` now produces an
|
|
independent snapshot on each call, and hence no longer implicitly updates
|
|
previously returned references. Obtaining the legacy CPython behavior now
|
|
requires explicit calls to update the initially returned dictionary with the
|
|
results of subsequent calls to :func:`!locals`. Code execution functions that
|
|
implicitly target :func:`!locals` (such as ``exec`` and ``eval``) must be
|
|
passed an explicit namespace to access their results in an optimized scope.
|
|
(Changed as part of :pep:`667`.)
|
|
|
|
* Calling :func:`locals` from a comprehension at module or class scope
|
|
(including via ``exec`` or ``eval``) once more behaves as if the comprehension
|
|
were running as an independent nested function (i.e. the local variables from
|
|
the containing scope are not included). In Python 3.12, this had changed
|
|
to include the local variables from the containing scope when implementing
|
|
:pep:`709`. (Changed as part of :pep:`667`.)
|
|
|
|
* Accessing :attr:`FrameType.f_locals <frame.f_locals>` in an
|
|
:term:`optimized scope` now returns a write-through proxy rather than a
|
|
snapshot that gets updated at ill-specified times. If a snapshot is desired,
|
|
it must be created explicitly with ``dict`` or the proxy's ``.copy()`` method.
|
|
(Changed as part of :pep:`667`.)
|
|
|
|
* :class:`functools.partial` now emits a :exc:`FutureWarning`
|
|
when used as a method.
|
|
The behavior will change in future Python versions.
|
|
Wrap it in :func:`staticmethod` if you want to preserve the old behavior.
|
|
(Contributed by Serhiy Storchaka in :gh:`121027`.)
|
|
|
|
* An :exc:`OSError` is now raised by :func:`getpass.getuser`
|
|
for any failure to retrieve a username,
|
|
instead of :exc:`ImportError` on non-Unix platforms
|
|
or :exc:`KeyError` on Unix platforms where the password database is empty.
|
|
|
|
* The value of the :attr:`!mode` attribute of :class:`gzip.GzipFile`
|
|
is now a string (``'rb'`` or ``'wb'``) instead of an integer (``1`` or ``2``).
|
|
The value of the :attr:`!mode` attribute of the readable file-like object
|
|
returned by :meth:`zipfile.ZipFile.open` is now ``'rb'`` instead of ``'r'``.
|
|
(Contributed by Serhiy Storchaka in :gh:`115961`.)
|
|
|
|
* :class:`mailbox.Maildir` now ignores files with a leading dot (``.``).
|
|
(Contributed by Zackery Spytz in :gh:`65559`.)
|
|
|
|
* :meth:`pathlib.Path.glob` and :meth:`~pathlib.Path.rglob` now return both
|
|
files and directories if a pattern that ends with "``**``" is given,
|
|
rather than directories only.
|
|
Add a trailing slash to keep the previous behavior and only match directories.
|
|
|
|
* The :mod:`threading` module now expects the :mod:`!_thread` module
|
|
to have an :func:`!_is_main_interpreter` function.
|
|
This function takes no arguments and returns ``True``
|
|
if the current interpreter is the main interpreter.
|
|
|
|
Any library or application that provides a custom :mod:`!_thread` module
|
|
must provide :func:`!_is_main_interpreter`,
|
|
just like the module's other "private" attributes.
|
|
(:gh:`112826`.)
|
|
|
|
|
|
Changes in the C API
|
|
--------------------
|
|
|
|
* ``Python.h`` no longer includes the ``<ieeefp.h>`` standard header. It was
|
|
included for the :c:func:`!finite` function which is now provided by the
|
|
``<math.h>`` header. It should now be included explicitly if needed. Remove
|
|
also the ``HAVE_IEEEFP_H`` macro.
|
|
(Contributed by Victor Stinner in :gh:`108765`.)
|
|
|
|
* ``Python.h`` no longer includes these standard header files: ``<time.h>``,
|
|
``<sys/select.h>`` and ``<sys/time.h>``. If needed, they should now be
|
|
included explicitly. For example, ``<time.h>`` provides the :c:func:`!clock` and
|
|
:c:func:`!gmtime` functions, ``<sys/select.h>`` provides the :c:func:`!select`
|
|
function, and ``<sys/time.h>`` provides the :c:func:`!futimes`, :c:func:`!gettimeofday`
|
|
and :c:func:`!setitimer` functions.
|
|
(Contributed by Victor Stinner in :gh:`108765`.)
|
|
|
|
* On Windows, ``Python.h`` no longer includes the ``<stddef.h>`` standard
|
|
header file. If needed, it should now be included explicitly. For example, it
|
|
provides :c:func:`!offsetof` function, and ``size_t`` and ``ptrdiff_t`` types.
|
|
Including ``<stddef.h>`` explicitly was already needed by all other
|
|
platforms, the ``HAVE_STDDEF_H`` macro is only defined on Windows.
|
|
(Contributed by Victor Stinner in :gh:`108765`.)
|
|
|
|
* If the :c:macro:`Py_LIMITED_API` macro is defined, :c:macro:`!Py_BUILD_CORE`,
|
|
:c:macro:`!Py_BUILD_CORE_BUILTIN` and :c:macro:`!Py_BUILD_CORE_MODULE` macros
|
|
are now undefined by ``<Python.h>``.
|
|
(Contributed by Victor Stinner in :gh:`85283`.)
|
|
|
|
* The old trashcan macros ``Py_TRASHCAN_SAFE_BEGIN`` and ``Py_TRASHCAN_SAFE_END``
|
|
were removed. 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. The new macros were
|
|
added in Python 3.8 and the old macros were deprecated in Python 3.11.
|
|
(Contributed by Irit Katriel in :gh:`105111`.)
|
|
|
|
.. _pep667-porting-notes-c:
|
|
|
|
* :ref:`PEP 667 <whatsnew313-locals-semantics>` introduces several changes
|
|
to frame-related functions:
|
|
|
|
* The effects of mutating the dictionary returned from
|
|
:c:func:`PyEval_GetLocals` in an :term:`optimized scope` have changed.
|
|
New dict entries added this way will now *only* be visible to
|
|
subsequent :c:func:`PyEval_GetLocals` calls in that frame,
|
|
as :c:func:`PyFrame_GetLocals`, :func:`locals`,
|
|
and :attr:`FrameType.f_locals <frame.f_locals>` no longer access
|
|
the same underlying cached dictionary.
|
|
Changes made to entries for actual variable names and names added via
|
|
the write-through proxy interfaces will be overwritten on subsequent calls
|
|
to :c:func:`PyEval_GetLocals` in that frame.
|
|
The recommended code update depends on how the function was being used,
|
|
so refer to the deprecation notice on the function for details.
|
|
|
|
* Calling :c:func:`PyFrame_GetLocals` in an :term:`optimized scope`
|
|
now returns a write-through proxy rather than a snapshot
|
|
that gets updated at ill-specified times.
|
|
If a snapshot is desired, it must be created explicitly
|
|
(e.g. with :c:func:`PyDict_Copy`),
|
|
or by calling the new :c:func:`PyEval_GetFrameLocals` API.
|
|
|
|
* :c:func:`!PyFrame_FastToLocals` and :c:func:`!PyFrame_FastToLocalsWithError`
|
|
no longer have any effect.
|
|
Calling these functions has been redundant since Python 3.11,
|
|
when :c:func:`PyFrame_GetLocals` was first introduced.
|
|
|
|
* :c:func:`!PyFrame_LocalsToFast` no longer has any effect.
|
|
Calling this function is redundant now that :c:func:`PyFrame_GetLocals`
|
|
returns a write-through proxy for :term:`optimized scopes <optimized scope>`.
|
|
|
|
Regression Test Changes
|
|
=======================
|
|
|
|
* Python built with :file:`configure` :option:`--with-pydebug` now
|
|
supports a :option:`-X presite=package.module <-X>` command-line
|
|
option. If used, it specifies a module that should be imported early
|
|
in the lifecycle of the interpreter, before ``site.py`` is executed.
|
|
(Contributed by Łukasz Langa in :gh:`110769`.)
|