mirror of https://github.com/python/cpython
1011 lines
38 KiB
ReStructuredText
1011 lines
38 KiB
ReStructuredText
****************************
|
|
What's New In Python 3.11
|
|
****************************
|
|
|
|
:Release: |release|
|
|
:Date: |today|
|
|
|
|
.. Rules for maintenance:
|
|
|
|
* Anyone can add text to this document. Do not spend very much time
|
|
on the wording of your changes, because your text will probably
|
|
get rewritten to some degree.
|
|
|
|
* The maintainer will go through Misc/NEWS periodically and add
|
|
changes; it's therefore more important to add your changes to
|
|
Misc/NEWS than to this file.
|
|
|
|
* This is not a complete list of every single change; completeness
|
|
is the purpose of Misc/NEWS. Some changes I consider too small
|
|
or esoteric to include. If such a change is added to the text,
|
|
I'll just remove it. (This is another reason you shouldn't spend
|
|
too much time on writing your addition.)
|
|
|
|
* If you want to draw your new text to the attention of the
|
|
maintainer, add 'XXX' to the beginning of the paragraph or
|
|
section.
|
|
|
|
* It's OK to just add a fragmentary note about a change. For
|
|
example: "XXX Describe the transmogrify() function added to the
|
|
socket module." The maintainer will research the change and
|
|
write the necessary text.
|
|
|
|
* You can comment out your additions if you like, but it's not
|
|
necessary (especially when a final release is some months away).
|
|
|
|
* Credit the author of a patch or bugfix. Just the name is
|
|
sufficient; the e-mail address isn't necessary.
|
|
|
|
* It's helpful to add the bug/patch number as a comment:
|
|
|
|
XXX Describe the transmogrify() function added to the socket
|
|
module.
|
|
(Contributed by P.Y. Developer in :issue:`12345`.)
|
|
|
|
This saves the maintainer the effort of going through the Mercurial log
|
|
when researching a change.
|
|
|
|
This article explains the new features in Python 3.11, compared to 3.10.
|
|
|
|
For full details, see the :ref:`changelog <changelog>`.
|
|
|
|
.. note::
|
|
|
|
Prerelease users should be aware that this document is currently in draft
|
|
form. It will be updated substantially as Python 3.11 moves towards release,
|
|
so it's worth checking back even after reading earlier versions.
|
|
|
|
|
|
Summary -- Release highlights
|
|
=============================
|
|
|
|
.. This section singles out the most important changes in Python 3.11.
|
|
Brevity is key.
|
|
|
|
|
|
.. PEP-sized items next.
|
|
|
|
PEP-654: Exception Groups and ``except*``.
|
|
(Contributed by Irit Katriel in :issue:`45292`.)
|
|
PEP-673: ``Self`` Type.
|
|
(Contributed by James Hilton-Balfe and Pradeep Kumar in :issue:`30924`.)
|
|
|
|
New Features
|
|
============
|
|
|
|
.. _whatsnew311-pep657:
|
|
|
|
Enhanced error locations in tracebacks
|
|
--------------------------------------
|
|
|
|
When printing tracebacks, the interpreter will now point to the exact expression
|
|
that caused the error instead of just the line. For example:
|
|
|
|
.. code-block:: python
|
|
|
|
Traceback (most recent call last):
|
|
File "distance.py", line 11, in <module>
|
|
print(manhattan_distance(p1, p2))
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
File "distance.py", line 6, in manhattan_distance
|
|
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
|
|
^^^^^^^^^
|
|
AttributeError: 'NoneType' object has no attribute 'x'
|
|
|
|
Previous versions of the interpreter would point to just the line making it
|
|
ambiguous which object was ``None``. These enhanced errors can also be helpful
|
|
when dealing with deeply nested dictionary objects and multiple function calls,
|
|
|
|
.. code-block:: python
|
|
|
|
Traceback (most recent call last):
|
|
File "query.py", line 37, in <module>
|
|
magic_arithmetic('foo')
|
|
^^^^^^^^^^^^^^^^^^^^^^^
|
|
File "query.py", line 18, in magic_arithmetic
|
|
return add_counts(x) / 25
|
|
^^^^^^^^^^^^^
|
|
File "query.py", line 24, in add_counts
|
|
return 25 + query_user(user1) + query_user(user2)
|
|
^^^^^^^^^^^^^^^^^
|
|
File "query.py", line 32, in query_user
|
|
return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
|
|
~~~~~~~~~~~~~~~~~~^^^^^
|
|
TypeError: 'NoneType' object is not subscriptable
|
|
|
|
as well as complex arithmetic expressions:
|
|
|
|
.. code-block:: python
|
|
|
|
Traceback (most recent call last):
|
|
File "calculation.py", line 54, in <module>
|
|
result = (x / y / z) * (a / b / c)
|
|
~~~~~~^~~
|
|
ZeroDivisionError: division by zero
|
|
|
|
See :pep:`657` for more details. (Contributed by Pablo Galindo, Batuhan Taskaya
|
|
and Ammar Askar in :issue:`43950`.)
|
|
|
|
.. note::
|
|
This feature requires storing column positions in code objects which may
|
|
result in a small increase of disk usage of compiled Python files or
|
|
interpreter memory usage. To avoid storing the extra information and/or
|
|
deactivate printing the extra traceback information, the
|
|
:option:`-X` ``no_debug_ranges`` command line flag or the :envvar:`PYTHONNODEBUGRANGES`
|
|
environment variable can be used.
|
|
|
|
Column information for code objects
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The information used by the enhanced traceback feature is made available as a
|
|
general API that can be used to correlate bytecode instructions with source
|
|
code. This information can be retrieved using:
|
|
|
|
- The :meth:`codeobject.co_positions` method in Python.
|
|
- The :c:func:`PyCode_Addr2Location` function in the C-API.
|
|
|
|
The :option:`-X` ``no_debug_ranges`` option and the environment variable
|
|
:envvar:`PYTHONNODEBUGRANGES` can be used to disable this feature.
|
|
|
|
See :pep:`657` for more details. (Contributed by Pablo Galindo, Batuhan Taskaya
|
|
and Ammar Askar in :issue:`43950`.)
|
|
|
|
Exceptions can be enriched with a string ``__note__``
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The ``__note__`` field was added to :exc:`BaseException`. It is ``None``
|
|
by default but can be set to a string which is added to the exception's
|
|
traceback. (Contributed by Irit Katriel in :issue:`45607`.)
|
|
|
|
Other Language Changes
|
|
======================
|
|
|
|
* Asynchronous comprehensions are now allowed inside comprehensions in
|
|
asynchronous functions. Outer comprehensions implicitly become
|
|
asynchronous. (Contributed by Serhiy Storchaka in :issue:`33346`.)
|
|
|
|
* A :exc:`TypeError` is now raised instead of an :exc:`AttributeError` in
|
|
:meth:`contextlib.ExitStack.enter_context` and
|
|
:meth:`contextlib.AsyncExitStack.enter_async_context` for objects which do not
|
|
support the :term:`context manager` or :term:`asynchronous context manager`
|
|
protocols correspondingly.
|
|
(Contributed by Serhiy Storchaka in :issue:`44471`.)
|
|
|
|
* A :exc:`TypeError` is now raised instead of an :exc:`AttributeError` in
|
|
:keyword:`with` and :keyword:`async with` statements for objects which do not
|
|
support the :term:`context manager` or :term:`asynchronous context manager`
|
|
protocols correspondingly.
|
|
(Contributed by Serhiy Storchaka in :issue:`12022`.)
|
|
|
|
|
|
Other CPython Implementation Changes
|
|
====================================
|
|
|
|
* Special methods :meth:`complex.__complex__` and :meth:`bytes.__bytes__` are implemented to
|
|
support :class:`typing.SupportsComplex` and :class:`typing.SupportsBytes` protocols.
|
|
(Contributed by Mark Dickinson and Dong-hee Na in :issue:`24234`.)
|
|
|
|
* ``siphash13`` is added as a new internal hashing algorithms. It's has similar security
|
|
properties as ``siphash24`` but it is slightly faster for long inputs. ``str``, ``bytes``,
|
|
and some other types now use it as default algorithm for ``hash()``. :pep:`552`
|
|
hash-based pyc files now use ``siphash13``, too.
|
|
(Contributed by Inada Naoki in :issue:`29410`.)
|
|
|
|
* When an active exception is re-raised by a :keyword:`raise` statement with no parameters,
|
|
the traceback attached to this exception is now always ``sys.exc_info()[1].__traceback__``.
|
|
This means that changes made to the traceback in the current :keyword:`except` clause are
|
|
reflected in the re-raised exception.
|
|
(Contributed by Irit Katriel in :issue:`45711`.)
|
|
|
|
* The interpreter state's representation of handled exceptions (a.k.a exc_info, or
|
|
_PyErr_StackItem) now has only the ``exc_value`` field, ``exc_type`` and ``exc_traceback``
|
|
have been removed as their values can be derived from ``exc_value``.
|
|
(Contributed by Irit Katriel in :issue:`45711`.)
|
|
|
|
* A new command line option for the Windows installer ``AppendPath`` has beend added.
|
|
It behaves similiar to ``PrependPath`` but appends the install and scripts directories
|
|
instead of prepending it.
|
|
(Contributed by Bastian Neuburger in :issue:`44934`.)
|
|
|
|
|
|
New Modules
|
|
===========
|
|
|
|
* None yet.
|
|
|
|
|
|
Improved Modules
|
|
================
|
|
|
|
fractions
|
|
---------
|
|
|
|
* Support :PEP:`515`-style initialization of :class:`~fractions.Fraction` from
|
|
string. (Contributed by Sergey B Kirpichev in :issue:`44258`.)
|
|
|
|
* :class:`~fractions.Fraction` now implements an ``__int__`` method, so
|
|
that an ``isinstance(some_fraction, typing.SupportsInt)`` check passes.
|
|
(Contributed by Mark Dickinson in :issue:`44547`.)
|
|
|
|
|
|
IDLE and idlelib
|
|
----------------
|
|
|
|
* Apply syntax highlighting to `.pyi` files. (Contributed by Alex
|
|
Waygood and Terry Jan Reedy in :issue:`45447`.)
|
|
|
|
inspect
|
|
-------
|
|
* Add :func:`inspect.getmembers_static`: return all members without
|
|
triggering dynamic lookup via the descriptor protocol. (Contributed by
|
|
Weipeng Hong in :issue:`30533`.)
|
|
|
|
|
|
math
|
|
----
|
|
* Add :func:`math.exp2`: return 2 raised to the power of x.
|
|
(Contributed by Gideon Mitchell in :issue:`45917`.)
|
|
|
|
* Add :func:`math.cbrt`: return the cube root of x.
|
|
(Contributed by Ajith Ramachandran in :issue:`44357`.)
|
|
|
|
* The behaviour of two :func:`math.pow` corner cases was changed, for
|
|
consistency with the IEEE 754 specification. The operations
|
|
``math.pow(0.0, -math.inf)`` and ``math.pow(-0.0, -math.inf)`` now return
|
|
``inf``. Previously they raised :exc:`ValueError`. (Contributed by Mark
|
|
Dickinson in :issue:`44339`.)
|
|
|
|
|
|
operator
|
|
--------
|
|
|
|
* A new function ``operator.call`` has been added, such that
|
|
``operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)``.
|
|
(Contributed by Antony Lee in :issue:`44019`.)
|
|
|
|
|
|
os
|
|
--
|
|
|
|
* On Windows, :func:`os.urandom` now uses ``BCryptGenRandom()``,
|
|
instead of ``CryptGenRandom()`` which is deprecated.
|
|
(Contributed by Dong-hee Na in :issue:`44611`.)
|
|
|
|
|
|
socket
|
|
------
|
|
|
|
* Add CAN Socket support for NetBSD.
|
|
(Contributed by Thomas Klausner in :issue:`30512`.)
|
|
|
|
|
|
sqlite3
|
|
-------
|
|
|
|
* You can now disable the authorizer by passing :const:`None` to
|
|
:meth:`~sqlite3.Connection.set_authorizer`.
|
|
(Contributed by Erlend E. Aasland in :issue:`44491`.)
|
|
|
|
* Collation name :meth:`~sqlite3.Connection.create_collation` can now
|
|
contain any Unicode character. Collation names with invalid characters
|
|
now raise :exc:`UnicodeEncodeError` instead of :exc:`sqlite3.ProgrammingError`.
|
|
(Contributed by Erlend E. Aasland in :issue:`44688`.)
|
|
|
|
* :mod:`sqlite3` exceptions now include the SQLite extended error code as
|
|
:attr:`~sqlite3.Error.sqlite_errorcode` and the SQLite error name as
|
|
:attr:`~sqlite3.Error.sqlite_errorname`.
|
|
(Contributed by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland in
|
|
:issue:`16379` and :issue:`24139`.)
|
|
|
|
* Add :meth:`~sqlite3.Connection.setlimit` and
|
|
:meth:`~sqlite3.Connection.getlimit` to :class:`sqlite3.Connection` for
|
|
setting and getting SQLite limits by connection basis.
|
|
(Contributed by Erlend E. Aasland in :issue:`45243`.)
|
|
|
|
* :mod:`sqlite3` now sets :attr:`sqlite3.threadsafety` based on the default
|
|
threading mode the underlying SQLite library has been compiled with.
|
|
(Contributed by Erlend E. Aasland in :issue:`45613`.)
|
|
|
|
* :mod:`sqlite3` C callbacks now use unraisable exceptions if callback
|
|
tracebacks are enabled. Users can now register an
|
|
:func:`unraisable hook handler <sys.unraisablehook>` to improve their debug
|
|
experience.
|
|
(Contributed by Erlend E. Aasland in :issue:`45828`.)
|
|
|
|
* Fetch across rollback no longer raises :exc:`~sqlite3.InterfaceError`.
|
|
Instead we leave it to the SQLite library to handle these cases.
|
|
(Contributed by Erlend E. Aasland in :issue:`44092`.)
|
|
|
|
|
|
sys
|
|
---
|
|
|
|
* :func:`sys.exc_info` now derives the ``type`` and ``traceback`` fields
|
|
from the ``value`` (the exception instance), so when an exception is
|
|
modified while it is being handled, the changes are reflected in
|
|
the results of subsequent calls to :func:`exc_info`.
|
|
(Contributed by Irit Katriel in :issue:`45711`.)
|
|
|
|
* Add :func:`sys.exception` which returns the active exception instance
|
|
(equivalent to ``sys.exc_info()[1]``).
|
|
(Contributed by Irit Katriel in :issue:`46328`.)
|
|
|
|
threading
|
|
---------
|
|
|
|
* On Unix, if the ``sem_clockwait()`` function is available in the C library
|
|
(glibc 2.30 and newer), the :meth:`threading.Lock.acquire` method now uses
|
|
the monotonic clock (:data:`time.CLOCK_MONOTONIC`) for the timeout, rather
|
|
than using the system clock (:data:`time.CLOCK_REALTIME`), to not be affected
|
|
by system clock changes.
|
|
(Contributed by Victor Stinner in :issue:`41710`.)
|
|
|
|
|
|
time
|
|
----
|
|
|
|
* On Unix, :func:`time.sleep` now uses the ``clock_nanosleep()`` or
|
|
``nanosleep()`` function, if available, which has a resolution of 1 nanosecond
|
|
(10\ :sup:`-9` seconds), rather than using ``select()`` which has a resolution
|
|
of 1 microsecond (10\ :sup:`-6` seconds).
|
|
(Contributed by Benjamin Szőke and Victor Stinner in :issue:`21302`.)
|
|
|
|
* On Windows 8.1 and newer, :func:`time.sleep` now uses a waitable timer based
|
|
on `high-resolution timers
|
|
<https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/high-resolution-timers>`_
|
|
which has a resolution of 100 nanoseconds (10\ :sup:`-7` seconds). Previously,
|
|
it had a resolution of 1 millisecond (10\ :sup:`-3` seconds).
|
|
(Contributed by Benjamin Szőke, Dong-hee Na, Eryk Sun and Victor Stinner in :issue:`21302` and :issue:`45429`.)
|
|
|
|
|
|
unicodedata
|
|
-----------
|
|
|
|
* The Unicode database has been updated to version 14.0.0. (:issue:`45190`).
|
|
|
|
|
|
fcntl
|
|
-----
|
|
|
|
* On FreeBSD, the :attr:`F_DUP2FD` and :attr:`F_DUP2FD_CLOEXEC` flags respectively
|
|
are supported, the former equals to ``dup2`` usage while the latter set
|
|
the ``FD_CLOEXEC`` flag in addition.
|
|
|
|
|
|
Optimizations
|
|
=============
|
|
|
|
* Compiler now optimizes simple C-style formatting with literal format
|
|
containing only format codes ``%s``, ``%r`` and ``%a`` and makes it as
|
|
fast as corresponding f-string expression.
|
|
(Contributed by Serhiy Storchaka in :issue:`28307`.)
|
|
|
|
* "Zero-cost" exceptions are implemented. The cost of ``try`` statements is
|
|
almost eliminated when no exception is raised.
|
|
(Contributed by Mark Shannon in :issue:`40222`.)
|
|
|
|
* Method calls with keywords are now faster due to bytecode
|
|
changes which avoid creating bound method instances. Previously, this
|
|
optimization was applied only to method calls with purely positional
|
|
arguments.
|
|
(Contributed by Ken Jin and Mark Shannon in :issue:`26110`, based on ideas
|
|
implemented in PyPy.)
|
|
|
|
* Pure ASCII strings are now normalized in constant time by :func:`unicodedata.normalize`.
|
|
(Contributed by Dong-hee Na in :issue:`44987`.)
|
|
|
|
* :mod:`math` functions :func:`~math.comb` and :func:`~math.perm` are now up
|
|
to 10 times or more faster for large arguments (the speed up is larger for
|
|
larger *k*).
|
|
(Contributed by Serhiy Storchaka in :issue:`37295`.)
|
|
|
|
|
|
CPython bytecode changes
|
|
========================
|
|
|
|
* Replaced all numeric ``BINARY_*`` and ``INPLACE_*`` instructions with a single
|
|
:opcode:`BINARY_OP` implementation.
|
|
|
|
* Replaced the three call instructions: :opcode:`CALL_FUNCTION`,
|
|
:opcode:`CALL_FUNCTION_KW` and :opcode:`CALL_METHOD` with
|
|
:opcode:`PRECALL_FUNCTION`, :opcode:`PRECALL_METHOD`, :opcode:`CALL`,
|
|
and :opcode:`KW_NAMES`.
|
|
This decouples the argument shifting for methods from the handling of
|
|
keyword arguments and allows better specialization of calls.
|
|
|
|
* Removed ``COPY_DICT_WITHOUT_KEYS`` and ``GEN_START``.
|
|
|
|
* :opcode:`MATCH_CLASS` and :opcode:`MATCH_KEYS` no longer push an additional
|
|
boolean value indicating whether the match succeeded or failed. Instead, they
|
|
indicate failure with :const:`None` (where a tuple of extracted values would
|
|
otherwise be).
|
|
|
|
* Replace several stack manipulation instructions (``DUP_TOP``, ``DUP_TOP_TWO``,
|
|
``ROT_TWO``, ``ROT_THREE``, ``ROT_FOUR``, and ``ROT_N``) with new
|
|
:opcode:`COPY` and :opcode:`SWAP` instructions.
|
|
|
|
* Add :opcode:`POP_JUMP_IF_NOT_NONE` and :opcode:`POP_JUMP_IF_NONE` opcodes to
|
|
speed up conditional jumps.
|
|
|
|
* :opcode:`JUMP_IF_NOT_EXC_MATCH` no longer pops the active exception.
|
|
|
|
|
|
Deprecated
|
|
==========
|
|
|
|
* The :mod:`lib2to3` package and ``2to3`` tool are now deprecated and may not
|
|
be able to parse Python 3.10 or newer. See the :pep:`617` (New PEG parser for
|
|
CPython). (Contributed by Victor Stinner in :issue:`40360`.)
|
|
|
|
* :class:`webbrowser.MacOSX` is deprecated and will be removed in Python 3.13.
|
|
It is untested and undocumented and also not used by webbrowser itself.
|
|
(Contributed by Dong-hee Na in :issue:`42255`.)
|
|
|
|
* The behavior of returning a value from a :class:`~unittest.TestCase` and
|
|
:class:`~unittest.IsolatedAsyncioTestCase` test methods (other than the
|
|
default ``None`` value), is now deprecated.
|
|
|
|
* Deprecated the following :mod:`unittest` functions, scheduled for removal in
|
|
Python 3.13:
|
|
|
|
* :func:`unittest.findTestCases`
|
|
* :func:`unittest.makeSuite`
|
|
* :func:`unittest.getTestCaseNames`
|
|
|
|
Use :class:`~unittest.TestLoader` method instead:
|
|
|
|
* :meth:`unittest.TestLoader.loadTestsFromModule`
|
|
* :meth:`unittest.TestLoader.loadTestsFromTestCase`
|
|
* :meth:`unittest.TestLoader.getTestCaseNames`
|
|
|
|
(Contributed by Erlend E. Aasland in :issue:`5846`.)
|
|
|
|
* The :meth:`turtle.RawTurtle.settiltangle` is deprecated since Python 3.1,
|
|
it now emits a deprecation warning and will be removed in Python 3.13. Use
|
|
:meth:`turtle.RawTurtle.tiltangle` instead (it was earlier incorrectly marked
|
|
as deprecated, its docstring is now corrected).
|
|
(Contributed by Hugo van Kemenade in :issue:`45837`.)
|
|
|
|
* The delegation of :func:`int` to :meth:`__trunc__` is now deprecated. Calling
|
|
``int(a)`` when ``type(a)`` implements :meth:`__trunc__` but not
|
|
:meth:`__int__` or :meth:`__index__` now raises a :exc:`DeprecationWarning`.
|
|
(Contributed by Zackery Spytz in :issue:`44977`.)
|
|
|
|
* The following have been deprecated in :mod:`configparser` since Python 3.2.
|
|
Their deprecation warnings have now been updated to note they will removed in
|
|
Python 3.12:
|
|
|
|
* the :class:`configparser.SafeConfigParser` class
|
|
* the :attr:`configparser.ParsingError.filename` property
|
|
* the :meth:`configparser.ParsingError.readfp` method
|
|
|
|
(Contributed by Hugo van Kemenade in :issue:`45173`.)
|
|
|
|
|
|
Removed
|
|
=======
|
|
|
|
* :class:`smtpd.MailmanProxy` is now removed as it is unusable without
|
|
an external module, ``mailman``. (Contributed by Dong-hee Na in :issue:`35800`.)
|
|
|
|
* The ``binhex`` module, deprecated in Python 3.9, is now removed.
|
|
The following :mod:`binascii` functions, deprecated in Python 3.9, are now
|
|
also removed:
|
|
|
|
* ``a2b_hqx()``, ``b2a_hqx()``;
|
|
* ``rlecode_hqx()``, ``rledecode_hqx()``.
|
|
|
|
The :func:`binascii.crc_hqx` function remains available.
|
|
|
|
(Contributed by Victor Stinner in :issue:`45085`.)
|
|
|
|
* The distutils ``bdist_msi`` command, deprecated in Python 3.9, is now removed.
|
|
Use ``bdist_wheel`` (wheel packages) instead.
|
|
(Contributed by Hugo van Kemenade in :issue:`45124`.)
|
|
|
|
* Due to significant security concerns, the *reuse_address* parameter of
|
|
:meth:`asyncio.loop.create_datagram_endpoint`, disabled in Python 3.9, is
|
|
now entirely removed. This is because of the behavior of the socket option
|
|
``SO_REUSEADDR`` in UDP.
|
|
(Contributed by Hugo van Kemenade in :issue:`45129`.)
|
|
|
|
* Removed :meth:`__getitem__` methods of
|
|
:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper`
|
|
and :class:`fileinput.FileInput`, deprecated since Python 3.9.
|
|
(Contributed by Hugo van Kemenade in :issue:`45132`.)
|
|
|
|
* The following deprecated functions and methods are removed in the :mod:`gettext`
|
|
module: :func:`~gettext.lgettext`, :func:`~gettext.ldgettext`,
|
|
:func:`~gettext.lngettext` and :func:`~gettext.ldngettext`.
|
|
|
|
Function :func:`~gettext.bind_textdomain_codeset`, methods
|
|
:meth:`~gettext.NullTranslations.output_charset` and
|
|
:meth:`~gettext.NullTranslations.set_output_charset`, and the *codeset*
|
|
parameter of functions :func:`~gettext.translation` and
|
|
:func:`~gettext.install` are also removed, since they are only used for
|
|
the ``l*gettext()`` functions.
|
|
(Contributed by Dong-hee Na and Serhiy Storchaka in :issue:`44235`.)
|
|
|
|
* The :func:`@asyncio.coroutine <asyncio.coroutine>` :term:`decorator` enabling
|
|
legacy generator-based coroutines to be compatible with async/await code.
|
|
The function has been deprecated since Python 3.8 and the removal was
|
|
initially scheduled for Python 3.10. Use :keyword:`async def` instead.
|
|
(Contributed by Illia Volochii in :issue:`43216`.)
|
|
|
|
* :class:`asyncio.coroutines.CoroWrapper` used for wrapping legacy
|
|
generator-based coroutine objects in the debug mode.
|
|
(Contributed by Illia Volochii in :issue:`43216`.)
|
|
|
|
* Removed the deprecated ``split()`` method of :class:`_tkinter.TkappType`.
|
|
(Contributed by Erlend E. Aasland in :issue:`38371`.)
|
|
|
|
* Removed from the :mod:`inspect` module:
|
|
|
|
* the ``getargspec`` function, deprecated since Python 3.0;
|
|
use :func:`inspect.signature` or :func:`inspect.getfullargspec` instead.
|
|
|
|
* the ``formatargspec`` function, deprecated since Python 3.5;
|
|
use the :func:`inspect.signature` function and :class:`Signature` object
|
|
directly.
|
|
|
|
* the undocumented ``Signature.from_builtin`` and ``Signature.from_function``
|
|
functions, deprecated since Python 3.5; use the
|
|
:meth:`Signature.from_callable() <inspect.Signature.from_callable>` method
|
|
instead.
|
|
|
|
(Contributed by Hugo van Kemenade in :issue:`45320`.)
|
|
|
|
* Remove namespace package support from unittest discovery. It was introduced in
|
|
Python 3.4 but has been broken since Python 3.7.
|
|
(Contributed by Inada Naoki in :issue:`23882`.)
|
|
|
|
* Remove ``__class_getitem__`` method from :class:`pathlib.PurePath`,
|
|
because it was not used and added by mistake in previous versions.
|
|
(Contributed by Nikita Sobolev in :issue:`46483`.)
|
|
|
|
Porting to Python 3.11
|
|
======================
|
|
|
|
This section lists previously described changes and other bugfixes
|
|
that may require changes to your code.
|
|
|
|
|
|
Changes in the Python API
|
|
-------------------------
|
|
|
|
* Prohibited passing non-:class:`concurrent.futures.ThreadPoolExecutor`
|
|
executors to :meth:`loop.set_default_executor` following a deprecation in
|
|
Python 3.8.
|
|
(Contributed by Illia Volochii in :issue:`43234`.)
|
|
|
|
* :func:`open`, :func:`io.open`, :func:`codecs.open` and
|
|
:class:`fileinput.FileInput` no longer accept ``'U'`` ("universal newline")
|
|
in the file mode. This flag was deprecated since Python 3.3. In Python 3, the
|
|
"universal newline" is used by default when a file is open in text mode. The
|
|
:ref:`newline parameter <open-newline-parameter>` of :func:`open` controls
|
|
how universal newlines works.
|
|
(Contributed by Victor Stinner in :issue:`37330`.)
|
|
|
|
* The :mod:`pdb` module now reads the :file:`.pdbrc` configuration file with
|
|
the ``'utf-8'`` encoding.
|
|
(Contributed by Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) in :issue:`41137`.)
|
|
|
|
* When sorting using tuples as keys, the order of the result may differ
|
|
from earlier releases if the tuple elements don't define a total
|
|
ordering (see :ref:`expressions-value-comparisons` for
|
|
information on total ordering). It's generally true that the result
|
|
of sorting simply isn't well-defined in the absence of a total ordering
|
|
on list elements.
|
|
|
|
* :mod:`calendar`: The :class:`calendar.LocaleTextCalendar` and
|
|
:class:`calendar.LocaleHTMLCalendar` classes now use
|
|
:func:`locale.getlocale`, instead of using :func:`locale.getdefaultlocale`,
|
|
if no locale is specified.
|
|
(Contributed by Victor Stinner in :issue:`46659`.)
|
|
|
|
|
|
Build Changes
|
|
=============
|
|
|
|
* CPython can now be built with the ThinLTO option via ``--with-lto=thin``.
|
|
(Contributed by Dong-hee Na and Brett Holman in :issue:`44340`.)
|
|
|
|
* libpython is no longer linked against libcrypt.
|
|
(Contributed by Mike Gilbert in :issue:`45433`.)
|
|
|
|
* Building Python now requires a C99 ``<math.h>`` header file providing
|
|
the following functions: ``copysign()``, ``hypot()``, ``isfinite()``,
|
|
``isinf()``, ``isnan()``, ``round()``.
|
|
(Contributed by Victor Stinner in :issue:`45440`.)
|
|
|
|
* Building Python now requires a C99 ``<math.h>`` header file providing
|
|
a ``NAN`` constant, or the ``__builtin_nan()`` built-in function. If a
|
|
platform does not support Not-a-Number (NaN), the ``Py_NO_NAN`` macro can be
|
|
defined in the ``pyconfig.h`` file.
|
|
(Contributed by Victor Stinner in :issue:`46640`.)
|
|
|
|
* Freelists for object structs can now be disabled. A new :program:`configure`
|
|
option :option:`!--without-freelists` can be used to disable all freelists
|
|
except empty tuple singleton.
|
|
(Contributed by Christian Heimes in :issue:`45522`)
|
|
|
|
* ``Modules/Setup`` and ``Modules/makesetup`` have been improved and tied up.
|
|
Extension modules can now be built through ``makesetup``. All except some
|
|
test modules can be linked statically into main binary or library.
|
|
(Contributed by Brett Cannon and Christian Heimes in :issue:`45548`,
|
|
:issue:`45570`, :issue:`45571`, and :issue:`43974`.)
|
|
|
|
* Build dependencies, compiler flags, and linker flags for most stdlib
|
|
extension modules are now detected by :program:`configure`. libffi, libnsl,
|
|
libsqlite3, zlib, bzip2, liblzma, libcrypt, and uuid flags are detected by
|
|
``pkg-config`` (when available).
|
|
(Contributed by Christian Heimes and Erlend Egeberg Aasland in
|
|
:issue:`bpo-45847`, :issue:`45747`, and :issue:`45763`.)
|
|
|
|
* CPython now has experimental support for cross compiling to WebAssembly
|
|
platform ``wasm32-emscripten``. The effort is inspired by previous work
|
|
like Pyodide.
|
|
(Contributed by Christian Heimes and Ethan Smith in :issue:`40280`.)
|
|
|
|
* CPython will now use 30-bit digits by default for the Python :class:`int`
|
|
implementation. Previously, the default was to use 30-bit digits on platforms
|
|
with ``SIZEOF_VOID_P >= 8``, and 15-bit digits otherwise. It's still possible
|
|
to explicitly request use of 15-bit digits via either the
|
|
``--enable-big-digits`` option to the configure script or (for Windows) the
|
|
``PYLONG_BITS_IN_DIGIT`` variable in ``PC/pyconfig.h``, but this option may
|
|
be removed at some point in the future. (Contributed by Mark Dickinson in
|
|
:issue:`45569`.)
|
|
|
|
|
|
C API Changes
|
|
=============
|
|
|
|
* :c:func:`PyErr_SetExcInfo()` no longer uses the ``type`` and ``traceback``
|
|
arguments, the interpreter now derives those values from the exception
|
|
instance (the ``value`` argument). The function still steals references
|
|
of all three arguments.
|
|
(Contributed by Irit Katriel in :issue:`45711`.)
|
|
|
|
* :c:func:`PyErr_GetExcInfo()` now derives the ``type`` and ``traceback``
|
|
fields of the result from the exception instance (the ``value`` field).
|
|
(Contributed by Irit Katriel in :issue:`45711`.)
|
|
|
|
* :c:struct:`_frozen` has a new ``is_package`` field to indicate whether
|
|
or not the frozen module is a package. Previously, a negative value
|
|
in the ``size`` field was the indicator. Now only non-negative values
|
|
be used for ``size``.
|
|
(Contributed by Kumar Aditya in :issue:`46608`.)
|
|
|
|
New Features
|
|
------------
|
|
|
|
* Add a new :c:func:`PyType_GetName` function to get type's short name.
|
|
(Contributed by Hai Shi in :issue:`42035`.)
|
|
|
|
* Add a new :c:func:`PyType_GetQualName` function to get type's qualified name.
|
|
(Contributed by Hai Shi in :issue:`42035`.)
|
|
|
|
* Add new :c:func:`PyThreadState_EnterTracing` and
|
|
:c:func:`PyThreadState_LeaveTracing` functions to the limited C API to
|
|
suspend and resume tracing and profiling.
|
|
(Contributed by Victor Stinner in :issue:`43760`.)
|
|
|
|
* Added the :c:data:`Py_Version` constant which bears the same value as
|
|
:c:macro:`PY_VERSION_HEX`.
|
|
(Contributed by Gabriele N. Tornetta in :issue:`43931`.)
|
|
|
|
* :c:type:`Py_buffer` and APIs are now part of the limited API and the stable
|
|
ABI:
|
|
|
|
* :c:func:`PyObject_CheckBuffer`
|
|
* :c:func:`PyObject_GetBuffer`
|
|
* :c:func:`PyBuffer_GetPointer`
|
|
* :c:func:`PyBuffer_SizeFromFormat`
|
|
* :c:func:`PyBuffer_ToContiguous`
|
|
* :c:func:`PyBuffer_FromContiguous`
|
|
* :c:func:`PyBuffer_CopyData`
|
|
* :c:func:`PyBuffer_IsContiguous`
|
|
* :c:func:`PyBuffer_FillContiguousStrides`
|
|
* :c:func:`PyBuffer_FillInfo`
|
|
* :c:func:`PyBuffer_Release`
|
|
* :c:func:`PyMemoryView_FromBuffer`
|
|
* :c:member:`~PyBufferProcs.bf_getbuffer` and
|
|
:c:member:`~PyBufferProcs.bf_releasebuffer` type slots
|
|
|
|
(Contributed by Christian Heimes in :issue:`45459`.)
|
|
|
|
* Added the :c:data:`PyType_GetModuleByDef` function, used to get the module
|
|
in which a method was defined, in cases where this information is not
|
|
available directly (via :c:type:`PyCMethod`).
|
|
(Contributed by Petr Viktorin in :issue:`46613`.)
|
|
|
|
|
|
Porting to Python 3.11
|
|
----------------------
|
|
|
|
* The old trashcan macros (``Py_TRASHCAN_SAFE_BEGIN``/``Py_TRASHCAN_SAFE_END``)
|
|
are now deprecated. They should be replaced by the new macros
|
|
``Py_TRASHCAN_BEGIN`` and ``Py_TRASHCAN_END``.
|
|
|
|
A tp_dealloc function that has the old macros, such as::
|
|
|
|
static void
|
|
mytype_dealloc(mytype *p)
|
|
{
|
|
PyObject_GC_UnTrack(p);
|
|
Py_TRASHCAN_SAFE_BEGIN(p);
|
|
...
|
|
Py_TRASHCAN_SAFE_END
|
|
}
|
|
|
|
should migrate to the new macros as follows::
|
|
|
|
static void
|
|
mytype_dealloc(mytype *p)
|
|
{
|
|
PyObject_GC_UnTrack(p);
|
|
Py_TRASHCAN_BEGIN(p, mytype_dealloc)
|
|
...
|
|
Py_TRASHCAN_END
|
|
}
|
|
|
|
Note that ``Py_TRASHCAN_BEGIN`` has a second argument which
|
|
should be the deallocation function it is in.
|
|
|
|
To support older Python versions in the same codebase, you
|
|
can define the following macros and use them throughout
|
|
the code (credit: these were copied from the ``mypy`` codebase)::
|
|
|
|
#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 8
|
|
# define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
|
|
# define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
|
|
#else
|
|
# define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
|
|
# define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
|
|
#endif
|
|
|
|
* The :c:func:`PyType_Ready` function now raises an error if a type is defined
|
|
with the :const:`Py_TPFLAGS_HAVE_GC` flag set but has no traverse function
|
|
(:c:member:`PyTypeObject.tp_traverse`).
|
|
(Contributed by Victor Stinner in :issue:`44263`.)
|
|
|
|
* Heap types with the :const:`Py_TPFLAGS_IMMUTABLETYPE` flag can now inherit
|
|
the :pep:`590` vectorcall protocol. Previously, this was only possible for
|
|
:ref:`static types <static-types>`.
|
|
(Contributed by Erlend E. Aasland in :issue:`43908`)
|
|
|
|
* Since :c:func:`Py_TYPE()` is changed to a inline static function,
|
|
``Py_TYPE(obj) = new_type`` must be replaced with
|
|
``Py_SET_TYPE(obj, new_type)``: see the :c:func:`Py_SET_TYPE()` function
|
|
(available since Python 3.9). For backward compatibility, this macro can be
|
|
used::
|
|
|
|
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
|
|
static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
|
|
{ ob->ob_type = type; }
|
|
#define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
|
|
#endif
|
|
|
|
(Contributed by Victor Stinner in :issue:`39573`.)
|
|
|
|
* Since :c:func:`Py_SIZE()` is changed to a inline static function,
|
|
``Py_SIZE(obj) = new_size`` must be replaced with
|
|
``Py_SET_SIZE(obj, new_size)``: see the :c:func:`Py_SET_SIZE()` function
|
|
(available since Python 3.9). For backward compatibility, this macro can be
|
|
used::
|
|
|
|
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
|
|
static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
|
|
{ ob->ob_size = size; }
|
|
#define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
|
|
#endif
|
|
|
|
(Contributed by Victor Stinner in :issue:`39573`.)
|
|
|
|
* ``<Python.h>`` no longer includes the header files ``<stdlib.h>``,
|
|
``<stdio.h>``, ``<errno.h>`` and ``<string.h>`` when the ``Py_LIMITED_API``
|
|
macro is set to ``0x030b0000`` (Python 3.11) or higher. C extensions should
|
|
explicitly include the header files after ``#include <Python.h>``.
|
|
(Contributed by Victor Stinner in :issue:`45434`.)
|
|
|
|
* The non-limited API files ``cellobject.h``, ``classobject.h``, ``context.h``,
|
|
``funcobject.h``, ``genobject.h`` and ``longintrepr.h`` have been moved to
|
|
the ``Include/cpython`` directory. Moreover, the ``eval.h`` header file was
|
|
removed. These files must not be included directly, as they are already
|
|
included in ``Python.h``: :ref:`Include Files <api-includes>`. If they have
|
|
been included directly, consider including ``Python.h`` instead.
|
|
(Contributed by Victor Stinner in :issue:`35134`.)
|
|
|
|
* The :c:func:`PyUnicode_CHECK_INTERNED` macro has been excluded from the
|
|
limited C API. It was never usable there, because it used internal structures
|
|
which are not available in the limited C API.
|
|
(Contributed by Victor Stinner in :issue:`46007`.)
|
|
|
|
* Changes of the private :c:type:`PyFrameObject` structure members.
|
|
|
|
While the documentation notes that the fields of ``PyFrameObject`` are
|
|
subject to change at any time, they have been stable for a long time
|
|
and were used in several popular extensions.
|
|
In Python 3.11, the frame struct was reorganized to allow performance
|
|
optimizations. Rather than reading the fields directly, extensions should
|
|
use functions:
|
|
|
|
* ``f_code``: removed, use :c:func:`PyFrame_GetCode` instead.
|
|
Warning: the function returns a :term:`strong reference`, need to call
|
|
:c:func:`Py_DECREF`.
|
|
* ``f_back``: changed (see below), use :c:func:`PyFrame_GetBack`.
|
|
* ``f_builtins``: removed,
|
|
use ``PyObject_GetAttrString((PyObject*)frame, "f_builtins")``.
|
|
* ``f_globals``: removed,
|
|
use ``PyObject_GetAttrString((PyObject*)frame, "f_globals")``.
|
|
* ``f_locals``: removed,
|
|
use ``PyObject_GetAttrString((PyObject*)frame, "f_locals")``.
|
|
* ``f_lasti``: removed,
|
|
use ``PyObject_GetAttrString((PyObject*)frame, "f_lasti")``.
|
|
|
|
The following fields were removed entirely, as they were details
|
|
of the old implementation:
|
|
|
|
* ``f_valuesstack``
|
|
* ``f_stackdepth``
|
|
* ``f_gen``
|
|
* ``f_iblock``
|
|
* ``f_state``
|
|
* ``f_blockstack``
|
|
* ``f_localsplus``
|
|
|
|
The Python frame object is now created lazily. A side effect is that the
|
|
``f_back`` member must not be accessed directly, since its value is now also
|
|
computed lazily. The :c:func:`PyFrame_GetBack` function must be called
|
|
instead.
|
|
|
|
Code defining ``PyFrame_GetCode()`` on Python 3.8 and older::
|
|
|
|
#if PY_VERSION_HEX < 0x030900B1
|
|
static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
|
|
{
|
|
Py_INCREF(frame->f_code);
|
|
return frame->f_code;
|
|
}
|
|
#endif
|
|
|
|
Code defining ``PyFrame_GetBack()`` on Python 3.8 and older::
|
|
|
|
#if PY_VERSION_HEX < 0x030900B1
|
|
static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
|
|
{
|
|
Py_XINCREF(frame->f_back);
|
|
return frame->f_back;
|
|
}
|
|
#endif
|
|
|
|
Or use `the pythoncapi_compat project
|
|
<https://github.com/pythoncapi/pythoncapi_compat>`__ to get these APIs
|
|
on older Python versions.
|
|
|
|
* Changes of the :c:type:`PyThreadState` structure members:
|
|
|
|
* ``frame``: removed, use :c:func:`PyThreadState_GetFrame` (function added
|
|
to Python 3.9 by :issue:`40429`).
|
|
Warning: the function returns a :term:`strong reference`, need to call
|
|
:c:func:`Py_XDECREF`.
|
|
* ``tracing``: changed, use :c:func:`PyThreadState_EnterTracing`
|
|
and :c:func:`PyThreadState_LeaveTracing`
|
|
(functions added to Python 3.11 by :issue:`43760`).
|
|
* ``recursion_depth``: removed,
|
|
use ``(tstate->recursion_limit - tstate->recursion_remaining)`` instead.
|
|
* ``stackcheck_counter``: removed.
|
|
|
|
Code defining ``PyThreadState_GetFrame()`` on Python 3.8 and older::
|
|
|
|
#if PY_VERSION_HEX < 0x030900B1
|
|
static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
|
|
{
|
|
Py_XINCREF(tstate->frame);
|
|
return tstate->frame;
|
|
}
|
|
#endif
|
|
|
|
Code defining ``PyThreadState_EnterTracing()`` and
|
|
``PyThreadState_LeaveTracing()`` on Python 3.10 and older::
|
|
|
|
#if PY_VERSION_HEX < 0x030B00A2
|
|
static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
|
|
{
|
|
tstate->tracing++;
|
|
#if PY_VERSION_HEX >= 0x030A00A1
|
|
tstate->cframe->use_tracing = 0;
|
|
#else
|
|
tstate->use_tracing = 0;
|
|
#endif
|
|
}
|
|
|
|
static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
|
|
{
|
|
int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
|
|
tstate->tracing--;
|
|
#if PY_VERSION_HEX >= 0x030A00A1
|
|
tstate->cframe->use_tracing = use_tracing;
|
|
#else
|
|
tstate->use_tracing = use_tracing;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
Or use `the pythoncapi_compat project
|
|
<https://github.com/pythoncapi/pythoncapi_compat>`__ to get these functions
|
|
on old Python functions.
|
|
|
|
|
|
Deprecated
|
|
----------
|
|
|
|
* Deprecate the following functions to configure the Python initialization:
|
|
|
|
* :c:func:`PySys_AddWarnOptionUnicode`
|
|
* :c:func:`PySys_AddWarnOption`
|
|
* :c:func:`PySys_AddXOption`
|
|
* :c:func:`PySys_HasWarnOptions`
|
|
* :c:func:`Py_SetPath`
|
|
* :c:func:`Py_SetProgramName`
|
|
* :c:func:`Py_SetPythonHome`
|
|
* :c:func:`Py_SetStandardStreamEncoding`
|
|
* :c:func:`_Py_SetProgramFullPath`
|
|
|
|
Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization Configuration
|
|
<init-config>` instead (:pep:`587`).
|
|
(Contributed by Victor Stinner in :issue:`44113`.)
|
|
|
|
Removed
|
|
-------
|
|
|
|
* :c:func:`PyFrame_BlockSetup` and :c:func:`PyFrame_BlockPop` have been
|
|
removed.
|
|
(Contributed by Mark Shannon in :issue:`40222`.)
|
|
|
|
* Remove the following math macros using the ``errno`` variable:
|
|
|
|
* ``Py_ADJUST_ERANGE1()``
|
|
* ``Py_ADJUST_ERANGE2()``
|
|
* ``Py_OVERFLOWED()``
|
|
* ``Py_SET_ERANGE_IF_OVERFLOW()``
|
|
* ``Py_SET_ERRNO_ON_MATH_ERROR()``
|
|
|
|
(Contributed by Victor Stinner in :issue:`45412`.)
|
|
|
|
* Remove ``Py_UNICODE_COPY()`` and ``Py_UNICODE_FILL()`` macros, deprecated
|
|
since Python 3.3. Use ``PyUnicode_CopyCharacters()`` or ``memcpy()``
|
|
(``wchar_t*`` string), and ``PyUnicode_Fill()`` functions instead.
|
|
(Contributed by Victor Stinner in :issue:`41123`.)
|
|
|
|
* Remove the ``pystrhex.h`` header file. It only contains private functions.
|
|
C extensions should only include the main ``<Python.h>`` header file.
|
|
(Contributed by Victor Stinner in :issue:`45434`.)
|
|
|
|
* Remove the ``Py_FORCE_DOUBLE()`` macro. It was used by the
|
|
``Py_IS_INFINITY()`` macro.
|
|
(Contributed by Victor Stinner in :issue:`45440`.)
|
|
|
|
* The following items are no longer available when :c:macro:`Py_LIMITED_API`
|
|
is defined:
|
|
|
|
* :c:func:`PyMarshal_WriteLongToFile`
|
|
* :c:func:`PyMarshal_WriteObjectToFile`
|
|
* :c:func:`PyMarshal_ReadObjectFromString`
|
|
* :c:func:`PyMarshal_WriteObjectToString`
|
|
* the ``Py_MARSHAL_VERSION`` macro
|
|
|
|
These are not part of the :ref:`limited API <stable-abi-list>`.
|
|
|
|
(Contributed by Victor Stinner in :issue:`45474`.)
|
|
|
|
* Exclude :c:func:`PyWeakref_GET_OBJECT` from the limited C API. It never
|
|
worked since the :c:type:`PyWeakReference` structure is opaque in the
|
|
limited C API.
|
|
(Contributed by Victor Stinner in :issue:`35134`.)
|
|
|
|
* Remove the ``PyHeapType_GET_MEMBERS()`` macro. It was exposed in the
|
|
public C API by mistake, it must only be used by Python internally.
|
|
Use the ``PyTypeObject.tp_members`` member instead.
|
|
(Contributed by Victor Stinner in :issue:`40170`.)
|