| **************************** |
| 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. |
| |
| |
| 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`.) |
| |
| 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`.) |
| |
| |
| 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`.) |
| |
| |
| 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`.) |
| |
| |
| 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`.) |
| |
| |
| 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. |
| |
| * Added a new :opcode:`CALL_METHOD_KW` opcode. Calls a method in a similar |
| fashion as :opcode:`CALL_METHOD`, but also supports keyword arguments. Works |
| in tandem with :opcode:`LOAD_METHOD`. |
| |
| * Removed ``COPY_DICT_WITHOUT_KEYS``. |
| |
| * :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). |
| |
| * Added :opcode:`COPY`, which pushes the *i*-th item to the top of the stack. |
| The item is not removed from its original location. |
| |
| * :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`.) |
| |
| 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`.) |
| |
| * Removed many old deprecated :mod:`unittest` features: |
| |
| - :class:`~unittest.TestCase` method aliases ``failUnlessEqual``, |
| ``failIfEqual``, ``failUnless``, ``failIf``, ``failUnlessRaises``, |
| ``failUnlessAlmostEqual``, ``failIfAlmostEqual`` (deprecated in Python 3.1), |
| ``assertEquals``, ``assertNotEquals``, ``assert_``, ``assertAlmostEquals``, |
| ``assertNotAlmostEquals``, ``assertRegexpMatches``, ``assertRaisesRegexp`` |
| (deprecated in Python 3.2), and ``assertNotRegexpMatches`` (deprecated in |
| Python 3.5). |
| |
| - Undocumented and broken :class:`~unittest.TestCase` method |
| ``assertDictContainsSubset`` (deprecated in Python 3.2). |
| |
| - Undocumented :meth:`<unittest.TestLoader.loadTestsFromModule> |
| TestLoader.loadTestsFromModule` parameter *use_load_tests* (deprecated |
| and ignored since Python 3.2). |
| |
| - An alias of the :class:`~unittest.TextTestResult` class: |
| ``_TextTestResult`` (deprecated in Python 3.2). |
| |
| (Contributed by Serhiy Storchaka in :issue:`45162`.) |
| |
| * 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`.) |
| |
| * Removed from the :mod:`configparser` module: |
| the :class:`SafeConfigParser` class, |
| the :attr:`filename` property of the :class:`ParsingError` class, |
| the :meth:`readfp` method of the :class:`ConfigParser` class, |
| deprecated since Python 3.2. |
| (Contributed by Hugo van Kemenade in :issue:`45173`.) |
| |
| * 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_callable`` 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`.) |
| |
| |
| 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. |
| |
| |
| 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`.) |
| |
| * 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`.) |
| |
| C API Changes |
| ============= |
| |
| 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`.) |
| |
| * :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`.) |
| |
| * 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`.) |
| |
| |
| 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`.) |
| |
| |
| 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`.) |