mirror of https://github.com/python/cpython
1086 lines
45 KiB
ReStructuredText
1086 lines
45 KiB
ReStructuredText
|
|
****************************
|
|
What's New In Python 3.13
|
|
****************************
|
|
|
|
:Editor: TBD
|
|
|
|
.. 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>`.
|
|
|
|
.. 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.
|
|
|
|
|
|
.. PEP-sized items next.
|
|
|
|
|
|
|
|
New Features
|
|
============
|
|
|
|
|
|
|
|
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`.)
|
|
|
|
New Modules
|
|
===========
|
|
|
|
* None yet.
|
|
|
|
|
|
Improved Modules
|
|
================
|
|
|
|
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`.)
|
|
|
|
dbm
|
|
---
|
|
|
|
* Add :meth:`dbm.gnu.gdbm.clear` and :meth:`dbm.ndbm.ndbm.clear` methods that remove all items
|
|
from the database.
|
|
(Contributed by Dong-hee Na in :gh:`107122`.)
|
|
|
|
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`.)
|
|
|
|
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.
|
|
|
|
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 support for recursive wildcards in :meth:`pathlib.PurePath.match`.
|
|
(Contributed by Barney Gale in :gh:`73435`.)
|
|
|
|
* Add *follow_symlinks* keyword-only argument to :meth:`pathlib.Path.glob`,
|
|
:meth:`~pathlib.Path.rglob`, :meth:`~pathlib.Path.is_file`, and
|
|
:meth:`~pathlib.Path.is_dir`.
|
|
(Contributed by Barney Gale in :gh:`77609` and :gh:`105793`.)
|
|
|
|
traceback
|
|
---------
|
|
|
|
* Add *show_group* paramter 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`.)
|
|
|
|
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`.)
|
|
|
|
Optimizations
|
|
=============
|
|
|
|
* :func:`textwrap.indent` is now ~30% faster than before for large input.
|
|
(Contributed by Inada Naoki in :gh:`107369`.)
|
|
|
|
|
|
Deprecated
|
|
==========
|
|
|
|
* :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:`getopt` and :mod:`optparse` modules: They are now
|
|
:term:`soft deprecated`: the :mod:`argparse` 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:`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`.)
|
|
|
|
* :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`.)
|
|
|
|
* 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.
|
|
(Contributed by Erlend E. Aasland in :gh:`107948`.)
|
|
|
|
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`,
|
|
:meth:`~pathlib.PurePath.relative_to`: passing additional arguments is
|
|
deprecated.
|
|
|
|
* :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`.
|
|
|
|
* :func:`shutil.rmtree` *onerror* parameter is deprecated in 3.12,
|
|
and will be removed in 3.14: use the *onexc* parameter instead.
|
|
|
|
* :mod:`sqlite3`:
|
|
|
|
* :data:`~sqlite3.version` and :data:`~sqlite3.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 ``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.
|
|
|
|
* :class:`!urllib.parse.Quoter` is deprecated: it was not intended to be a
|
|
public API.
|
|
(Contributed by Gregory P. Smith in :gh:`88168`.)
|
|
|
|
* :mod:`xml.etree.ElementTree`: Testing the truth value of an
|
|
:class:`~xml.etree.ElementTree.Element` is deprecated and will raise an
|
|
exception in Python 3.14.
|
|
|
|
Pending Removal in Python 3.15
|
|
------------------------------
|
|
|
|
* :class:`typing.NamedTuple`:
|
|
|
|
* The undocumented keyword argument syntax for creating 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 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 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
|
|
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 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.Month.JANUARY` and
|
|
:data:`calendar.Month.FEBRUARY`.
|
|
(Contributed by Prince Roshan in :gh:`103636`.)
|
|
|
|
* :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:`importlib.resources`: First parameter to files is renamed to 'anchor'.
|
|
* :mod:`importlib.resources` deprecated methods:
|
|
|
|
* ``contents()``
|
|
* ``is_resource()``
|
|
* ``open_binary()``
|
|
* ``open_text()``
|
|
* ``path()``
|
|
* ``read_binary()``
|
|
* ``read_text()``
|
|
|
|
Use ``files()`` instead. Refer to `importlib-resources: Migrating from Legacy
|
|
<https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy>`_
|
|
for migration advice.
|
|
|
|
* :func:`locale.getdefaultlocale`: use :func:`locale.setlocale()`,
|
|
:func:`locale.getencoding()` and :func:`locale.getlocale()` instead
|
|
(:gh:`90817`)
|
|
|
|
* :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:`ssl` options and protocols:
|
|
|
|
* :class:`ssl.SSLContext` without protocol argument is deprecated.
|
|
* :class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` and
|
|
:meth:`!~ssl.SSLContext.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``
|
|
|
|
* :mod:`!sre_compile`, :mod:`!sre_constants` and :mod:`!sre_parse` modules.
|
|
|
|
* ``types.CodeType.co_lnotab``: use the ``co_lines`` attribute instead.
|
|
|
|
* :class:`typing.Text` (:gh:`92332`).
|
|
|
|
* :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:`unittest.IsolatedAsyncioTestCase`: it is deprecated to return a value
|
|
that is not None from a test case.
|
|
|
|
* :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.
|
|
|
|
* :func:`!urllib.parse.to_bytes`.
|
|
|
|
* :mod:`urllib.parse` deprecated functions: :func:`~urllib.parse.urlparse` instead
|
|
|
|
* ``splitattr()``
|
|
* ``splithost()``
|
|
* ``splitnport()``
|
|
* ``splitpasswd()``
|
|
* ``splitport()``
|
|
* ``splitquery()``
|
|
* ``splittag()``
|
|
* ``splittype()``
|
|
* ``splituser()``
|
|
* ``splitvalue()``
|
|
|
|
* :mod:`wsgiref`: ``SimpleHandler.stdout.write()`` should not do partial
|
|
writes.
|
|
|
|
* :meth:`zipimport.zipimporter.load_module` is deprecated:
|
|
use :meth:`~zipimport.zipimporter.exec_module` instead.
|
|
|
|
|
|
Removed
|
|
=======
|
|
|
|
* :pep:`594`: Remove the :mod:`!telnetlib` module, deprecated in Python 3.11:
|
|
use the projects `telnetlib3 <https://pypi.org/project/telnetlib3/>`_ or
|
|
`Exscript <https://pypi.org/project/Exscript/>`_ instead.
|
|
(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`.)
|
|
|
|
* 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 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 support for using :class:`pathlib.Path` objects as context managers.
|
|
This functionality was deprecated and made a no-op in Python 3.9.
|
|
|
|
* 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`.)
|
|
|
|
* 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`.)
|
|
|
|
* Removed 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`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!cgi` and :mod:`!cgitb` modules,
|
|
deprecated in Python 3.11.
|
|
|
|
* ``cgi.FieldStorage`` can typically be replaced with
|
|
:func:`urllib.parse.parse_qsl` for ``GET`` and ``HEAD`` requests, and the
|
|
:mod:`email.message` module or `multipart
|
|
<https://pypi.org/project/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_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 `multipart <https://pypi.org/project/multipart/>`__ PyPI project.
|
|
|
|
* ``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
|
|
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!sndhdr` module, deprecated in Python 3.11: use
|
|
the projects `filetype <https://pypi.org/project/filetype/>`_, `puremagic
|
|
<https://pypi.org/project/puremagic/>`_, or `python-magic
|
|
<https://pypi.org/project/python-magic/>`_ instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!pipes` module, deprecated in Python 3.11:
|
|
use the :mod:`subprocess` module instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!ossaudiodev` module, deprecated in Python 3.11:
|
|
use the `pygame project <https://www.pygame.org/>`_ for audio playback.
|
|
(Contributed by Victor Stinner in :gh:`104780`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!sunau` module, deprecated in Python 3.11.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!mailcap` module, deprecated in Python 3.11.
|
|
The :mod:`mimetypes` module provides an alternative.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!spwd` module, deprecated in Python 3.11:
|
|
the `python-pam project <https://pypi.org/project/python-pam/>`_ can be used
|
|
instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!nntplib` module, deprecated in Python 3.11:
|
|
the `PyPI nntplib project <https://pypi.org/project/nntplib/>`_ can be used
|
|
instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!nis` module, deprecated in Python 3.11.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!xdrlib` module, deprecated in Python 3.11.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!msilib` module, deprecated in Python 3.11.
|
|
(Contributed by Zachary Ware in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!crypt` module and its private :mod:`!_crypt`
|
|
extension, deprecated in Python 3.11.
|
|
The :mod:`hashlib` module is a potential replacement for certain use cases.
|
|
Otherwise, the following PyPI projects can be used:
|
|
|
|
* `bcrypt <https://pypi.org/project/bcrypt/>`_:
|
|
Modern password hashing for your software and your servers.
|
|
* `passlib <https://pypi.org/project/passlib/>`_:
|
|
Comprehensive password hashing framework supporting over 30 schemes.
|
|
* `argon2-cffi <https://pypi.org/project/argon2-cffi/>`_:
|
|
The secure Argon2 password hashing algorithm.
|
|
* `legacycrypt <https://pypi.org/project/legacycrypt/>`_:
|
|
Wrapper to the POSIX crypt library call and associated functionality.
|
|
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!uu` module, deprecated in Python 3.11:
|
|
the :mod:`base64` module is a modern alternative.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!aifc` module, deprecated in Python 3.11.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!audioop` module, deprecated in Python 3.11.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!chunk` module, deprecated in Python 3.11.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* 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`.)
|
|
|
|
* :pep:`594`: Remove the :mod:`!imghdr` module, deprecated in Python 3.11:
|
|
use the projects
|
|
`filetype <https://pypi.org/project/filetype/>`_,
|
|
`puremagic <https://pypi.org/project/puremagic/>`_,
|
|
or `python-magic <https://pypi.org/project/python-magic/>`_ instead.
|
|
(Contributed by Victor Stinner in :gh:`104773`.)
|
|
|
|
* Remove the untested and undocumented :meth:`!unittest.TestProgram.usageExit`
|
|
method, deprecated in Python 3.11.
|
|
(Contributed by Hugo van Kemenade in :gh:`104992`.)
|
|
|
|
* 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`.)
|
|
|
|
* Remove the old trashcan macros ``Py_TRASHCAN_SAFE_BEGIN`` and
|
|
``Py_TRASHCAN_SAFE_END``. They should be replaced by the new macros
|
|
``Py_TRASHCAN_BEGIN`` and ``Py_TRASHCAN_END``. 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`.)
|
|
|
|
* Remove ``locale.resetlocale()`` function deprecated in Python 3.11:
|
|
use ``locale.setlocale(locale.LC_ALL, "")`` instead.
|
|
(Contributed by Victor Stinner in :gh:`104783`.)
|
|
|
|
* :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`.)
|
|
|
|
* Remove *cafile*, *capath* and *cadefault* parameters of the
|
|
:func:`urllib.request.urlopen` function, deprecated in Python 3.6: use the
|
|
*context* parameter instead. Please use
|
|
:meth:`ssl.SSLContext.load_cert_chain` instead, or let
|
|
:func:`ssl.create_default_context` select the system's trusted CA
|
|
certificates for you.
|
|
(Contributed by Victor Stinner in :gh:`105382`.)
|
|
|
|
* Remove deprecated ``webbrowser.MacOSXOSAScript._name`` attribute.
|
|
Use :attr:`webbrowser.MacOSXOSAScript.name <webbrowser.controller.name>`
|
|
attribute instead.
|
|
(Contributed by Nikita Sobolev in :gh:`105546`.)
|
|
|
|
* 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`.)
|
|
|
|
|
|
Porting to Python 3.13
|
|
======================
|
|
|
|
This section lists previously described changes and other bugfixes
|
|
that may require changes to your code.
|
|
|
|
* 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.
|
|
|
|
|
|
Build Changes
|
|
=============
|
|
|
|
* Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate
|
|
:file:`!configure`.
|
|
(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`.)
|
|
|
|
|
|
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`.)
|
|
|
|
* 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`.)
|
|
|
|
* 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.
|
|
If the assertion fails, make sure that the size is set before.
|
|
(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`.)
|
|
|
|
* Added :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`.)
|
|
|
|
Porting to Python 3.13
|
|
----------------------
|
|
|
|
Deprecated
|
|
----------
|
|
|
|
* 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`.)
|
|
|
|
Removed
|
|
-------
|
|
|
|
* 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_SetArgvEx()``: set :c:member:`PyConfig.argv` instead.
|
|
* ``PySys_SetArgv()``: set :c:member:`PyConfig.argv` instead.
|
|
* ``PySys_SetPath()``: set :c:member:`PyConfig.module_search_paths` instead.
|
|
* ``Py_SetPath()``: set :c:member:`PyConfig.module_search_paths` instead.
|
|
* ``Py_SetProgramName()``: set :c:member:`PyConfig.program_name` instead.
|
|
* ``Py_SetPythonHome()``: set :c:member:`PyConfig.home` 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_InitThreads()`` and ``PyEval_ThreadsInitialized()``
|
|
functions, deprecated in Python 3.9. Since Python 3.7, ``Py_Initialize()``
|
|
always creates the GIL: calling ``PyEval_InitThreads()`` did 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 the old aliases to functions calling functions which were kept for
|
|
backward compatibility with Python 3.8 provisional API:
|
|
|
|
* ``_PyObject_CallMethodNoArgs()``: use ``PyObject_CallMethodNoArgs()``
|
|
* ``_PyObject_CallMethodOneArg()``: use ``PyObject_CallMethodOneArg()``
|
|
* ``_PyObject_CallOneArg()``: use ``PyObject_CallOneArg()``
|
|
* ``_PyObject_FastCallDict()``: use ``PyObject_VectorcallDict()``
|
|
* ``_PyObject_Vectorcall()``: use ``PyObject_Vectorcall()``
|
|
* ``_PyObject_VectorcallMethod()``: use ``PyObject_VectorcallMethod()``
|
|
* ``_PyVectorcall_Function()``: use ``PyVectorcall_Function()``
|
|
|
|
Just remove the underscore prefix to update your code.
|
|
(Contributed by Victor Stinner in :gh:`106084`.)
|
|
|
|
* 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`.)
|
|
|
|
Pending Removal in Python 3.14
|
|
------------------------------
|
|
|
|
* Creating immutable types (:c:macro:`Py_TPFLAGS_IMMUTABLETYPE`) with mutable
|
|
bases using the C API.
|
|
* 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
|
|
------------------------------
|
|
|
|
* :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.
|