mirror of https://github.com/python/cpython
469 lines
17 KiB
ReStructuredText
469 lines
17 KiB
ReStructuredText
|
|
****************************
|
|
What's New In Python 3.13
|
|
****************************
|
|
|
|
:Release: |release|
|
|
:Date: |today|
|
|
|
|
.. Rules for maintenance:
|
|
|
|
* Anyone can add text to this document. Do not spend very much time
|
|
on the wording of your changes, because your text will probably
|
|
get rewritten to some degree.
|
|
|
|
* The maintainer will go through Misc/NEWS periodically and add
|
|
changes; it's therefore more important to add your changes to
|
|
Misc/NEWS than to this file.
|
|
|
|
* This is not a complete list of every single change; completeness
|
|
is the purpose of Misc/NEWS. Some changes I consider too small
|
|
or esoteric to include. If such a change is added to the text,
|
|
I'll just remove it. (This is another reason you shouldn't spend
|
|
too much time on writing your addition.)
|
|
|
|
* If you want to draw your new text to the attention of the
|
|
maintainer, add 'XXX' to the beginning of the paragraph or
|
|
section.
|
|
|
|
* It's OK to just add a fragmentary note about a change. For
|
|
example: "XXX Describe the transmogrify() function added to the
|
|
socket module." The maintainer will research the change and
|
|
write the necessary text.
|
|
|
|
* You can comment out your additions if you like, but it's not
|
|
necessary (especially when a final release is some months away).
|
|
|
|
* Credit the author of a patch or bugfix. Just the name is
|
|
sufficient; the e-mail address isn't necessary.
|
|
|
|
* It's helpful to add the 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
|
|
======================
|
|
|
|
|
|
|
|
New Modules
|
|
===========
|
|
|
|
* None yet.
|
|
|
|
|
|
Improved Modules
|
|
================
|
|
|
|
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`.)
|
|
|
|
pathlib
|
|
-------
|
|
|
|
* 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` and
|
|
:meth:`~pathlib.Path.rglob`.
|
|
(Contributed by Barney Gale in :gh:`77609`.)
|
|
|
|
Optimizations
|
|
=============
|
|
|
|
|
|
|
|
|
|
Deprecated
|
|
==========
|
|
|
|
* :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`.)
|
|
|
|
|
|
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`.)
|
|
|
|
|
|
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`.)
|
|
|
|
|
|
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`.)
|
|
|
|
|
|
Porting to Python 3.13
|
|
----------------------
|
|
|
|
Deprecated
|
|
----------
|
|
|
|
* Deprecate the old ``Py_UNICODE`` and ``PY_UNICODE_TYPE`` types: use directly
|
|
the ``wchar_t`` type instead. Since Python 3.3, ``Py_UNICODE`` and
|
|
``PY_UNICODE_TYPE`` are just aliases to ``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.
|
|
|
|
(Contributed by Victor Stinner in :gh:`105145`.)
|
|
|
|
Removed
|
|
-------
|
|
|
|
* 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.
|
|
* ``_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`.)
|