mirror of https://github.com/python/cpython
2661 lines
110 KiB
ReStructuredText
2661 lines
110 KiB
ReStructuredText
|
|
****************************
|
|
What's New In Python 3.13
|
|
****************************
|
|
|
|
:Editor: 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.
|
|
|
|
For full details, see the :ref:`changelog <changelog>`.
|
|
|
|
.. seealso::
|
|
|
|
:pep:`719` -- Python 3.13 Release Schedule
|
|
|
|
.. note::
|
|
|
|
Prerelease users should be aware that this document is currently in draft
|
|
form. It will be updated substantially as Python 3.13 moves towards release,
|
|
so it's worth checking back even after reading earlier versions.
|
|
|
|
|
|
Summary -- Release Highlights
|
|
=============================
|
|
|
|
.. This section singles out the most important changes in Python 3.13.
|
|
Brevity is key.
|
|
|
|
Python 3.13 beta is the pre-release of the next version of the Python
|
|
programming language, with a mix of changes to the language, the
|
|
implementation and the standard library. The biggest changes to the
|
|
implementation include a new interactive interpreter, and experimental
|
|
support for dropping the Global Interpreter Lock (:pep:`703`) and a
|
|
Just-In-Time compiler (:pep:`744`). The library changes contain removal of
|
|
deprecated APIs and modules, as well as the usual improvements in
|
|
user-friendliness and correctness.
|
|
|
|
.. 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>`.
|
|
|
|
* 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.
|
|
|
|
* :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 be improving this
|
|
over the next few releases.
|
|
|
|
* :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.
|
|
|
|
New typing features:
|
|
|
|
* :pep:`696`: Type parameters (:data:`typing.TypeVar`, :data:`typing.ParamSpec`,
|
|
and :data:`typing.TypeVarTuple`) now support defaults.
|
|
|
|
* :pep:`702`: Support for marking deprecations in the type system using the
|
|
new :func:`warnings.deprecated` decorator.
|
|
|
|
* :pep:`742`: :data:`typing.TypeIs` was added, providing more intuitive
|
|
type narrowing behavior.
|
|
|
|
* :pep:`705`: :data:`typing.ReadOnly` was added, to mark an item of a
|
|
:class:`typing.TypedDict` as read-only for type checkers.
|
|
|
|
Free-threading:
|
|
|
|
* :pep:`703`: CPython 3.13 has experimental support for running with the
|
|
:term:`global interpreter lock` disabled when built with ``--disable-gil``.
|
|
See :ref:`Free-threaded CPython <free-threaded-cpython>` for more details.
|
|
|
|
Platform support:
|
|
|
|
* :pep:`730`: Apple's iOS is now an officially supported platform. Official
|
|
Android support (:pep:`738`) is in the works as well.
|
|
|
|
Removed modules:
|
|
|
|
* :ref:`PEP 594 <whatsnew313-pep594>`: The remaining 19 "dead batteries"
|
|
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`.
|
|
|
|
* Also removed were the :mod:`!tkinter.tix` and :mod:`!lib2to3` modules, and the
|
|
``2to3`` program.
|
|
|
|
Release schedule changes:
|
|
|
|
* :pep:`602` ("Annual Release Cycle for Python") has been updated:
|
|
|
|
* 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
|
|
--------------------------------
|
|
|
|
On Unix-like systems like Linux or macOS as well as Windows, Python now
|
|
uses a new :term:`interactive` shell. When the user starts the
|
|
:term:`REPL` from an interactive terminal the interactive shell now
|
|
supports the following new features:
|
|
|
|
* Colorized prompts.
|
|
* Multiline editing with history preservation.
|
|
* 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).
|
|
* The ability to issue REPL-specific commands like :kbd:`help`, :kbd:`exit`,
|
|
and :kbd:`quit` without the need to use call parentheses after the command
|
|
name.
|
|
|
|
If the new interactive shell is not desired, it can be disabled via
|
|
the :envvar:`PYTHON_BASIC_REPL` environment variable.
|
|
|
|
The new shell requires :mod:`curses` on Unix-like systems.
|
|
|
|
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.)
|
|
|
|
.. _whatsnew313-improved-error-messages:
|
|
|
|
Improved Error Messages
|
|
-----------------------
|
|
|
|
* The interpreter now colorizes error messages when displaying tracebacks by default.
|
|
This feature 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 Pablo Galindo Salgado in :gh:`112730`.)
|
|
|
|
.. Apparently this how you hack together a formatted link:
|
|
|
|
.. |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:: shell-session
|
|
|
|
$ python random.py
|
|
Traceback (most recent call last):
|
|
File "/home/random.py", line 1, in <module>
|
|
import random; print(random.randint(5))
|
|
^^^^^^^^^^^^^
|
|
File "/home/random.py", line 1, in <module>
|
|
import random; print(random.randint(5))
|
|
^^^^^^^^^^^^^^
|
|
AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/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 it attempts to import, and this results in errors,
|
|
we also display a more helpful error message:
|
|
|
|
.. code-block:: shell-session
|
|
|
|
$ python numpy.py
|
|
Traceback (most recent call last):
|
|
File "/home/numpy.py", line 1, in <module>
|
|
import numpy as np; np.array([1,2,3])
|
|
^^^^^^^^^^^^^^^^^^
|
|
File "/home/numpy.py", line 1, in <module>
|
|
import numpy as np; np.array([1,2,3])
|
|
^^^^^^^^
|
|
AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/numpy.py' if it has the same name as a third-party module you intended to import)
|
|
|
|
(Contributed by Shantanu Jain in :gh:`95754`.)
|
|
|
|
* When an incorrect keyword argument is passed to a function, the error message
|
|
now potentially suggests the correct keyword argument.
|
|
(Contributed by Pablo Galindo Salgado and Shantanu Jain in :gh:`107944`.)
|
|
|
|
>>> "better error messages!".split(max_split=1)
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 1, in <module>
|
|
"better error messages!".split(max_split=1)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
|
|
TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
|
|
|
|
* Classes have a new :attr:`~class.__static_attributes__` attribute, populated by the compiler,
|
|
with a tuple of names of attributes of this class which are accessed
|
|
through ``self.X`` from any function in its body. (Contributed by Irit Katriel
|
|
in :gh:`115775`.)
|
|
|
|
.. _whatsnew313-locals-semantics:
|
|
|
|
Defined mutation semantics for ``locals()``
|
|
-------------------------------------------
|
|
|
|
Historically, the expected result of mutating the return value of :func:`locals`
|
|
has been left to individual Python implementations to define.
|
|
|
|
Through :pep:`667`, Python 3.13 standardises the historical behaviour 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
|
|
behaviour of code execution functions that implicitly target ``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 ``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 ``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.)
|
|
|
|
Incremental Garbage Collection
|
|
------------------------------
|
|
|
|
* The cycle garbage collector is now incremental.
|
|
This means that maximum pause times are reduced
|
|
by an order of magnitude or more for larger heaps.
|
|
|
|
Support For Mobile Platforms
|
|
----------------------------
|
|
|
|
* iOS is now a :pep:`11` supported platform. ``arm64-apple-ios``
|
|
(iPhone and iPad devices released after 2013) and
|
|
``arm64-apple-ios-simulator`` (Xcode iOS simulator running on Apple Silicon
|
|
hardware) are now tier 3 platforms.
|
|
|
|
``x86_64-apple-ios-simulator`` (Xcode iOS simulator running on older x86_64
|
|
hardware) is not a tier 3 supported platform, but will be supported on a
|
|
best-effort basis.
|
|
|
|
See :pep:`730`: for more details.
|
|
|
|
(PEP written and implementation contributed by Russell Keith-Magee in
|
|
:gh:`114099`.)
|
|
|
|
.. _whatsnew313-jit-compiler:
|
|
|
|
Experimental JIT Compiler
|
|
=========================
|
|
|
|
When CPython is configured using the ``--enable-experimental-jit`` option,
|
|
a just-in-time compiler is added which may speed up some Python programs.
|
|
|
|
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 *Tier 2 IR*, a.k.a. micro-ops ("uops").
|
|
|
|
* The Tier 2 IR uses the same stack-based VM 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.
|
|
|
|
The ``--enable-experimental-jit`` flag has the following optional values:
|
|
|
|
* ``no`` (default) -- Disable the entire Tier 2 and JIT pipeline.
|
|
|
|
* ``yes`` (default if the flag is present without optional value)
|
|
-- 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``.
|
|
|
|
(On Windows, use ``PCbuild/build.bat --experimental-jit`` to enable the JIT
|
|
or ``--experimental-jit-interpreter`` to enable the Tier 2 interpreter.)
|
|
|
|
See :pep:`744` for more details.
|
|
|
|
(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.)
|
|
|
|
.. _free-threaded-cpython:
|
|
|
|
Free-threaded CPython
|
|
=====================
|
|
|
|
CPython will run with the :term:`global interpreter lock` (GIL) disabled when
|
|
configured using the ``--disable-gil`` option at build time. This is an
|
|
experimental feature and therefore isn't used by default. Users need to
|
|
either compile their own interpreter, or install one of the experimental
|
|
builds that are marked as *free-threaded*. See :pep:`703` "Making the Global
|
|
Interpreter Lock Optional in CPython" for more detail.
|
|
|
|
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 multicore hardware.
|
|
|
|
Work is still ongoing: expect some bugs and a substantial single-threaded
|
|
performance hit.
|
|
|
|
The free-threaded build still supports optionally running with the GIL
|
|
enabled at runtime using the environment variable :envvar:`PYTHON_GIL` or
|
|
the command line option :option:`-X gil`.
|
|
|
|
To check if the current interpreter is configured with ``--disable-gil``,
|
|
use ``sysconfig.get_config_var("Py_GIL_DISABLED")``. To check if the :term:`GIL`
|
|
is actually disabled in the running process, the :func:`!sys._is_gil_enabled`
|
|
function can be used.
|
|
|
|
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.1b1 or newer is required to install packages with C extensions in the
|
|
free-threaded build.
|
|
|
|
Other Language Changes
|
|
======================
|
|
|
|
* Allow the *count* argument of :meth:`str.replace` to be a keyword.
|
|
(Contributed by Hugo van Kemenade in :gh:`106487`.)
|
|
|
|
* Compiler now strip indents from docstrings.
|
|
This will reduce the size of :term:`bytecode cache <bytecode>` (e.g. ``.pyc`` file).
|
|
For example, cache file size for ``sqlalchemy.orm.session`` in SQLAlchemy 2.0
|
|
is reduced by about 5%.
|
|
This change will affect tools using docstrings, like :mod:`doctest`.
|
|
(Contributed by Inada Naoki in :gh:`81283`.)
|
|
|
|
* The :func:`compile` built-in can now accept 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`).
|
|
|
|
* :mod:`multiprocessing`, :mod:`concurrent.futures`, :mod:`compileall`:
|
|
Replace :func:`os.cpu_count` with :func:`os.process_cpu_count` to select the
|
|
default number of worker threads and processes. Get the CPU affinity
|
|
if supported.
|
|
(Contributed by Victor Stinner in :gh:`109649`.)
|
|
|
|
* :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`.)
|
|
|
|
* Fixed a bug where a :keyword:`global` declaration in an :keyword:`except` block
|
|
is rejected when the global is used in the :keyword:`else` block.
|
|
(Contributed by Irit Katriel in :gh:`111123`.)
|
|
|
|
* 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 a new environment variable :envvar:`PYTHON_FROZEN_MODULES`. It
|
|
determines whether or not frozen modules are ignored by the import machinery,
|
|
equivalent of 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 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 new :envvar:`PYTHON_HISTORY` environment variable can be used to change
|
|
the location of a ``.python_history`` file.
|
|
(Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade in
|
|
:gh:`73965`.)
|
|
|
|
* Add :exc:`PythonFinalizationError` exception. This exception derived from
|
|
:exc:`RuntimeError` is raised when an operation is blocked during
|
|
the :term:`Python finalization <interpreter shutdown>`.
|
|
|
|
The following functions now raise PythonFinalizationError, instead of
|
|
:exc:`RuntimeError`:
|
|
|
|
* :func:`_thread.start_new_thread`.
|
|
* :class:`subprocess.Popen`.
|
|
* :func:`os.fork`.
|
|
* :func:`os.forkpty`.
|
|
|
|
(Contributed by Victor Stinner in :gh:`114570`.)
|
|
|
|
* Added :attr:`!name` and :attr:`!mode` attributes for compressed
|
|
and archived file-like objects in modules :mod:`bz2`, :mod:`lzma`,
|
|
:mod:`tarfile` and :mod:`zipfile`.
|
|
(Contributed by Serhiy Storchaka in :gh:`115961`.)
|
|
|
|
* 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`.)
|
|
|
|
* 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 otherwise would
|
|
accept. While disabling this is not recommended, you can do so using::
|
|
|
|
ctx = ssl.create_default_context()
|
|
ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
|
|
|
|
(Contributed by William Woodruff in :gh:`112389`.)
|
|
|
|
* The :class:`configparser.ConfigParser` now accepts unnamed sections before named
|
|
ones if configured to do so.
|
|
(Contributed by Pedro Sousa Lacerda in :gh:`66449`.)
|
|
|
|
* :ref:`annotation scope <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. (Contributed by
|
|
Jelle Zijlstra in :gh:`109118` and :gh:`118160`.)
|
|
|
|
* Classes have a new :attr:`!__firstlineno__` attribute,
|
|
populated by the compiler, with the line number of the first line
|
|
of the class definition.
|
|
(Contributed by Serhiy Storchaka in :gh:`118465`.)
|
|
|
|
* ``from __future__ import ...`` statements are now just normal
|
|
relative imports if dots are present before the module name.
|
|
(Contributed by Jeremiah Gabriel Pascual in :gh:`118216`.)
|
|
|
|
|
|
New Modules
|
|
===========
|
|
|
|
* None.
|
|
|
|
|
|
Improved Modules
|
|
================
|
|
|
|
argparse
|
|
--------
|
|
|
|
* Add parameter *deprecated* in methods
|
|
:meth:`~argparse.ArgumentParser.add_argument` and :meth:`!add_parser`
|
|
which allows to deprecate command-line options, positional arguments and
|
|
subcommands.
|
|
(Contributed by Serhiy Storchaka in :gh:`83648`.)
|
|
|
|
array
|
|
-----
|
|
|
|
* Add ``'w'`` type code (``Py_UCS4``) that can be used for Unicode strings.
|
|
It can be used instead of ``'u'`` type code, which is deprecated.
|
|
(Contributed by Inada Naoki in :gh:`80480`.)
|
|
|
|
* Add ``clear()`` method in order to implement ``MutableSequence``.
|
|
(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, and have more intuitive behaviour 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 a :class:`!ast.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.)
|
|
|
|
If other arguments are omitted, a :exc:`DeprecationWarning` is emitted.
|
|
This will cause an exception in Python 3.15. Similarly, passing a keyword
|
|
argument 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 setting the attribute
|
|
:attr:`ast.AST._field_types`.
|
|
|
|
(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 the :func:`compile` built-in. This makes it
|
|
possible to obtain an optimized AST.
|
|
(Contributed by Irit Katriel in :gh:`108113`.)
|
|
|
|
asyncio
|
|
-------
|
|
|
|
* :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:`asyncio.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:`asyncio.Server.close_clients` and
|
|
:meth:`asyncio.Server.abort_clients` methods which allow to more
|
|
forcefully close an asyncio server.
|
|
(Contributed by Pierre Ossman in :gh:`113538`.)
|
|
|
|
* :func:`asyncio.as_completed` now returns an object that is both an
|
|
:term:`asynchronous iterator` and a plain :term:`iterator` of awaitables.
|
|
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`.)
|
|
|
|
* When :func:`asyncio.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`.)
|
|
|
|
* Improved 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`.)
|
|
|
|
* Add :meth:`asyncio.Queue.shutdown` (along with
|
|
:exc:`asyncio.QueueShutDown`) for queue termination.
|
|
(Contributed by Laurie Opperman and Yves Duprat in :gh:`104228`.)
|
|
|
|
* Accept a tuple of separators in :meth:`asyncio.StreamReader.readuntil`,
|
|
stopping when one of them is encountered.
|
|
(Contributed by Bruce Merry in :gh:`81322`.)
|
|
|
|
base64
|
|
------
|
|
|
|
* Add :func:`base64.z85encode` and :func:`base64.z85decode` functions which allow encoding
|
|
and decoding Z85 data.
|
|
See `Z85 specification <https://rfc.zeromq.org/spec/32/>`_ for more information.
|
|
(Contributed by Matan Perelman in :gh:`75299`.)
|
|
|
|
copy
|
|
----
|
|
|
|
* Add :func:`copy.replace` function which allows to create a modified copy of
|
|
an object, which is especially useful for immutable objects.
|
|
It supports named tuples created with the factory function
|
|
:func:`collections.namedtuple`, :class:`~dataclasses.dataclass` instances,
|
|
various :mod:`datetime` objects, :class:`~inspect.Signature` objects,
|
|
:class:`~inspect.Parameter` objects, :ref:`code object <code-objects>`, and
|
|
any user classes which define the :meth:`!__replace__` method.
|
|
(Contributed by Serhiy Storchaka in :gh:`108751`.)
|
|
|
|
ctypes
|
|
------
|
|
|
|
* The layout of :ref:`bit fields <ctypes-bit-fields-in-structures-unions>` in
|
|
:class:`~ctypes.Structure` and :class:`~ctypes.Union` was improved to better
|
|
match platform defaults (GCC/Clang or MSC). In particular, fields no longer
|
|
overlap.
|
|
(Contributed by Matthias Görgens in :gh:`97702`.)
|
|
* A :attr:`ctypes.Structure._layout_` class attribute can be set
|
|
to help match a non-default ABI.
|
|
(Contributed by Petr Viktorin in :gh:`97702`.)
|
|
|
|
dbm
|
|
---
|
|
|
|
* Add :meth:`dbm.gnu.gdbm.clear` and :meth:`dbm.ndbm.ndbm.clear` methods that remove all items
|
|
from the database.
|
|
(Contributed by Donghee Na in :gh:`107122`.)
|
|
|
|
* Add new :mod:`dbm.sqlite3` backend, and make it the default :mod:`!dbm` backend.
|
|
(Contributed by Raymond Hettinger and Erlend E. Aasland in :gh:`100414`.)
|
|
|
|
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 ``-O`` command line option or
|
|
the ``show_offsets`` parameter.
|
|
(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
|
|
-------
|
|
|
|
* Color is added to the output 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:`doctest.DocTestRunner.run` method now counts the number of skipped
|
|
tests. Add :attr:`doctest.DocTestRunner.skips` and
|
|
:attr:`doctest.TestResults.skipped` attributes.
|
|
(Contributed by Victor Stinner in :gh:`108794`.)
|
|
|
|
email
|
|
-----
|
|
|
|
* :func:`email.utils.getaddresses` and :func:`email.utils.parseaddr` now return
|
|
``('', '')`` 2-tuples in more situations where invalid email addresses are
|
|
encountered instead of potentially inaccurate values. Add optional *strict*
|
|
parameter to these two functions: use ``strict=False`` to get the old
|
|
behavior, accept malformed inputs.
|
|
``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
|
|
---------
|
|
|
|
* Formatting for objects of type :class:`fractions.Fraction` now supports
|
|
the standard format specification mini-language rules for fill, alignment,
|
|
sign handling, minimum width and grouping. (Contributed by Mark Dickinson
|
|
in :gh:`111320`.)
|
|
|
|
gc
|
|
--
|
|
|
|
* The cyclic garbage collector is now incremental, which changes the meanings
|
|
of the results of :meth:`gc.get_threshold` and :meth:`gc.set_threshold` as
|
|
well as :meth:`gc.get_count` and :meth:`gc.get_stats`.
|
|
|
|
* :meth:`gc.get_threshold` returns a three-item tuple for backwards compatibility.
|
|
The first value is the threshold for young collections, as before; the second
|
|
value determines the rate at which the old collection is scanned (the
|
|
default is 10, and higher values mean that the old collection is scanned more slowly).
|
|
The third value is meaningless and is always zero.
|
|
* :meth:`gc.set_threshold` ignores any items after the second.
|
|
* :meth:`gc.get_count` and :meth:`gc.get_stats`
|
|
return the same format of results as before.
|
|
The only difference is that instead of the results referring to
|
|
the young, aging and old generations, the results refer to the
|
|
young generation and the aging and collecting spaces of the old generation.
|
|
|
|
In summary, code that attempted to manipulate the behavior of the cycle GC may
|
|
not work exactly as intended, but it is very unlikely to be harmful.
|
|
All other code will work just fine.
|
|
|
|
glob
|
|
----
|
|
|
|
* Add :func:`glob.translate` function that converts a path specification with
|
|
shell-style wildcards to a regular expression.
|
|
(Contributed by Barney Gale in :gh:`72904`.)
|
|
|
|
importlib
|
|
---------
|
|
|
|
* Previously deprecated :mod:`importlib.resources` functions are un-deprecated:
|
|
|
|
* :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()`
|
|
|
|
All now allow for a directory (or tree) of resources, using multiple positional
|
|
arguments.
|
|
|
|
For text-reading functions, the *encoding* and *errors* must now be given as
|
|
keyword arguments.
|
|
|
|
The :func:`~importlib.resources.contents()` remains deprecated in favor of
|
|
the full-featured :class:`~importlib.resources.abc.Traversable` API.
|
|
However, there is now no plan to remove it.
|
|
|
|
(Contributed by Petr Viktorin in :gh:`106532`.)
|
|
|
|
io
|
|
--
|
|
|
|
* The :class:`io.IOBase` finalizer now logs the ``close()`` method errors with
|
|
:data:`sys.unraisablehook`. Previously, errors were ignored silently by default,
|
|
and only logged in :ref:`Python Development Mode <devmode>` or on :ref:`Python
|
|
built on debug mode <debug-build>`.
|
|
(Contributed by Victor Stinner in :gh:`62948`.)
|
|
|
|
ipaddress
|
|
---------
|
|
|
|
* Add the :attr:`ipaddress.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`.
|
|
|
|
itertools
|
|
---------
|
|
|
|
* Added a ``strict`` option to :func:`itertools.batched`.
|
|
This 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
|
|
----
|
|
|
|
* A new function :func:`~math.fma` for fused multiply-add operations has been
|
|
added. This function 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 which works with file path.
|
|
Passing file path instead of URL in :func:`~mimetypes.guess_type` is :term:`soft deprecated`.
|
|
(Contributed by Serhiy Storchaka in :gh:`66543`.)
|
|
|
|
mmap
|
|
----
|
|
|
|
* The :class:`mmap.mmap` class now has an :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`.)
|
|
* :class:`mmap.mmap` now has a *trackfd* parameter on Unix; if it is ``False``,
|
|
the file descriptor specified by *fileno* will not be duplicated.
|
|
(Contributed by Zackery Spytz and Petr Viktorin in :gh:`78502`.)
|
|
* :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`.)
|
|
|
|
opcode
|
|
------
|
|
|
|
* Move ``opcode.ENABLE_SPECIALIZATION`` to ``_opcode.ENABLE_SPECIALIZATION``.
|
|
This field was added in 3.12, it was never documented and is not intended for
|
|
external usage. (Contributed by Irit Katriel in :gh:`105481`.)
|
|
|
|
* Removed ``opcode.is_pseudo``, ``opcode.MIN_PSEUDO_OPCODE`` and
|
|
``opcode.MAX_PSEUDO_OPCODE``, which were added in 3.12, were never
|
|
documented or exposed through ``dis``, and were not intended to be
|
|
used externally.
|
|
|
|
os
|
|
--
|
|
|
|
* Add :func:`os.process_cpu_count` function to get the number of logical CPUs
|
|
usable by the calling thread of the current process.
|
|
(Contributed by Victor Stinner in :gh:`109649`.)
|
|
|
|
* Add a low level interface for Linux's timer notification file descriptors
|
|
via :func:`os.timerfd_create`,
|
|
:func:`os.timerfd_settime`, :func:`os.timerfd_settime_ns`,
|
|
:func:`os.timerfd_gettime`, and :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.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 the container (application code).
|
|
(Contributed by Donghee Na in :gh:`109595`.)
|
|
|
|
* Add support of :func:`os.lchmod` and the *follow_symlinks* argument
|
|
in :func:`os.chmod` on Windows.
|
|
Note that the default value of *follow_symlinks* in :func:`!os.lchmod` is
|
|
``False`` on Windows.
|
|
(Contributed by Serhiy Storchaka in :gh:`59616`.)
|
|
|
|
* Add support of :func:`os.fchmod` and a file descriptor
|
|
in :func:`os.chmod` on Windows.
|
|
(Contributed by Serhiy Storchaka in :gh:`113191`.)
|
|
|
|
* :func:`os.posix_spawn` now accepts ``env=None``, which makes the newly spawned
|
|
process use the current process environment.
|
|
(Contributed by Jakub Kulik in :gh:`113119`.)
|
|
|
|
* :func:`os.posix_spawn` gains an :attr:`os.POSIX_SPAWN_CLOSEFROM` attribute for
|
|
use in ``file_actions=`` on platforms that support
|
|
:c:func:`!posix_spawn_file_actions_addclosefrom_np`.
|
|
(Contributed by Jakub Kulik in :gh:`113117`.)
|
|
|
|
* :func:`os.mkdir` and :func:`os.makedirs` on Windows 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`.)
|
|
|
|
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 (back)slash to be absolute.
|
|
(Contributed by Barney Gale and Jon Foster in :gh:`44626`.)
|
|
|
|
* Add support of *dir_fd* and *follow_symlinks* keyword arguments in
|
|
:func:`shutil.chown`.
|
|
(Contributed by Berker Peksag and Tahia K in :gh:`62308`)
|
|
|
|
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 :meth:`pathlib.Path.from_uri`, a new constructor to create a :class:`pathlib.Path`
|
|
object from a 'file' URI (``file://``).
|
|
(Contributed by Barney Gale in :gh:`107465`.)
|
|
|
|
* Add :meth:`pathlib.PurePath.full_match` for matching paths with
|
|
shell-style wildcards, including the recursive wildcard "``**``".
|
|
(Contributed by Barney Gale in :gh:`73435`.)
|
|
|
|
* Add :attr:`pathlib.PurePath.parser` class attribute that stores the
|
|
implementation of :mod:`os.path` used for low-level path parsing and
|
|
joining: either ``posixpath`` or ``ntpath``.
|
|
|
|
* Add *recurse_symlinks* keyword-only argument to :meth:`pathlib.Path.glob`
|
|
and :meth:`~pathlib.Path.rglob`.
|
|
(Contributed by Barney Gale in :gh:`77609`.)
|
|
|
|
* Add *follow_symlinks* keyword-only argument to :meth:`~pathlib.Path.is_file`,
|
|
:meth:`~pathlib.Path.is_dir`, :meth:`~pathlib.Path.owner`,
|
|
:meth:`~pathlib.Path.group`.
|
|
(Contributed by Barney Gale in :gh:`105793`, and Kamil Turek in
|
|
:gh:`107962`.)
|
|
|
|
* Return files and directories from :meth:`pathlib.Path.glob` and
|
|
:meth:`~pathlib.Path.rglob` when given a pattern that ends with "``**``". In
|
|
earlier versions, only directories were returned.
|
|
(Contributed by Barney Gale in :gh:`70303`.)
|
|
|
|
pdb
|
|
---
|
|
|
|
* Add ability to move between chained exceptions during post mortem debugging in :func:`~pdb.pm` using
|
|
the new ``exceptions [exc_number]`` command for Pdb. (Contributed by Matthias
|
|
Bussonnier in :gh:`106676`.)
|
|
|
|
* Expressions/statements whose prefix is a pdb command are now correctly
|
|
identified and executed.
|
|
(Contributed by Tian Gao in :gh:`108464`.)
|
|
|
|
* ``sys.path[0]`` will no longer be replaced by the directory of the script
|
|
being debugged when ``sys.flags.safe_path`` is set (via the :option:`-P`
|
|
command line option or :envvar:`PYTHONSAFEPATH` environment variable).
|
|
(Contributed by Tian Gao and Christian Walther in :gh:`111762`.)
|
|
|
|
* :mod:`zipapp` is supported as a debugging target.
|
|
(Contributed by Tian Gao in :gh:`118501`.)
|
|
|
|
* ``breakpoint()`` and ``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 ``breakpoint()`` is positioned
|
|
at the end of the context.
|
|
(Contributed by Tian Gao in :gh:`118579`.)
|
|
|
|
queue
|
|
-----
|
|
|
|
* Add :meth:`queue.Queue.shutdown` (along with :exc:`queue.ShutDown`) for 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.
|
|
|
|
site
|
|
----
|
|
|
|
* :file:`.pth` files are now decoded by UTF-8 first, and then by the
|
|
:term:`locale encoding` if the 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 *filter* keyword-only parameter to :meth:`sqlite3.Connection.iterdump`
|
|
for filtering database objects to dump.
|
|
(Contributed by Mariusz Felisiak in :gh:`91602`.)
|
|
|
|
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. Also added :func:`statistics.kde_random`
|
|
for sampling from the estimated probability density function.
|
|
(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 in the default case of ``close_fds=True`` on more
|
|
recent versions of platforms including Linux, FreeBSD, and Solaris where the
|
|
C library provides :c:func:`!posix_spawn_file_actions_addclosefrom_np`.
|
|
On Linux this should perform similar to our 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` not to ever use
|
|
:func:`os.posix_spawn`. Please report your reason and platform details in
|
|
the CPython issue 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 the 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 to have a resolution better than 1 us,
|
|
instead of the ``GetTickCount64()`` clock which has a resolution of 15.6 ms.
|
|
(Contributed by Victor Stinner in :gh:`88494`.)
|
|
|
|
* On Windows, :func:`time.time()` now uses the
|
|
``GetSystemTimePreciseAsFileTime()`` clock to have a resolution better
|
|
than 1 μs, instead of the ``GetSystemTimeAsFileTime()`` clock which has a
|
|
resolution of 15.6 ms.
|
|
(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,
|
|
e.g. ``w.wm_attributes('alpha')`` and allows to specify attributes and
|
|
values to set as keyword arguments, e.g. ``w.wm_attributes(alpha=0.5)``.
|
|
Add new optional keyword-only parameter *return_python_dict*: calling
|
|
``w.wm_attributes(return_python_dict=True)`` returns the attributes as
|
|
a dict instead of a tuple.
|
|
(Contributed by Serhiy Storchaka in :gh:`43457`.)
|
|
|
|
* Add new optional keyword-only parameter *return_ints* in
|
|
the :meth:`!Text.count` method.
|
|
Passing ``return_ints=True`` makes it always returning the single count
|
|
as an integer instead of a 1-tuple or ``None``.
|
|
(Contributed by Serhiy Storchaka in :gh:`97928`.)
|
|
|
|
* Add support of 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 the :class:`!PhotoImage` method :meth:`!copy_replace` to copy a region
|
|
from one image to other image, possibly with pixel zooming and/or
|
|
subsampling.
|
|
Add *from_coords* parameter to :class:`!PhotoImage` methods :meth:`!copy()`,
|
|
:meth:`!zoom()` and :meth:`!subsample()`.
|
|
Add *zoom* and *subsample* parameters to :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 :class:`!PhotoImage` method
|
|
:meth:`!write`.
|
|
(Contributed by Serhiy Storchaka in :gh:`118271`.)
|
|
|
|
traceback
|
|
---------
|
|
|
|
* Add *show_group* parameter to :func:`traceback.TracebackException.format_exception_only`
|
|
to format the nested exceptions of a :exc:`BaseExceptionGroup` instance, recursively.
|
|
(Contributed by Irit Katriel in :gh:`105292`.)
|
|
|
|
* Add the field *exc_type_str* to :class:`~traceback.TracebackException`, which
|
|
holds a string display of the *exc_type*. Deprecate the field *exc_type*
|
|
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`.)
|
|
|
|
types
|
|
-----
|
|
|
|
* :class:`~types.SimpleNamespace` constructor now allows specifying initial
|
|
values of attributes as a positional argument which must be a mapping or
|
|
an iterable of key-value pairs.
|
|
(Contributed by Serhiy Storchaka in :gh:`108191`.)
|
|
|
|
typing
|
|
------
|
|
|
|
* Add :func:`typing.get_protocol_members` to return the set of members
|
|
defining a :class:`typing.Protocol`. Add :func:`typing.is_protocol` to
|
|
check whether a class is a :class:`typing.Protocol`. (Contributed by Jelle Zijlstra in
|
|
:gh:`104873`.)
|
|
|
|
* Add :data:`typing.ReadOnly`, a special typing construct to mark
|
|
an item of a :class:`typing.TypedDict` as read-only for type checkers.
|
|
See :pep:`705` for more details.
|
|
|
|
* 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`.)
|
|
|
|
unicodedata
|
|
-----------
|
|
|
|
* The Unicode database has been updated to version 15.1.0. (Contributed by
|
|
James Gerity in :gh:`109559`.)
|
|
|
|
venv
|
|
----
|
|
|
|
* Add support for adding source control management (SCM) ignore files to 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 ``--without-scm-ignore-files``). (Contributed by Brett Cannon in
|
|
:gh:`108125`.)
|
|
|
|
warnings
|
|
--------
|
|
|
|
* The new :func:`warnings.deprecated` decorator provides a way to communicate
|
|
deprecations to :term:`static type checkers <static type checker>` and
|
|
to warn on usage of deprecated classes and functions. A runtime deprecation
|
|
warning may also be emitted when a decorated function or class is used at runtime.
|
|
See :pep:`702`. (Contributed by Jelle Zijlstra in :gh:`104003`.)
|
|
|
|
xml.etree.ElementTree
|
|
---------------------
|
|
|
|
* Add the :meth:`!close` method for the iterator returned by
|
|
:func:`~xml.etree.ElementTree.iterparse` for explicit cleaning up.
|
|
(Contributed by Serhiy Storchaka in :gh:`69893`.)
|
|
|
|
zipimport
|
|
---------
|
|
|
|
* Gains support for ZIP64 format files. Everybody loves huge code right?
|
|
(Contributed by Tim Hatch in :gh:`94146`.)
|
|
|
|
.. Add improved modules above alphabetically, not here at the end.
|
|
|
|
Optimizations
|
|
=============
|
|
|
|
* :func:`textwrap.indent` is now ~30% faster than before for large input.
|
|
(Contributed by Inada Naoki in :gh:`107369`.)
|
|
|
|
* The :mod:`subprocess` module uses :func:`os.posix_spawn` in more situations
|
|
including the default where ``close_fds=True`` on many modern platforms. This
|
|
should provide a noteworthy performance increase launching processes on
|
|
FreeBSD and Solaris. See the :ref:`subprocess <whatsnew313-subprocess>`
|
|
section above for details.
|
|
(Contributed by Jakub Kulik in :gh:`113117`.)
|
|
|
|
* 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:`importlib.metadata`, :mod:`threading`, :mod:`enum`, :mod:`functools`
|
|
and :mod:`email.utils`.
|
|
(Contributed by Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas and
|
|
others in :gh:`109653`.)
|
|
|
|
Removed Modules And APIs
|
|
========================
|
|
|
|
.. _whatsnew313-pep594:
|
|
|
|
PEP 594: dead batteries (and other module removals)
|
|
---------------------------------------------------
|
|
|
|
* :pep:`594` removed 19 modules from the standard library,
|
|
deprecated in Python 3.11:
|
|
|
|
* :mod:`!aifc`.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!audioop`.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!chunk`.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!cgi` and :mod:`!cgitb`.
|
|
|
|
* ``cgi.FieldStorage`` can typically be replaced with
|
|
:func:`urllib.parse.parse_qsl` for ``GET`` and ``HEAD`` requests,
|
|
and the :mod:`email.message` module or :pypi:`multipart`
|
|
PyPI project for ``POST`` and ``PUT``.
|
|
|
|
* ``cgi.parse()`` can be replaced by calling :func:`urllib.parse.parse_qs`
|
|
directly on the desired query string, except for ``multipart/form-data``
|
|
input, which can be handled as described for ``cgi.parse_multipart()``.
|
|
|
|
* ``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`::
|
|
|
|
from email.message import EmailMessage
|
|
msg = EmailMessage()
|
|
msg['content-type'] = 'application/json; charset="utf8"'
|
|
main, params = msg.get_content_type(), msg['content-type'].params
|
|
|
|
* ``cgi.parse_multipart()`` can be replaced with the functionality in the
|
|
:mod:`email` package (e.g. :class:`email.message.EmailMessage` and
|
|
:class:`email.message.Message`) which implements the same MIME RFCs, or
|
|
with the :pypi:`multipart` PyPI project.
|
|
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!crypt` module and its private :mod:`!_crypt` extension.
|
|
The :mod:`hashlib` module is a potential replacement for certain use cases.
|
|
Otherwise, the following PyPI projects can be used:
|
|
|
|
* :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.
|
|
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!imghdr`: use the projects :pypi:`filetype`,
|
|
:pypi:`puremagic`, or :pypi:`python-magic` instead.
|
|
The ``puremagic.what()`` function can be used to replace
|
|
the ``imghdr.what()`` function for all file formats that
|
|
were supported by ``imghdr``.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!mailcap`.
|
|
The :mod:`mimetypes` module provides an alternative.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!msilib`.
|
|
(Contributed by Zachary Ware in :gh:`104773`.)
|
|
|
|
* :mod:`!nis`.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!nntplib`:
|
|
the :pypi:`nntplib` PyPI project can be used instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!ossaudiodev`: use the
|
|
`pygame project <https://www.pygame.org/>`_ for audio playback.
|
|
(Contributed by Victor Stinner in :gh:`104780`.)
|
|
|
|
* :mod:`!pipes`: use the :mod:`subprocess` module instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!sndhdr`: use the projects :pypi:`filetype`,
|
|
:pypi:`puremagic`, or :pypi:`python-magic` instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!spwd`:
|
|
the :pypi:`python-pam` project can be used instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!sunau`.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!telnetlib`, use the projects :pypi:`telnetlib3` or
|
|
:pypi:`Exscript` instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!uu`: the :mod:`base64` module is a modern alternative.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :mod:`!xdrlib`.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* Remove the ``2to3`` program and the :mod:`!lib2to3` module,
|
|
deprecated in Python 3.11.
|
|
(Contributed by Victor Stinner in :gh:`104780`.)
|
|
|
|
* 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`.)
|
|
|
|
configparser
|
|
------------
|
|
|
|
* Remove the undocumented :class:`!configparser.LegacyInterpolation` class,
|
|
deprecated in the docstring since Python 3.2,
|
|
and with a deprecation warning since Python 3.11.
|
|
(Contributed by Hugo van Kemenade in :gh:`104886`.)
|
|
|
|
importlib
|
|
---------
|
|
|
|
* Remove deprecated :meth:`~object.__getitem__` access for
|
|
:class:`!importlib.metadata.EntryPoint` objects.
|
|
(Contributed by Jason R. Coombs in :gh:`113175`.)
|
|
|
|
locale
|
|
------
|
|
|
|
* Remove ``locale.resetlocale()`` function deprecated in Python 3.11:
|
|
use ``locale.setlocale(locale.LC_ALL, "")`` instead.
|
|
(Contributed by Victor Stinner in :gh:`104783`.)
|
|
|
|
logging
|
|
-------
|
|
|
|
* :mod:`logging`: Remove undocumented and untested ``Logger.warn()`` and
|
|
``LoggerAdapter.warn()`` methods and ``logging.warn()`` function. Deprecated
|
|
since Python 3.3, they were aliases to the :meth:`logging.Logger.warning`
|
|
method, :meth:`!logging.LoggerAdapter.warning` method and
|
|
:func:`logging.warning` function.
|
|
(Contributed by Victor Stinner in :gh:`105376`.)
|
|
|
|
pathlib
|
|
-------
|
|
|
|
* Remove support for using :class:`pathlib.Path` objects as context managers.
|
|
This functionality was deprecated and made a no-op in Python 3.9.
|
|
|
|
re
|
|
--
|
|
|
|
* Remove undocumented, never working, and deprecated ``re.template`` function
|
|
and ``re.TEMPLATE`` flag (and ``re.T`` alias).
|
|
(Contributed by Serhiy Storchaka and Nikita Sobolev in :gh:`105687`.)
|
|
|
|
|
|
turtle
|
|
------
|
|
|
|
* Remove the :meth:`!turtle.RawTurtle.settiltangle` method,
|
|
deprecated in docs since Python 3.1
|
|
and with a deprecation warning since Python 3.11.
|
|
(Contributed by Hugo van Kemenade in :gh:`104876`.)
|
|
|
|
typing
|
|
------
|
|
|
|
* Namespaces ``typing.io`` and ``typing.re``, deprecated in Python 3.8,
|
|
are now removed. The items in those namespaces can be imported directly
|
|
from :mod:`typing`. (Contributed by Sebastian Rittau in :gh:`92871`.)
|
|
|
|
* Remove support for 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:`!unittest.TestProgram.usageExit`
|
|
method, deprecated in Python 3.11.
|
|
(Contributed by Hugo van Kemenade in :gh:`104992`.)
|
|
|
|
urllib
|
|
------
|
|
|
|
* Remove *cafile*, *capath* and *cadefault* parameters of the
|
|
:func:`urllib.request.urlopen` function, deprecated in Python 3.6: pass
|
|
the *context* parameter instead. Use
|
|
:meth:`ssl.SSLContext.load_cert_chain` to load specific certificates, or
|
|
let :func:`ssl.create_default_context` select the system's trusted CA
|
|
certificates for you.
|
|
(Contributed by Victor Stinner in :gh:`105382`.)
|
|
|
|
webbrowser
|
|
----------
|
|
|
|
* Remove the untested and undocumented :mod:`webbrowser` :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 deprecated ``webbrowser.MacOSXOSAScript._name`` attribute.
|
|
Use :attr:`webbrowser.MacOSXOSAScript.name <webbrowser.controller.name>`
|
|
attribute instead.
|
|
(Contributed by Nikita Sobolev in :gh:`105546`.)
|
|
|
|
New Deprecations
|
|
================
|
|
|
|
* Removed chained :class:`classmethod` descriptors (introduced in
|
|
:gh:`63272`). This can no longer be used to wrap other descriptors
|
|
such as :class:`property`. The core design of this feature was flawed
|
|
and caused a number of downstream 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`.)
|
|
|
|
* :mod:`array`: :mod:`array`'s ``'u'`` format code, deprecated in docs since Python 3.3,
|
|
emits :exc:`DeprecationWarning` since 3.13
|
|
and will be removed in Python 3.16.
|
|
Use the ``'w'`` format code instead.
|
|
(Contributed by Hugo van Kemenade in :gh:`80480`.)
|
|
|
|
* :mod:`ctypes`: Deprecate undocumented :func:`!ctypes.SetPointerType`
|
|
and :func:`!ctypes.ARRAY` functions.
|
|
Replace ``ctypes.ARRAY(item_type, size)`` with ``item_type * size``.
|
|
(Contributed by Victor Stinner in :gh:`105733`.)
|
|
|
|
* :mod:`decimal`: Deprecate non-standard format specifier "N" for
|
|
:class:`decimal.Decimal`.
|
|
It was not documented and only supported in the C implementation.
|
|
(Contributed by Serhiy Storchaka in :gh:`89902`.)
|
|
|
|
* :mod:`dis`: The ``dis.HAVE_ARGUMENT`` separator is deprecated. Check
|
|
membership in :data:`~dis.hasarg` instead.
|
|
(Contributed by Irit Katriel in :gh:`109319`.)
|
|
|
|
* :ref:`frame-objects`:
|
|
Calling :meth:`frame.clear` on a suspended frame raises :exc:`RuntimeError`
|
|
(as has always been the case for an executing frame).
|
|
(Contributed by Irit Katriel in :gh:`79932`.)
|
|
|
|
* :mod:`getopt` and :mod:`optparse` modules: They are now
|
|
:term:`soft deprecated`: the :mod:`argparse` module should be used for new projects.
|
|
Previously, the :mod:`optparse` module was already deprecated, its removal
|
|
was not scheduled, and no warnings was emitted: so there is no change in
|
|
practice.
|
|
(Contributed by Victor Stinner in :gh:`106535`.)
|
|
|
|
* :mod:`gettext`: Emit deprecation warning for non-integer numbers in
|
|
:mod:`gettext` functions and methods that consider plural forms even if the
|
|
translation was not found.
|
|
(Contributed by Serhiy Storchaka in :gh:`88434`.)
|
|
|
|
* :mod:`glob`: The undocumented :func:`!glob.glob0` and :func:`!glob.glob1`
|
|
functions are deprecated. Use :func:`glob.glob` and pass a directory to its
|
|
*root_dir* argument instead.
|
|
(Contributed by Barney Gale in :gh:`117337`.)
|
|
|
|
* :mod:`http.server`: :class:`http.server.CGIHTTPRequestHandler` now emits a
|
|
:exc:`DeprecationWarning` as it will be removed in 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. This includes removal of the ``--cgi``
|
|
flag to the ``python -m http.server`` command line in 3.15.
|
|
|
|
* :mod:`mimetypes`: Passing file path instead of URL in :func:`~mimetypes.guess_type` is
|
|
:term:`soft deprecated`. Use :func:`~mimetypes.guess_file_type` instead.
|
|
(Contributed by Serhiy Storchaka in :gh:`66543`.)
|
|
|
|
* :mod:`re`: Passing optional arguments *maxsplit*, *count* and *flags* in module-level
|
|
functions :func:`re.split`, :func:`re.sub` and :func:`re.subn` as positional
|
|
arguments is now deprecated. In future Python versions these parameters will be
|
|
:ref:`keyword-only <keyword-only_parameter>`.
|
|
(Contributed by Serhiy Storchaka in :gh:`56166`.)
|
|
|
|
* :mod:`pathlib`:
|
|
:meth:`pathlib.PurePath.is_reserved` is deprecated and scheduled for
|
|
removal in Python 3.15. Use :func:`os.path.isreserved` to detect reserved
|
|
paths on Windows.
|
|
|
|
* :mod:`platform`:
|
|
:func:`~platform.java_ver` is deprecated and will be removed in 3.15.
|
|
It was largely untested, had a confusing API,
|
|
and was only useful for Jython support.
|
|
(Contributed by Nikita Sobolev in :gh:`116349`.)
|
|
|
|
* :mod:`pydoc`: Deprecate undocumented :func:`!pydoc.ispackage` function.
|
|
(Contributed by Zackery Spytz in :gh:`64020`.)
|
|
|
|
* :mod:`sqlite3`: Passing more than one positional argument to
|
|
:func:`sqlite3.connect` and the :class:`sqlite3.Connection` constructor is
|
|
deprecated. The remaining parameters will become keyword-only in Python 3.15.
|
|
|
|
Deprecate passing name, number of arguments, and the callable as keyword
|
|
arguments for the following :class:`sqlite3.Connection` APIs:
|
|
|
|
* :meth:`~sqlite3.Connection.create_function`
|
|
* :meth:`~sqlite3.Connection.create_aggregate`
|
|
|
|
Deprecate passing the callback callable by keyword for the following
|
|
:class:`sqlite3.Connection` APIs:
|
|
|
|
* :meth:`~sqlite3.Connection.set_authorizer`
|
|
* :meth:`~sqlite3.Connection.set_progress_handler`
|
|
* :meth:`~sqlite3.Connection.set_trace_callback`
|
|
|
|
The affected parameters will become positional-only in Python 3.15.
|
|
|
|
(Contributed by Erlend E. Aasland in :gh:`107948` and :gh:`108278`.)
|
|
|
|
* :mod:`sys`: :func:`sys._enablelegacywindowsfsencoding` function.
|
|
Replace it with the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable.
|
|
(Contributed by Inada Naoki in :gh:`73427`.)
|
|
|
|
* :mod:`tarfile`:
|
|
The undocumented and unused ``tarfile`` attribute of :class:`tarfile.TarFile`
|
|
is deprecated and scheduled for removal in Python 3.16.
|
|
|
|
* :mod:`traceback`: The field *exc_type* of :class:`traceback.TracebackException`
|
|
is deprecated. Use *exc_type_str* instead.
|
|
|
|
* :mod:`typing`:
|
|
|
|
* Creating a :class:`typing.NamedTuple` class using keyword arguments to denote
|
|
the fields (``NT = NamedTuple("NT", x=int, y=int)``) is deprecated, and will
|
|
be disallowed in Python 3.15. Use the class-based syntax or the functional
|
|
syntax instead. (Contributed by Alex Waygood in :gh:`105566`.)
|
|
|
|
* When using the functional syntax to create a :class:`typing.NamedTuple`
|
|
class or a :class:`typing.TypedDict` class, failing to pass a value to the
|
|
'fields' parameter (``NT = NamedTuple("NT")`` or ``TD = TypedDict("TD")``) is
|
|
deprecated. Passing ``None`` to the 'fields' parameter
|
|
(``NT = NamedTuple("NT", None)`` or ``TD = TypedDict("TD", None)``) is also
|
|
deprecated. Both will be disallowed in Python 3.15. To create a NamedTuple
|
|
class with 0 fields, use ``class NT(NamedTuple): pass`` or
|
|
``NT = NamedTuple("NT", [])``. To create a TypedDict class with 0 fields, use
|
|
``class TD(TypedDict): pass`` or ``TD = TypedDict("TD", {})``.
|
|
(Contributed by Alex Waygood in :gh:`105566` and :gh:`105570`.)
|
|
|
|
* :func:`typing.no_type_check_decorator` is deprecated, and scheduled for
|
|
removal in Python 3.15. After eight years in the :mod:`typing` module, it
|
|
has yet to be supported by any major type checkers.
|
|
(Contributed by Alex Waygood in :gh:`106309`.)
|
|
|
|
* :data:`typing.AnyStr` is deprecated. In Python 3.16, it will be removed from
|
|
``typing.__all__``, and a :exc:`DeprecationWarning` will be emitted 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`.)
|
|
|
|
* :ref:`user-defined-funcs`:
|
|
Assignment to a function's :attr:`~function.__code__` attribute where the new code
|
|
object's type does not match the function's type, is deprecated. The
|
|
different types are: plain function, generator, async generator and
|
|
coroutine.
|
|
(Contributed by Irit Katriel in :gh:`81137`.)
|
|
|
|
* :mod:`wave`: Deprecate the ``getmark()``, ``setmark()`` and ``getmarkers()``
|
|
methods of the :class:`wave.Wave_read` and :class:`wave.Wave_write` classes.
|
|
They will be removed in Python 3.15.
|
|
(Contributed by Victor Stinner in :gh:`105096`.)
|
|
|
|
.. Add deprecations above alphabetically, not here at the end.
|
|
|
|
Pending Removal in Python 3.14
|
|
------------------------------
|
|
|
|
* :mod:`argparse`: The *type*, *choices*, and *metavar* parameters
|
|
of :class:`!argparse.BooleanOptionalAction` are deprecated
|
|
and will be removed in 3.14.
|
|
(Contributed by Nikita Sobolev in :gh:`92248`.)
|
|
|
|
* :mod:`ast`: The following features have been deprecated in documentation
|
|
since Python 3.8, now cause a :exc:`DeprecationWarning` to be emitted at
|
|
runtime when they are accessed or used, and will be removed in Python 3.14:
|
|
|
|
* :class:`!ast.Num`
|
|
* :class:`!ast.Str`
|
|
* :class:`!ast.Bytes`
|
|
* :class:`!ast.NameConstant`
|
|
* :class:`!ast.Ellipsis`
|
|
|
|
Use :class:`ast.Constant` instead.
|
|
(Contributed by Serhiy Storchaka in :gh:`90953`.)
|
|
|
|
* :mod:`collections.abc`: Deprecated :class:`!collections.abc.ByteString`.
|
|
Prefer :class:`!Sequence` or :class:`~collections.abc.Buffer`.
|
|
For use in typing, prefer a union, like ``bytes | bytearray``,
|
|
or :class:`collections.abc.Buffer`.
|
|
(Contributed by Shantanu Jain in :gh:`91896`.)
|
|
|
|
* :mod:`email`: Deprecated the *isdst* parameter in :func:`email.utils.localtime`.
|
|
(Contributed by Alan Williams in :gh:`72346`.)
|
|
|
|
* :mod:`importlib`: ``__package__`` and ``__cached__`` will cease to be set or
|
|
taken into consideration by the import system (:gh:`97879`).
|
|
|
|
* :mod:`importlib.abc` deprecated classes:
|
|
|
|
* :class:`!importlib.abc.ResourceReader`
|
|
* :class:`!importlib.abc.Traversable`
|
|
* :class:`!importlib.abc.TraversableResources`
|
|
|
|
Use :mod:`importlib.resources.abc` classes instead:
|
|
|
|
* :class:`importlib.resources.abc.Traversable`
|
|
* :class:`importlib.resources.abc.TraversableResources`
|
|
|
|
(Contributed by Jason R. Coombs and Hugo van Kemenade in :gh:`93963`.)
|
|
|
|
* :mod:`itertools` had undocumented, inefficient, historically buggy,
|
|
and inconsistent support for copy, deepcopy, and pickle operations.
|
|
This will be removed in 3.14 for a significant reduction in code
|
|
volume and maintenance burden.
|
|
(Contributed by Raymond Hettinger in :gh:`101588`.)
|
|
|
|
* :mod:`multiprocessing`: The default start method will change to a safer one on
|
|
Linux, BSDs, and other non-macOS POSIX platforms where ``'fork'`` is currently
|
|
the default (:gh:`84559`). Adding a runtime warning about this was deemed too
|
|
disruptive as the majority of code is not expected to care. Use the
|
|
:func:`~multiprocessing.get_context` or
|
|
:func:`~multiprocessing.set_start_method` APIs to explicitly specify when
|
|
your code *requires* ``'fork'``. See :ref:`multiprocessing-start-methods`.
|
|
|
|
* :mod:`pathlib`: :meth:`~pathlib.PurePath.is_relative_to` and
|
|
:meth:`~pathlib.PurePath.relative_to`: passing additional arguments is
|
|
deprecated.
|
|
|
|
* :mod:`pkgutil`: :func:`~pkgutil.find_loader` and :func:`~pkgutil.get_loader`
|
|
now raise :exc:`DeprecationWarning`;
|
|
use :func:`importlib.util.find_spec` instead.
|
|
(Contributed by Nikita Sobolev in :gh:`97850`.)
|
|
|
|
* :mod:`pty`:
|
|
|
|
* ``master_open()``: use :func:`pty.openpty`.
|
|
* ``slave_open()``: use :func:`pty.openpty`.
|
|
|
|
* :mod:`sqlite3`:
|
|
|
|
* :data:`!version` and :data:`!version_info`.
|
|
|
|
* :meth:`~sqlite3.Cursor.execute` and :meth:`~sqlite3.Cursor.executemany`
|
|
if :ref:`named placeholders <sqlite3-placeholders>` are used and
|
|
*parameters* is a sequence instead of a :class:`dict`.
|
|
|
|
* date and datetime adapter, date and timestamp converter:
|
|
see the :mod:`sqlite3` documentation for suggested replacement recipes.
|
|
|
|
* :class:`types.CodeType`: Accessing :attr:`~codeobject.co_lnotab` was
|
|
deprecated in :pep:`626`
|
|
since 3.10 and was planned to be removed in 3.12,
|
|
but it only got a proper :exc:`DeprecationWarning` in 3.12.
|
|
May be removed in 3.14.
|
|
(Contributed by Nikita Sobolev in :gh:`101866`.)
|
|
|
|
* :mod:`typing`: :class:`!typing.ByteString`, deprecated since Python 3.9,
|
|
now causes a :exc:`DeprecationWarning` to be emitted when it is used.
|
|
|
|
* :mod:`urllib`:
|
|
:class:`!urllib.parse.Quoter` is deprecated: it was not intended to be a
|
|
public API.
|
|
(Contributed by Gregory P. Smith in :gh:`88168`.)
|
|
|
|
Pending Removal in Python 3.15
|
|
------------------------------
|
|
|
|
* :class:`http.server.CGIHTTPRequestHandler` will be removed along with its
|
|
related ``--cgi`` flag to ``python -m http.server``. It was obsolete and
|
|
rarely used. No direct replacement exists. *Anything* is better than CGI
|
|
to interface a web server with a request handler.
|
|
|
|
* :class:`locale`: :func:`locale.getdefaultlocale` was deprecated in Python 3.11
|
|
and originally planned for removal in Python 3.13 (:gh:`90817`),
|
|
but removal has been postponed to Python 3.15.
|
|
Use :func:`locale.setlocale()`, :func:`locale.getencoding()` and
|
|
:func:`locale.getlocale()` instead.
|
|
(Contributed by Hugo van Kemenade in :gh:`111187`.)
|
|
|
|
* :mod:`pathlib`:
|
|
:meth:`pathlib.PurePath.is_reserved` is deprecated and scheduled for
|
|
removal in Python 3.15. Use :func:`os.path.isreserved` to detect reserved
|
|
paths on Windows.
|
|
|
|
* :mod:`platform`:
|
|
:func:`~platform.java_ver` is deprecated and will be removed in 3.15.
|
|
It was largely untested, had a confusing API,
|
|
and was only useful for Jython support.
|
|
(Contributed by Nikita Sobolev in :gh:`116349`.)
|
|
|
|
* :mod:`threading`:
|
|
Passing any arguments to :func:`threading.RLock` is now deprecated.
|
|
C version allows any numbers of args and kwargs,
|
|
but they are just ignored. Python version does not allow any arguments.
|
|
All arguments will be removed from :func:`threading.RLock` in Python 3.15.
|
|
(Contributed by Nikita Sobolev in :gh:`102029`.)
|
|
|
|
* :class:`typing.NamedTuple`:
|
|
|
|
* The undocumented keyword argument syntax for creating :class:`!NamedTuple` classes
|
|
(``NT = NamedTuple("NT", x=int)``) is deprecated, and will be disallowed in
|
|
3.15. Use the class-based syntax or the functional syntax instead.
|
|
|
|
* When using the functional syntax to create a :class:`!NamedTuple` class, failing to
|
|
pass a value to the *fields* parameter (``NT = NamedTuple("NT")``) is
|
|
deprecated. Passing ``None`` to the *fields* parameter
|
|
(``NT = NamedTuple("NT", None)``) is also deprecated. Both will be
|
|
disallowed in Python 3.15. To create a :class:`!NamedTuple` class with 0 fields, use
|
|
``class NT(NamedTuple): pass`` or ``NT = NamedTuple("NT", [])``.
|
|
|
|
* :class:`typing.TypedDict`: When using the functional syntax to create a
|
|
:class:`!TypedDict` class, failing to pass a value to the *fields* parameter (``TD =
|
|
TypedDict("TD")``) is deprecated. Passing ``None`` to the *fields* parameter
|
|
(``TD = TypedDict("TD", None)``) is also deprecated. Both will be disallowed
|
|
in Python 3.15. To create a :class:`!TypedDict` class with 0 fields, use ``class
|
|
TD(TypedDict): pass`` or ``TD = TypedDict("TD", {})``.
|
|
|
|
* :mod:`wave`: Deprecate the ``getmark()``, ``setmark()`` and ``getmarkers()``
|
|
methods of the :class:`wave.Wave_read` and :class:`wave.Wave_write` classes.
|
|
They will be removed in Python 3.15.
|
|
(Contributed by Victor Stinner in :gh:`105096`.)
|
|
|
|
Pending Removal in Python 3.16
|
|
------------------------------
|
|
|
|
* :class:`array.array` ``'u'`` type (:c:type:`wchar_t`):
|
|
use the ``'w'`` type instead (``Py_UCS4``).
|
|
|
|
Pending Removal in Future Versions
|
|
----------------------------------
|
|
|
|
The following APIs were deprecated in earlier Python versions and will be removed,
|
|
although there is currently no date scheduled for their removal.
|
|
|
|
* :mod:`argparse`: Nesting argument groups and nesting mutually exclusive
|
|
groups are deprecated.
|
|
|
|
* :mod:`builtins`:
|
|
|
|
* ``~bool``, bitwise inversion on bool.
|
|
* ``bool(NotImplemented)``.
|
|
* Generators: ``throw(type, exc, tb)`` and ``athrow(type, exc, tb)``
|
|
signature is deprecated: use ``throw(exc)`` and ``athrow(exc)`` instead,
|
|
the single argument signature.
|
|
* Currently Python accepts numeric literals immediately followed by keywords,
|
|
for example ``0in x``, ``1or x``, ``0if 1else 2``. It allows confusing and
|
|
ambiguous expressions like ``[0x1for x in y]`` (which can be interpreted as
|
|
``[0x1 for x in y]`` or ``[0x1f or x in y]``). A syntax warning is raised
|
|
if the numeric literal is immediately followed by one of keywords
|
|
:keyword:`and`, :keyword:`else`, :keyword:`for`, :keyword:`if`,
|
|
:keyword:`in`, :keyword:`is` and :keyword:`or`. In a future release it
|
|
will be changed to a syntax error. (:gh:`87999`)
|
|
* Support for ``__index__()`` and ``__int__()`` method returning non-int type:
|
|
these methods will be required to return an instance of a strict subclass of
|
|
:class:`int`.
|
|
* Support for ``__float__()`` method returning a strict subclass of
|
|
:class:`float`: these methods will be required to return an instance of
|
|
:class:`float`.
|
|
* Support for ``__complex__()`` method returning a strict subclass of
|
|
:class:`complex`: these methods will be required to return an instance of
|
|
:class:`complex`.
|
|
* Delegation of ``int()`` to ``__trunc__()`` method.
|
|
|
|
* :mod:`calendar`: ``calendar.January`` and ``calendar.February`` constants are
|
|
deprecated and replaced by :data:`calendar.JANUARY` and
|
|
:data:`calendar.FEBRUARY`.
|
|
(Contributed by Prince Roshan in :gh:`103636`.)
|
|
|
|
* :attr:`codeobject.co_lnotab`: use the :meth:`codeobject.co_lines` method
|
|
instead.
|
|
|
|
* :mod:`datetime`:
|
|
|
|
* :meth:`~datetime.datetime.utcnow`:
|
|
use ``datetime.datetime.now(tz=datetime.UTC)``.
|
|
* :meth:`~datetime.datetime.utcfromtimestamp`:
|
|
use ``datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)``.
|
|
|
|
* :mod:`gettext`: Plural value must be an integer.
|
|
|
|
* :mod:`importlib`:
|
|
|
|
* ``load_module()`` method: use ``exec_module()`` instead.
|
|
* :func:`~importlib.util.cache_from_source` *debug_override* parameter is
|
|
deprecated: use the *optimization* parameter instead.
|
|
|
|
* :mod:`importlib.metadata`:
|
|
|
|
* ``EntryPoints`` tuple interface.
|
|
* Implicit ``None`` on return values.
|
|
|
|
* :mod:`mailbox`: Use of StringIO input and text mode is deprecated, use
|
|
BytesIO and binary mode instead.
|
|
|
|
* :mod:`os`: Calling :func:`os.register_at_fork` in multi-threaded process.
|
|
|
|
* :class:`!pydoc.ErrorDuringImport`: A tuple value for *exc_info* parameter is
|
|
deprecated, use an exception instance.
|
|
|
|
* :mod:`re`: More strict rules are now applied for numerical group references
|
|
and group names in regular expressions. Only sequence of ASCII digits is now
|
|
accepted as a numerical reference. The group name in bytes patterns and
|
|
replacement strings can now only contain ASCII letters and digits and
|
|
underscore.
|
|
(Contributed by Serhiy Storchaka in :gh:`91760`.)
|
|
|
|
* :mod:`!sre_compile`, :mod:`!sre_constants` and :mod:`!sre_parse` modules.
|
|
|
|
* :mod:`shutil`: :func:`~shutil.rmtree`'s *onerror* parameter is deprecated in
|
|
Python 3.12; use the *onexc* parameter instead.
|
|
|
|
* :mod:`ssl` options and protocols:
|
|
|
|
* :class:`ssl.SSLContext` without protocol argument is deprecated.
|
|
* :class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` and
|
|
:meth:`!selected_npn_protocol` are deprecated: use ALPN
|
|
instead.
|
|
* ``ssl.OP_NO_SSL*`` options
|
|
* ``ssl.OP_NO_TLS*`` options
|
|
* ``ssl.PROTOCOL_SSLv3``
|
|
* ``ssl.PROTOCOL_TLS``
|
|
* ``ssl.PROTOCOL_TLSv1``
|
|
* ``ssl.PROTOCOL_TLSv1_1``
|
|
* ``ssl.PROTOCOL_TLSv1_2``
|
|
* ``ssl.TLSVersion.SSLv3``
|
|
* ``ssl.TLSVersion.TLSv1``
|
|
* ``ssl.TLSVersion.TLSv1_1``
|
|
|
|
* :func:`sysconfig.is_python_build` *check_home* parameter is deprecated and
|
|
ignored.
|
|
|
|
* :mod:`threading` methods:
|
|
|
|
* :meth:`!threading.Condition.notifyAll`: use :meth:`~threading.Condition.notify_all`.
|
|
* :meth:`!threading.Event.isSet`: use :meth:`~threading.Event.is_set`.
|
|
* :meth:`!threading.Thread.isDaemon`, :meth:`threading.Thread.setDaemon`:
|
|
use :attr:`threading.Thread.daemon` attribute.
|
|
* :meth:`!threading.Thread.getName`, :meth:`threading.Thread.setName`:
|
|
use :attr:`threading.Thread.name` attribute.
|
|
* :meth:`!threading.currentThread`: use :meth:`threading.current_thread`.
|
|
* :meth:`!threading.activeCount`: use :meth:`threading.active_count`.
|
|
|
|
* :class:`typing.Text` (:gh:`92332`).
|
|
|
|
* :class:`unittest.IsolatedAsyncioTestCase`: it is deprecated to return a value
|
|
that is not ``None`` from a test case.
|
|
|
|
* :mod:`urllib.parse` deprecated functions: :func:`~urllib.parse.urlparse` instead
|
|
|
|
* ``splitattr()``
|
|
* ``splithost()``
|
|
* ``splitnport()``
|
|
* ``splitpasswd()``
|
|
* ``splitport()``
|
|
* ``splitquery()``
|
|
* ``splittag()``
|
|
* ``splittype()``
|
|
* ``splituser()``
|
|
* ``splitvalue()``
|
|
* ``to_bytes()``
|
|
|
|
* :mod:`urllib.request`: :class:`~urllib.request.URLopener` and
|
|
:class:`~urllib.request.FancyURLopener` style of invoking requests is
|
|
deprecated. Use newer :func:`~urllib.request.urlopen` functions and methods.
|
|
|
|
* :mod:`wsgiref`: ``SimpleHandler.stdout.write()`` should not do partial
|
|
writes.
|
|
|
|
* :mod:`xml.etree.ElementTree`: Testing the truth value of an
|
|
:class:`~xml.etree.ElementTree.Element` is deprecated. In a future release it
|
|
it will always return ``True``. Prefer explicit ``len(elem)`` or
|
|
``elem is not None`` tests instead.
|
|
|
|
* :meth:`zipimport.zipimporter.load_module` is deprecated:
|
|
use :meth:`~zipimport.zipimporter.exec_module` instead.
|
|
|
|
|
|
CPython Bytecode Changes
|
|
========================
|
|
|
|
* The oparg of ``YIELD_VALUE`` is now ``1`` if the yield is part of a
|
|
yield-from or await, and ``0`` otherwise. The oparg of ``RESUME`` was
|
|
changed to add a bit indicating whether 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
|
|
------------
|
|
|
|
* 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`.)
|
|
|
|
* 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 **`.
|
|
It makes these functions compatible with arguments of type
|
|
:c:expr:`const char * const *`, :c:expr:`const char **` or
|
|
:c:expr:`char * const *` in C++ and :c:expr:`char * const *` in C
|
|
without an explicit type cast.
|
|
This can be overridden with the :c:macro:`PY_CXX_CONST` macro.
|
|
(Contributed by Serhiy Storchaka in :gh:`65210`.)
|
|
|
|
* Add :c:func:`PyImport_AddModuleRef`: similar to
|
|
:c:func:`PyImport_AddModule`, but return a :term:`strong reference` instead
|
|
of a :term:`borrowed reference`.
|
|
(Contributed by Victor Stinner in :gh:`105922`.)
|
|
|
|
* Add :c:func:`PyWeakref_GetRef` function: similar to
|
|
:c:func:`PyWeakref_GetObject` but returns a :term:`strong reference`, or
|
|
``NULL`` if the referent is no longer live.
|
|
(Contributed by Victor Stinner in :gh:`105927`.)
|
|
|
|
* Add :c:func:`PyObject_GetOptionalAttr` and
|
|
:c:func:`PyObject_GetOptionalAttrString`, variants of
|
|
:c:func:`PyObject_GetAttr` and :c:func:`PyObject_GetAttrString` which
|
|
don't raise :exc:`AttributeError` if the attribute is not found.
|
|
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 :c:func:`PyMapping_GetOptionalItem` and
|
|
:c:func:`PyMapping_GetOptionalItemString`: variants of
|
|
:c:func:`PyObject_GetItem` and :c:func:`PyMapping_GetItemString` which don't
|
|
raise :exc:`KeyError` if the key is not found.
|
|
These variants are more convenient and faster if the missing key should not
|
|
be treated as a failure.
|
|
(Contributed by Serhiy Storchaka in :gh:`106307`.)
|
|
|
|
* 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`.
|
|
|
|
New functions return not only ``1`` for true and ``0`` for false, but also
|
|
``-1`` for error.
|
|
|
|
(Contributed by Serhiy Storchaka in :gh:`108511`.)
|
|
|
|
* 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`.)
|
|
|
|
* Add :c:func:`PyModule_Add` function: 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 :c:func:`PyDict_GetItemRef` and :c:func:`PyDict_GetItemStringRef`
|
|
functions: similar to :c:func:`PyDict_GetItemWithError` but returning a
|
|
:term:`strong reference` instead of a :term:`borrowed reference`. Moreover,
|
|
these functions return -1 on error and so checking ``PyErr_Occurred()`` is
|
|
not needed.
|
|
(Contributed by Victor Stinner in :gh:`106004`.)
|
|
|
|
* Added :c:func:`PyDict_SetDefaultRef`, which is similar 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 :c:func:`PyDict_ContainsString` function: same 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`.)
|
|
|
|
* Added :c:func:`PyList_GetItemRef` function: similar to
|
|
:c:func:`PyList_GetItem` but returns a :term:`strong reference` instead of
|
|
a :term:`borrowed reference`.
|
|
|
|
* Add :c:func:`Py_IsFinalizing` function: check if the main Python interpreter is
|
|
:term:`shutting down <interpreter shutdown>`.
|
|
(Contributed by Victor Stinner in :gh:`108014`.)
|
|
|
|
* Add :c:func:`PyLong_AsInt` function: similar to :c:func:`PyLong_AsLong`, but
|
|
store the result in a C :c:expr:`int` instead of a C :c:expr:`long`.
|
|
Previously, it was known as the private function :c:func:`!_PyLong_AsInt`
|
|
(with an underscore prefix).
|
|
(Contributed by Victor Stinner in :gh:`108014`.)
|
|
|
|
* Python built with :file:`configure` :option:`--with-trace-refs` (tracing
|
|
references) now supports the :ref:`Limited API <limited-c-api>`.
|
|
(Contributed by Victor Stinner in :gh:`108634`.)
|
|
|
|
* Add :c:func:`PyObject_VisitManagedDict` and
|
|
:c:func:`PyObject_ClearManagedDict` functions which must be called by the
|
|
traverse and clear functions of a type using
|
|
:c:macro:`Py_TPFLAGS_MANAGED_DICT` flag. The `pythoncapi-compat project
|
|
<https://github.com/python/pythoncapi-compat/>`__ can be used to get these
|
|
functions on Python 3.11 and 3.12.
|
|
(Contributed by Victor Stinner in :gh:`107073`.)
|
|
|
|
* Add :c:func:`PyUnicode_EqualToUTF8AndSize` and :c:func:`PyUnicode_EqualToUTF8`
|
|
functions: compare Unicode object with a :c:expr:`const char*` UTF-8 encoded
|
|
string and return true (``1``) if they are equal, or false (``0``) otherwise.
|
|
These functions do not raise exceptions.
|
|
(Contributed by Serhiy Storchaka in :gh:`110289`.)
|
|
|
|
* Add :c:func:`PyThreadState_GetUnchecked()` function: similar to
|
|
:c:func:`PyThreadState_Get()`, but don't kill the process with a fatal error
|
|
if it is NULL. The caller is responsible to check if the result is NULL.
|
|
Previously, the function was private and known as
|
|
``_PyThreadState_UncheckedGet()``.
|
|
(Contributed by Victor Stinner in :gh:`108867`.)
|
|
|
|
* Add :c:func:`PySys_AuditTuple` function: similar to :c:func:`PySys_Audit`,
|
|
but pass event arguments as a Python :class:`tuple` object.
|
|
(Contributed by Victor Stinner in :gh:`85283`.)
|
|
|
|
* :c:func:`PyArg_ParseTupleAndKeywords` now supports non-ASCII keyword
|
|
parameter names.
|
|
(Contributed by Serhiy Storchaka in :gh:`110815`.)
|
|
|
|
* Add :c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawCalloc`,
|
|
:c:func:`PyMem_RawRealloc` and :c:func:`PyMem_RawFree` to the limited C API
|
|
(version 3.13).
|
|
(Contributed by Victor Stinner in :gh:`85283`.)
|
|
|
|
* Add :c:func:`PySys_Audit` and :c:func:`PySys_AuditTuple` functions to the
|
|
limited C API.
|
|
(Contributed by Victor Stinner in :gh:`85283`.)
|
|
|
|
* Add :c:func:`PyErr_FormatUnraisable` function: similar to
|
|
:c:func:`PyErr_WriteUnraisable`, but allow customizing the warning message.
|
|
(Contributed by Serhiy Storchaka in :gh:`108082`.)
|
|
|
|
* Add :c:func:`PyList_Extend` and :c:func:`PyList_Clear` functions: similar to
|
|
Python ``list.extend()`` and ``list.clear()`` methods.
|
|
(Contributed by Victor Stinner in :gh:`111138`.)
|
|
|
|
* Add :c:func:`PyDict_Pop` and :c:func:`PyDict_PopString` functions: remove a
|
|
key from a dictionary and optionally return the removed value. This is
|
|
similar to :meth:`dict.pop`, but without the default value and not raising
|
|
:exc:`KeyError` if the key is missing.
|
|
(Contributed by Stefan Behnel and Victor Stinner in :gh:`111262`.)
|
|
|
|
* Add :c:func:`Py_HashPointer` function to hash a pointer.
|
|
(Contributed by Victor Stinner in :gh:`111545`.)
|
|
|
|
* Add :c:func:`PyObject_GenericHash` function that implements the default
|
|
hashing function of a Python object.
|
|
(Contributed by Serhiy Storchaka in :gh:`113024`.)
|
|
|
|
* Add PyTime C API:
|
|
|
|
* :c:type:`PyTime_t` type.
|
|
* :c:var:`PyTime_MIN` and :c:var:`PyTime_MAX` constants.
|
|
* Add functions:
|
|
|
|
* :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 :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:`PyType_GetFullyQualifiedName` function to get the type's fully
|
|
qualified name. Equivalent to ``f"{type.__module__}.{type.__qualname__}"``,
|
|
or ``type.__qualname__`` if ``type.__module__`` is not a string or is equal
|
|
to ``"builtins"``.
|
|
(Contributed by Victor Stinner in :gh:`111696`.)
|
|
|
|
* Add :c:func:`PyType_GetModuleName` function to get the type's module name.
|
|
Equivalent to getting the ``type.__module__`` attribute.
|
|
(Contributed by Eric Snow and Victor Stinner in :gh:`111696`.)
|
|
|
|
* Add support for ``%T``, ``%#T``, ``%N`` and ``%#N`` formats to
|
|
:c:func:`PyUnicode_FromFormat`: format the fully qualified name of an object
|
|
type and of a type: call :c:func:`PyType_GetModuleName`. See :pep:`737` for
|
|
more information.
|
|
(Contributed by Victor Stinner in :gh:`111696`.)
|
|
|
|
* Add :c:func:`Py_GetConstant` and :c:func:`Py_GetConstantBorrowed` functions
|
|
to get constants. For example, ``Py_GetConstant(Py_CONSTANT_ZERO)`` returns a
|
|
:term:`strong reference` to the constant zero.
|
|
(Contributed by Victor Stinner in :gh:`115754`.)
|
|
|
|
* Add :c:func:`PyType_GetModuleByDef` to the limited C API
|
|
(Contributed by Victor Stinner in :gh:`116936`.)
|
|
|
|
* Add two new functions to the C-API, :c:func:`PyRefTracer_SetTracer` and
|
|
:c:func:`PyRefTracer_GetTracer`, that allows to track object creation and
|
|
destruction the same way the :mod:`tracemalloc` module does. (Contributed
|
|
by Pablo Galindo in :gh:`93502`.)
|
|
|
|
* Add :c:func:`PyEval_GetFrameBuiltins`, :c:func:`PyEval_GetFrameGlobals`, and
|
|
:c:func:`PyEval_GetFrameLocals` to the C API. These replacements for
|
|
:c:func:`PyEval_GetBuiltins`, :c:func:`PyEval_GetGlobals`, and
|
|
:c:func:`PyEval_GetLocals` return :term:`strong references <strong reference>`
|
|
rather than borrowed references. (Added as part of :pep:`667`.)
|
|
|
|
* Add :c:type:`PyMutex` API, a lightweight mutex that occupies a single byte.
|
|
The :c:func:`PyMutex_Lock` function will release the GIL (if currently held)
|
|
if the operation needs to block.
|
|
(Contributed by Sam Gross in :gh:`108724`.)
|
|
|
|
Build Changes
|
|
=============
|
|
|
|
* The :file:`configure` option :option:`--with-system-libmpdec` now defaults
|
|
to ``yes``. The bundled copy of ``libmpdecimal`` will be removed in Python
|
|
3.15.
|
|
|
|
* Autoconf 2.71 and aclocal 1.16.4 are now required to regenerate
|
|
the :file:`configure` script.
|
|
(Contributed by Christian Heimes in :gh:`89886`.)
|
|
|
|
* SQLite 3.15.2 or newer is required to build the :mod:`sqlite3` extension module.
|
|
(Contributed by Erlend Aasland in :gh:`105875`.)
|
|
|
|
* 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`.)
|
|
|
|
* Building CPython now requires a compiler with support for the C11 atomic
|
|
library, GCC built-in atomic functions, or MSVC interlocked intrinsics.
|
|
|
|
* 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`.)
|
|
|
|
* ``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`.)
|
|
|
|
* Python now bundles the `mimalloc library <https://github.com/microsoft/mimalloc>`__.
|
|
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`.)
|
|
|
|
* 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``.
|
|
|
|
|
|
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
|
|
-------------------------
|
|
|
|
* 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 :mod:`threading` module now expects the :mod:`!_thread` module to have
|
|
an ``_is_main_interpreter`` attribute. It is a function with no
|
|
arguments that returns ``True`` if the current interpreter is the
|
|
main interpreter.
|
|
|
|
Any library or application that provides a custom ``_thread`` module
|
|
must provide ``_is_main_interpreter()``, just like the module's
|
|
other "private" attributes.
|
|
(See :gh:`112826`.)
|
|
|
|
* :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. Users may add a trailing slash to match only
|
|
directories.
|
|
|
|
* The value of the :attr:`!mode` attribute of :class:`gzip.GzipFile` was
|
|
changed from integer (``1`` or ``2``) to string (``'rb'`` or ``'wb'``).
|
|
The value of the :attr:`!mode` attribute of the readable file-like object
|
|
returned by :meth:`zipfile.ZipFile.open` was changed from ``'r'`` to ``'rb'``.
|
|
(Contributed by Serhiy Storchaka in :gh:`115961`.)
|
|
|
|
* :class:`functools.partial` now emits a :exc:`FutureWarning` when it is
|
|
used as a method.
|
|
Its behavior will be changed in future Python versions.
|
|
Wrap it in :func:`staticmethod` if you want to preserve the old behavior.
|
|
(Contributed by Serhiy Storchaka in :gh:`121027`.)
|
|
|
|
.. _pep667-porting-notes-py:
|
|
|
|
* 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 behaviour now
|
|
requires explicit calls to update the initially returned dictionary with the
|
|
results of subsequent calls to ``locals()``. Code execution functions that
|
|
implicitly target ``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`.)
|
|
|
|
Changes in the C API
|
|
--------------------
|
|
|
|
* ``Python.h`` no longer includes the ``<ieeefp.h>`` standard header. It was
|
|
included for the ``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 ``clock()`` and
|
|
``gmtime()`` functions, ``<sys/select.h>`` provides the ``select()``
|
|
function, and ``<sys/time.h>`` provides the ``futimes()``, ``gettimeofday()``
|
|
and ``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 ``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`.)
|
|
|
|
* Functions :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`, which clear all errors which occurred when calling
|
|
them, now report them using :func:`sys.unraisablehook`.
|
|
You may replace them with other functions as
|
|
recommended in the documentation.
|
|
(Contributed by Serhiy Storchaka in :gh:`106672`.)
|
|
|
|
* :c:func:`!PyCode_GetFirstFree` is an unstable API now and has been renamed
|
|
to :c:func:`PyUnstable_Code_GetFirstFree`.
|
|
(Contributed by Bogdan Romanyuk in :gh:`115781`.)
|
|
|
|
.. _pep667-porting-notes-c:
|
|
|
|
* 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.
|
|
(Changed as part of :pep:`667`.)
|
|
|
|
* 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. (Changed as part of :pep:`667`.)
|
|
|
|
* :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.
|
|
(Changed as part of :pep:`667`.)
|
|
|
|
* :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>`. (Changed as part of :pep:`667`.)
|
|
|
|
Removed C APIs
|
|
--------------
|
|
|
|
* Remove many APIs (functions, macros, variables) with names prefixed by
|
|
``_Py`` or ``_PY`` (considered as private API). If your project is affected
|
|
by one of these removals and you consider that the removed API should remain
|
|
available, please open a new issue 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 functions deprecated in Python 3.9:
|
|
|
|
* ``PyEval_CallObject()``, ``PyEval_CallObjectWithKeywords()``: use
|
|
:c:func:`PyObject_CallNoArgs` or :c:func:`PyObject_Call` instead.
|
|
Warning: :c:func:`PyObject_Call` positional arguments must be a
|
|
:class:`tuple` and must not be ``NULL``, keyword arguments must be a
|
|
:class:`dict` or ``NULL``, whereas removed functions checked arguments type
|
|
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>`.
|
|
* ``PyEval_CallFunction()``: use :c:func:`PyObject_CallFunction` instead.
|
|
* ``PyEval_CallMethod()``: use :c:func:`PyObject_CallMethod` instead.
|
|
* ``PyCFunction_Call()``: use :c:func:`PyObject_Call` instead.
|
|
|
|
(Contributed by Victor Stinner in :gh:`105107`.)
|
|
|
|
* Remove old buffer protocols deprecated in Python 3.0. Use :ref:`bufferobjects` instead.
|
|
|
|
* :c:func:`!PyObject_CheckReadBuffer`: Use :c:func:`PyObject_CheckBuffer` to
|
|
test if 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`:
|
|
: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 the following old functions to configure the Python initialization,
|
|
deprecated in Python 3.11:
|
|
|
|
* ``PySys_AddWarnOptionUnicode()``: use :c:member:`PyConfig.warnoptions` instead.
|
|
* ``PySys_AddWarnOption()``: use :c:member:`PyConfig.warnoptions` instead.
|
|
* ``PySys_AddXOption()``: use :c:member:`PyConfig.xoptions` instead.
|
|
* ``PySys_HasWarnOptions()``: use :c:member:`PyConfig.xoptions` instead.
|
|
* ``PySys_SetPath()``: set :c:member:`PyConfig.module_search_paths` instead.
|
|
* ``Py_SetPath()``: set :c:member:`PyConfig.module_search_paths` instead.
|
|
* ``Py_SetStandardStreamEncoding()``: set :c:member:`PyConfig.stdio_encoding`
|
|
instead, and set also maybe :c:member:`PyConfig.legacy_windows_stdio` (on
|
|
Windows).
|
|
* ``_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 ``PyEval_ThreadsInitialized()``
|
|
function, deprecated in Python 3.9. Since Python 3.7, ``Py_Initialize()``
|
|
always creates the GIL: calling ``PyEval_InitThreads()`` does nothing and
|
|
``PyEval_ThreadsInitialized()`` always returned non-zero.
|
|
(Contributed by Victor Stinner in :gh:`105182`.)
|
|
|
|
* Remove ``PyEval_AcquireLock()`` and ``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 private ``_PyObject_FastCall()`` function:
|
|
use ``PyObject_Vectorcall()`` which is available since Python 3.8
|
|
(:pep:`590`).
|
|
(Contributed by Victor Stinner in :gh:`106023`.)
|
|
|
|
* Remove ``cpython/pytime.h`` header file: it only contained private functions.
|
|
(Contributed by Victor Stinner in :gh:`106316`.)
|
|
|
|
* Remove ``_PyInterpreterState_Get()`` alias to
|
|
:c:func:`PyInterpreterState_Get()` which was kept for backward compatibility
|
|
with Python 3.8. The `pythoncapi-compat project
|
|
<https://github.com/python/pythoncapi-compat/>`__ can be used to get
|
|
:c:func:`PyInterpreterState_Get()` on Python 3.8 and older.
|
|
(Contributed by Victor Stinner in :gh:`106320`.)
|
|
|
|
* The :c:func:`PyModule_AddObject` function is now :term:`soft deprecated`:
|
|
:c:func:`PyModule_Add` or :c:func:`PyModule_AddObjectRef` functions should
|
|
be used instead.
|
|
(Contributed by Serhiy Storchaka in :gh:`86493`.)
|
|
|
|
Deprecated C APIs
|
|
-----------------
|
|
|
|
* Deprecate the old ``Py_UNICODE`` and ``PY_UNICODE_TYPE`` types: use directly
|
|
the :c:type:`wchar_t` type 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 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
|
|
:envvar:`PYTHONHOME` environment variable instead.
|
|
|
|
Functions scheduled for removal in Python 3.15.
|
|
(Contributed by Victor Stinner in :gh:`105145`.)
|
|
|
|
* Deprecate the :c:func:`PyImport_ImportModuleNoBlock` function which is just
|
|
an alias to :c:func:`PyImport_ImportModule` since Python 3.3.
|
|
Scheduled for removal in Python 3.15.
|
|
(Contributed by Victor Stinner in :gh:`105396`.)
|
|
|
|
* Deprecate the :c:func:`PyWeakref_GetObject` and
|
|
:c:func:`PyWeakref_GET_OBJECT` functions, which return a :term:`borrowed
|
|
reference`: use the new :c:func:`PyWeakref_GetRef` function instead, it
|
|
returns a :term:`strong reference`. The `pythoncapi-compat project
|
|
<https://github.com/python/pythoncapi-compat/>`__ can be used to get
|
|
:c:func:`PyWeakref_GetRef` on Python 3.12 and older.
|
|
(Contributed by Victor Stinner in :gh:`105927`.)
|
|
|
|
* Deprecate the :c:func:`PyEval_GetBuiltins`, :c:func:`PyEval_GetGlobals`, and
|
|
:c:func:`PyEval_GetLocals` functions, which return a :term:`borrowed reference`.
|
|
Refer to the deprecation notices on each function for their recommended replacements.
|
|
(Soft deprecated as part of :pep:`667`.)
|
|
|
|
Pending Removal in Python 3.14
|
|
------------------------------
|
|
|
|
* Creating immutable types (:c:macro:`Py_TPFLAGS_IMMUTABLETYPE`) with mutable
|
|
bases using the C API.
|
|
|
|
* Functions to configure the Python initialization, deprecated in Python 3.11:
|
|
|
|
* ``PySys_SetArgvEx()``: set :c:member:`PyConfig.argv` instead.
|
|
* ``PySys_SetArgv()``: set :c:member:`PyConfig.argv` instead.
|
|
* ``Py_SetProgramName()``: set :c:member:`PyConfig.program_name` instead.
|
|
* ``Py_SetPythonHome()``: set :c:member:`PyConfig.home` instead.
|
|
|
|
The :c:func:`Py_InitializeFromConfig` API should be used with
|
|
:c:type:`PyConfig` instead.
|
|
|
|
* Global configuration variables:
|
|
|
|
* :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug`
|
|
* :c:var:`Py_VerboseFlag`: use :c:member:`PyConfig.verbose`
|
|
* :c:var:`Py_QuietFlag`: use :c:member:`PyConfig.quiet`
|
|
* :c:var:`Py_InteractiveFlag`: use :c:member:`PyConfig.interactive`
|
|
* :c:var:`Py_InspectFlag`: use :c:member:`PyConfig.inspect`
|
|
* :c:var:`Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level`
|
|
* :c:var:`Py_NoSiteFlag`: use :c:member:`PyConfig.site_import`
|
|
* :c:var:`Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning`
|
|
* :c:var:`Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings`
|
|
* :c:var:`Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment`
|
|
* :c:var:`Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode`
|
|
* :c:var:`Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory`
|
|
* :c:var:`Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio`
|
|
* :c:var:`Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed`
|
|
and :c:member:`PyConfig.hash_seed`
|
|
* :c:var:`Py_IsolatedFlag`: use :c:member:`PyConfig.isolated`
|
|
* :c:var:`Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyPreConfig.legacy_windows_fs_encoding`
|
|
* :c:var:`Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio`
|
|
* :c:var:`!Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding`
|
|
* :c:var:`!Py_HasFileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding`
|
|
* :c:var:`!Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors`
|
|
* :c:var:`!Py_UTF8Mode`: use :c:member:`PyPreConfig.utf8_mode` (see :c:func:`Py_PreInitialize`)
|
|
|
|
The :c:func:`Py_InitializeFromConfig` API should be used with
|
|
:c:type:`PyConfig` instead.
|
|
|
|
Pending Removal in Python 3.15
|
|
------------------------------
|
|
|
|
* The bundled copy of ``libmpdecimal``.
|
|
* :c:func:`PyImport_ImportModuleNoBlock`: use :c:func:`PyImport_ImportModule`.
|
|
* :c:func:`PyWeakref_GET_OBJECT`: use :c:func:`PyWeakref_GetRef` instead.
|
|
* :c:func:`PyWeakref_GetObject`: use :c:func:`PyWeakref_GetRef` instead.
|
|
* :c:type:`!Py_UNICODE_WIDE` type: use :c:type:`wchar_t` instead.
|
|
* :c:type:`Py_UNICODE` type: use :c:type:`wchar_t` instead.
|
|
* 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
|
|
:envvar:`PYTHONHOME` environment variable instead.
|
|
|
|
Pending Removal in Future Versions
|
|
----------------------------------
|
|
|
|
The following APIs were deprecated in earlier Python versions and will be
|
|
removed, although there is currently no date scheduled for their removal.
|
|
|
|
* :c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: no needed since Python 3.8.
|
|
* :c:func:`PyErr_Fetch`: use :c:func:`PyErr_GetRaisedException`.
|
|
* :c:func:`PyErr_NormalizeException`: use :c:func:`PyErr_GetRaisedException`.
|
|
* :c:func:`PyErr_Restore`: use :c:func:`PyErr_SetRaisedException`.
|
|
* :c:func:`PyModule_GetFilename`: use :c:func:`PyModule_GetFilenameObject`.
|
|
* :c:func:`PyOS_AfterFork`: use :c:func:`PyOS_AfterFork_Child()`.
|
|
* :c:func:`PySlice_GetIndicesEx`.
|
|
* :c:func:`!PyUnicode_AsDecodedObject`.
|
|
* :c:func:`!PyUnicode_AsDecodedUnicode`.
|
|
* :c:func:`!PyUnicode_AsEncodedObject`.
|
|
* :c:func:`!PyUnicode_AsEncodedUnicode`.
|
|
* :c:func:`PyUnicode_READY`: not needed since Python 3.12.
|
|
* :c:func:`!_PyErr_ChainExceptions`.
|
|
* :c:member:`!PyBytesObject.ob_shash` member:
|
|
call :c:func:`PyObject_Hash` instead.
|
|
* :c:member:`!PyDictObject.ma_version_tag` member.
|
|
* TLS API:
|
|
|
|
* :c:func:`PyThread_create_key`: use :c:func:`PyThread_tss_alloc`.
|
|
* :c:func:`PyThread_delete_key`: use :c:func:`PyThread_tss_free`.
|
|
* :c:func:`PyThread_set_key_value`: use :c:func:`PyThread_tss_set`.
|
|
* :c:func:`PyThread_get_key_value`: use :c:func:`PyThread_tss_get`.
|
|
* :c:func:`PyThread_delete_key_value`: use :c:func:`PyThread_tss_delete`.
|
|
* :c:func:`PyThread_ReInitTLS`: no longer needed.
|
|
|
|
* Remove undocumented ``PY_TIMEOUT_MAX`` constant from the limited C API.
|
|
(Contributed by Victor Stinner in :gh:`110014`.)
|
|
|
|
|
|
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`.)
|