Skip to content

Latest commit

 

History

History
2019 lines (1547 loc) · 81.3 KB

3.13.rst

File metadata and controls

2019 lines (1547 loc) · 81.3 KB

What's New In Python 3.13

Editor

TBD

This article explains the new features in Python 3.13, compared to 3.12.

For full details, see the 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

Important deprecations, removals or restrictions:

  • PEP 594 <whatsnew313-pep594>: The remaining 19 "dead batteries" have been removed from the standard library: !aifc, !audioop, !cgi, !cgitb, !chunk, !crypt, !imghdr, !mailcap, !msilib, !nis, !nntplib, !ossaudiodev, !pipes, !sndhdr, !spwd, !sunau, !telnetlib, !uu and !xdrlib.
  • 602 ("Annual Release Cycle for Python") has been updated:
    • Python 3.9 - 3.12 have one and a half years of full support, followed by three and a half years of security fixes.
    • Python 3.13 and later have two years of full support, followed by three years of security fixes.

Interpreter improvements:

  • A basic JIT compiler <whatsnew313-jit-compiler> was added. It is currently disabled by default (though we may turn it on later). Performance improvements are modest -- we expect to be improving this over the next few releases.

New Features

Improved Error Messages

  • The interpreter now colorizes error messages when displaying tracebacks by default. This feature can be controlled via the new PYTHON_COLORS environment variable as well as the canonical NO_COLOR and FORCE_COLOR environment variables. See also using-on-controlling-color. (Contributed by Pablo Galindo Salgado in 112730.)
  • When an incorrect keyword argument is passed to a function, the error message now potentially suggests the correct keyword argument. (Contributed by Pablo Galindo Salgado and Shantanu Jain in 107944.)

    >>> "better error messages!".split(max_split=1) Traceback (most recent call last): File "<stdin>", line 1, in <module> "better error messages!".split(max_split=1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?

Other Language Changes

  • Allow the count argument of str.replace to be a keyword. (Contributed by Hugo van Kemenade in 106487.)
  • Compiler now strip indents from docstrings. This will reduce the size of bytecode cache <bytecode> (e.g. .pyc file). For example, cache file size for sqlalchemy.orm.session in SQLAlchemy 2.0 is reduced by about 5%. This change will affect tools using docstrings, like doctest. (Contributed by Inada Naoki in 81283.)
  • The compile built-in can now accept a new flag, ast.PyCF_OPTIMIZED_AST, which is similar to ast.PyCF_ONLY_AST except that the returned AST is optimized according to the value of the optimize argument. (Contributed by Irit Katriel in 108113).
  • multiprocessing, concurrent.futures, compileall: Replace os.cpu_count with os.process_cpu_count to select the default number of worker threads and processes. Get the CPU affinity if supported. (Contributed by Victor Stinner in 109649.)
  • os.path.realpath now resolves MS-DOS style file names even if the file is not accessible. (Contributed by Moonsik Park in 82367.)
  • Fixed a bug where a global declaration in an except block is rejected when the global is used in the else block. (Contributed by Irit Katriel in 111123.)
  • Many functions now emit a warning if a boolean value is passed as a file descriptor argument. This can help catch some errors earlier. (Contributed by Serhiy Storchaka in 82626.)
  • Added a new environment variable PYTHON_FROZEN_MODULES. It determines whether or not frozen modules are ignored by the import machinery, equivalent of the -X frozen_modules <-X> command-line option. (Contributed by Yilei Yang in 111374.)
  • The new PYTHON_HISTORY environment variable can be used to change the location of a .python_history file. (Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade in 73965.)
  • Add PythonFinalizationError exception. This exception derived from RuntimeError is raised when an operation is blocked during the Python finalization <interpreter shutdown>.

    The following functions now raise PythonFinalizationError, instead of RuntimeError:

    • _thread.start_new_thread.
    • subprocess.Popen.
    • os.fork.
    • os.forkpty.

    (Contributed by Victor Stinner in 114570.)

  • Allow controlling Expat >=2.6.0 reparse deferral (CVE-2023-52425) by adding five new methods:

    • xml.etree.ElementTree.XMLParser.flush
    • xml.etree.ElementTree.XMLPullParser.flush
    • xml.parsers.expat.xmlparser.GetReparseDeferralEnabled
    • xml.parsers.expat.xmlparser.SetReparseDeferralEnabled
    • !xml.sax.expatreader.ExpatParser.flush

    (Contributed by Sebastian Pipping in 115623.)

  • When asyncio.TaskGroup.create_task is called on an inactive asyncio.TaskGroup, the given coroutine will be closed (which prevents a RuntimeWarning about the given coroutine being never awaited).

    (Contributed by Arthur Tacca and Jason Zhang in 115957.)

  • The ssl.create_default_context API now includes ssl.VERIFY_X509_PARTIAL_CHAIN and ssl.VERIFY_X509_STRICT in its default flags.

    Note

    ssl.VERIFY_X509_STRICT may reject pre-5280 or malformed certificates that the underlying OpenSSL implementation otherwise would accept. While disabling this is not recommended, you can do so using:

    ctx = ssl.create_default_context()
    ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT

    (Contributed by William Woodruff in 112389.)

New Modules

  • None yet.

Improved Modules

argparse

  • Add parameter deprecated in methods ~argparse.ArgumentParser.add_argument and !add_parser which allows to deprecate command-line options, positional arguments and subcommands. (Contributed by Serhiy Storchaka in 83648).

array

  • Add 'w' type code (Py_UCS4) that can be used for Unicode strings. It can be used instead of 'u' type code, which is deprecated. (Contributed by Inada Naoki in 80480.)
  • Add clear() method in order to implement MutableSequence. (Contributed by Mike Zimin in 114894.)

ast

  • The constructors of node types in the ast module are now stricter in the arguments they accept, and have more intuitive behaviour when arguments are omitted.

    If an optional field on an AST node is not included as an argument when constructing an instance, the field will now be set to None. Similarly, if a list field is omitted, that field will now be set to an empty list. (Previously, in both cases, the attribute would be missing on the newly constructed AST node instance.)

    If other arguments are omitted, a DeprecationWarning is emitted. This will cause an exception in Python 3.15. Similarly, passing a keyword argument that does not map to a field on the AST node is now deprecated, and will raise an exception in Python 3.15.

  • ast.parse now accepts an optional argument optimize which is passed on to the compile built-in. This makes it possible to obtain an optimized AST. (Contributed by Irit Katriel in 108113.)

asyncio

  • asyncio.loop.create_unix_server will now automatically remove the Unix socket when the server is closed. (Contributed by Pierre Ossman in 111246.)
  • asyncio.DatagramTransport.sendto will now send zero-length datagrams if called with an empty bytes object. The transport flow control also now accounts for the datagram header when calculating the buffer size. (Contributed by Jamie Phan in 115199.)

base64 ---

  • Add base64.z85encode and base64.z85decode functions which allow encoding and decoding z85 data. See Z85 specification for more information. (Contributed by Matan Perelman in 75299.)

copy

  • Add copy.replace function which allows to create a modified copy of an object, which is especially useful for immutable objects. It supports named tuples created with the factory function collections.namedtuple, ~dataclasses.dataclass instances, various datetime objects, ~inspect.Signature objects, ~inspect.Parameter objects, code object <code-objects>, and any user classes which define the !__replace__ method. (Contributed by Serhiy Storchaka in 108751.)

dbm

  • Add dbm.gnu.gdbm.clear and dbm.ndbm.ndbm.clear methods that remove all items from the database. (Contributed by Donghee Na in 107122.)

dis

  • Change the output of dis module functions to show logical labels for jump targets and exception handlers, rather than offsets. The offsets can be added with the new -O command line option or the show_offsets parameter. (Contributed by Irit Katriel in 112137.)

dbm

  • Add dbm.gnu.gdbm.clear and dbm.ndbm.ndbm.clear methods that remove all items from the database. (Contributed by Donghee Na in 107122.)
  • Add new dbm.sqlite3 backend, and make it the default !dbm backend. (Contributed by Raymond Hettinger and Erlend E. Aasland in 100414.)

doctest

  • The doctest.DocTestRunner.run method now counts the number of skipped tests. Add doctest.DocTestRunner.skips and doctest.TestResults.skipped attributes. (Contributed by Victor Stinner in 108794.)

email

  • email.utils.getaddresses and email.utils.parseaddr now return ('', '') 2-tuples in more situations where invalid email addresses are encountered instead of potentially inaccurate values. Add optional strict parameter to these two functions: use strict=False to get the old behavior, accept malformed inputs. getattr(email.utils, 'supports_strict_parsing', False) can be use to check if the strict parameter is available. (Contributed by Thomas Dwyer and Victor Stinner for 102988 to improve the CVE-2023-27043 fix.)

fractions

  • Formatting for objects of type fractions.Fraction now supports the standard format specification mini-language rules for fill, alignment, sign handling, minimum width and grouping. (Contributed by Mark Dickinson in 111320.)

glob

  • Add glob.translate function that converts a path specification with shell-style wildcards to a regular expression. (Contributed by Barney Gale in 72904.)

io

The io.IOBase finalizer now logs the close() method errors with sys.unraisablehook. Previously, errors were ignored silently by default, and only logged in Python Development Mode <devmode> or on Python built on debug mode <debug-build>. (Contributed by Victor Stinner in 62948.)

ipaddress

  • Add the ipaddress.IPv4Address.ipv6_mapped property, which returns the IPv4-mapped IPv6 address. (Contributed by Charles Machalow in 109466.)

itertools

  • Added a strict option to itertools.batched. This raises a ValueError if the final batch is shorter than the specified batch size. (Contributed by Raymond Hettinger in 113202.)

marshal

  • Add the allow_code parameter in module functions. Passing allow_code=False prevents serialization and de-serialization of code objects which are incompatible between Python versions. (Contributed by Serhiy Storchaka in 113626.)

math

A new function ~math.fma for fused multiply-add operations has been added. This function computes x * y + z with only a single round, and so avoids any intermediate loss of precision. It wraps the fma() function provided by C99, and follows the specification of the IEEE 754 "fusedMultiplyAdd" operation for special cases. (Contributed by Mark Dickinson and Victor Stinner in 73468.)

mmap

  • The mmap.mmap class now has an ~mmap.mmap.seekable method that can be used when a seekable file-like object is required. The ~mmap.mmap.seek method now returns the new absolute position. (Contributed by Donghee Na and Sylvie Liberman in 111835.)
  • mmap.mmap now has a trackfd parameter on Unix; if it is False, the file descriptor specified by fileno will not be duplicated. (Contributed by Zackery Spytz and Petr Viktorin in 78502.)

opcode

  • Move opcode.ENABLE_SPECIALIZATION to _opcode.ENABLE_SPECIALIZATION. This field was added in 3.12, it was never documented and is not intended for external usage. (Contributed by Irit Katriel in 105481.)
  • Removed opcode.is_pseudo, opcode.MIN_PSEUDO_OPCODE and opcode.MAX_PSEUDO_OPCODE, which were added in 3.12, were never documented or exposed through dis, and were not intended to be used externally.

os

  • Add os.process_cpu_count function to get the number of logical CPUs usable by the calling thread of the current process. (Contributed by Victor Stinner in 109649.)
  • Add a low level interface for Linux's timer notification file descriptors via os.timerfd_create, os.timerfd_settime, os.timerfd_settime_ns, os.timerfd_gettime, and os.timerfd_gettime_ns, os.TFD_NONBLOCK, os.TFD_CLOEXEC, os.TFD_TIMER_ABSTIME, and os.TFD_TIMER_CANCEL_ON_SET (Contributed by Masaru Tsuchiyama in 108277.)
  • os.cpu_count and os.process_cpu_count can be overridden through the new environment variable PYTHON_CPU_COUNT or the new command-line option -X cpu_count <-X>. This option is useful for users who need to limit CPU resources of a container system without having to modify the container (application code). (Contributed by Donghee Na in 109595.)
  • Add support of os.lchmod and the follow_symlinks argument in os.chmod on Windows. Note that the default value of follow_symlinks in !os.lchmod is False on Windows. (Contributed by Serhiy Storchaka in 59616.)
  • Add support of os.fchmod and a file descriptor in os.chmod on Windows. (Contributed by Serhiy Storchaka in 113191.)
  • os.posix_spawn now accepts env=None, which makes the newly spawned process use the current process environment. (Contributed by Jakub Kulik in 113119.)
  • os.posix_spawn gains an os.POSIX_SPAWN_CLOSEFROM attribute for use in file_actions= on platforms that support :c!posix_spawn_file_actions_addclosefrom_np. (Contributed by Jakub Kulik in 113117.)

os.path

  • Add os.path.isreserved to check if a path is reserved on the current system. This function is only available on Windows. (Contributed by Barney Gale in 88569.)
  • On Windows, os.path.isabs no longer considers paths starting with exactly one (back)slash to be absolute. (Contributed by Barney Gale and Jon Foster in 44626.)

pathlib

  • Add pathlib.UnsupportedOperation, which is raised instead of NotImplementedError when a path operation isn't supported. (Contributed by Barney Gale in 89812.)
  • Add pathlib.Path.from_uri, a new constructor to create a pathlib.Path object from a 'file' URI (file://). (Contributed by Barney Gale in 107465.)
  • Add pathlib.PurePath.full_match for matching paths with shell-style wildcards, including the recursive wildcard "**". (Contributed by Barney Gale in 73435.)
  • Add follow_symlinks keyword-only argument to pathlib.Path.glob, ~pathlib.Path.rglob, ~pathlib.Path.is_file, ~pathlib.Path.is_dir, ~pathlib.Path.owner, ~pathlib.Path.group. (Contributed by Barney Gale in 77609 and 105793, and Kamil Turek in 107962).
  • Return files and directories from pathlib.Path.glob and ~pathlib.Path.rglob when given a pattern that ends with "**". In earlier versions, only directories were returned. (Contributed by Barney Gale in 70303).

pdb

  • Add ability to move between chained exceptions during post mortem debugging in ~pdb.pm using the new exceptions [exc_number] command for Pdb. (Contributed by Matthias Bussonnier in 106676.)
  • Expressions/statements whose prefix is a pdb command are now correctly identified and executed. (Contributed by Tian Gao in 108464.)
  • sys.path[0] will no longer be replaced by the directory of the script being debugged when sys.flags.safe_path is set (via the -P command line option or PYTHONSAFEPATH environment variable). (Contributed by Tian Gao and Christian Walther in 111762.)

queue

  • Add queue.Queue.shutdown (along with queue.ShutDown) for queue termination. (Contributed by Laurie Opperman and Yves Duprat in 104750.)

re

  • Rename !re.error to re.PatternError for improved clarity. !re.error is kept for backward compatibility.

sqlite3

  • A ResourceWarning is now emitted if a sqlite3.Connection object is not closed <sqlite3.Connection.close> explicitly. (Contributed by Erlend E. Aasland in 105539.)
  • Add filter keyword-only parameter to sqlite3.Connection.iterdump for filtering database objects to dump. (Contributed by Mariusz Felisiak in 91602.)

statistics

  • Add statistics.kde for kernel density estimation. This makes it possible to estimate a continuous probability density function from a fixed number of discrete samples. (Contributed by Raymond Hettinger in 115863.)

subprocess

  • The subprocess module now uses the os.posix_spawn function in more situations. Notably in the default case of close_fds=True on more recent versions of platforms including Linux, FreeBSD, and Solaris where the C library provides :c!posix_spawn_file_actions_addclosefrom_np. On Linux this should perform similar to our existing Linux :c!vfork based code. A private control knob !subprocess._USE_POSIX_SPAWN can be set to False if you need to force subprocess not to ever use os.posix_spawn. Please report your reason and platform details in the CPython issue tracker if you set this so that we can improve our API selection logic for everyone. (Contributed by Jakub Kulik in 113117.)

sys

  • Add the sys._is_interned function to test if the string was interned. This function is not guaranteed to exist in all implementations of Python. (Contributed by Serhiy Storchaka in 78573.)

time

  • On Windows, time.monotonic() now uses the QueryPerformanceCounter() clock to have a resolution better than 1 us, instead of the GetTickCount64() clock which has a resolution of 15.6 ms. (Contributed by Victor Stinner in 88494.)

tkinter

  • Add tkinter widget methods: !tk_busy_hold, !tk_busy_configure, !tk_busy_cget, !tk_busy_forget, !tk_busy_current, and !tk_busy_status. (Contributed by Miguel, klappnase and Serhiy Storchaka in 72684.)
  • The tkinter widget method !wm_attributes now accepts the attribute name without the minus prefix to get window attributes, e.g. w.wm_attributes('alpha') and allows to specify attributes and values to set as keyword arguments, e.g. w.wm_attributes(alpha=0.5). Add new optional keyword-only parameter return_python_dict: calling w.wm_attributes(return_python_dict=True) returns the attributes as a dict instead of a tuple. (Contributed by Serhiy Storchaka in 43457.)
  • Add new optional keyword-only parameter return_ints in the !Text.count method. Passing return_ints=True makes it always returning the single count as an integer instead of a 1-tuple or None. (Contributed by Serhiy Storchaka in 97928.)
  • Add support of the "vsapi" element type in the ~tkinter.ttk.Style.element_create method of tkinter.ttk.Style. (Contributed by Serhiy Storchaka in 68166.)

traceback

  • Add show_group parameter to traceback.TracebackException.format_exception_only to format the nested exceptions of a BaseExceptionGroup instance, recursively. (Contributed by Irit Katriel in 105292.)
  • Add the field exc_type_str to ~traceback.TracebackException, which holds a string display of the exc_type. Deprecate the field exc_type which holds the type object itself. Add parameter save_exc_type (default True) to indicate whether exc_type should be saved. (Contributed by Irit Katriel in 112332.)

typing

  • Add typing.get_protocol_members to return the set of members defining a typing.Protocol. Add typing.is_protocol to check whether a class is a typing.Protocol. (Contributed by Jelle Zijlstra in 104873.)
  • Add typing.ReadOnly, a special typing construct to mark an item of a typing.TypedDict as read-only for type checkers. See 705 for more details.

unicodedata

  • The Unicode database has been updated to version 15.1.0. (Contributed by James Gerity in 109559.)

venv

  • Add support for adding source control management (SCM) ignore files to a virtual environment's directory. By default, Git is supported. This is implemented as opt-in via the API which can be extended to support other SCMs (venv.EnvBuilder and venv.create), and opt-out via the CLI (using --without-scm-ignore-files). (Contributed by Brett Cannon in 108125.)

warnings

  • The new warnings.deprecated decorator provides a way to communicate deprecations to static type checkers <static type checker> and to warn on usage of deprecated classes and functions. A runtime deprecation warning may also be emitted when a decorated function or class is used at runtime. See 702. (Contributed by Jelle Zijlstra in 104003.)

xml.etree.ElementTree

  • Add the !close method for the iterator returned by ~xml.etree.ElementTree.iterparse for explicit cleaning up. (Contributed by Serhiy Storchaka in 69893.)

Optimizations

  • textwrap.indent is now ~30% faster than before for large input. (Contributed by Inada Naoki in 107369.)
  • The subprocess module uses os.posix_spawn in more situations including the default where close_fds=True on many modern platforms. This should provide a noteworthy performance increase launching processes on FreeBSD and Solaris. See the subprocess section above for details. (Contributed by Jakub Kulik in 113117.)

Experimental JIT Compiler

When CPython is configured using the --enable-experimental-jit option, a just-in-time compiler is added which can speed up some Python programs.

The internal architecture is roughly as follows.

  • We start with specialized Tier 1 bytecode. See What's new in 3.11 <whatsnew311-pep659> for details.
  • When the Tier 1 bytecode gets hot enough, it gets translated to a new, purely internal Tier 2 IR, a.k.a. micro-ops ("uops").
  • The Tier 2 IR uses the same stack-based VM as Tier 1, but the instruction format is better suited to translation to machine code.
  • We have several optimization passes for Tier 2 IR, which are applied before it is interpreted or translated to machine code.
  • There is a Tier 2 interpreter, but it is mostly intended for debugging the earlier stages of the optimization pipeline. If the JIT is not enabled, the Tier 2 interpreter can be invoked by passing Python the -X uops option or by setting the PYTHON_UOPS environment variable to 1.
  • When the --enable-experimental-jit option is used, the optimized Tier 2 IR is translated to machine code, which is then executed. This does not require additional runtime options.
  • The machine code translation process uses an architecture called copy-and-patch. It has no runtime dependencies, but there is a new build-time dependency on LLVM.

(JIT by Brandt Bucher, inspired by a paper by Haoran Xu and Fredrik Kjolstad. Tier 2 IR by Mark Shannon and Guido van Rossum. Tier 2 optimizer by Ken Jin.)

Deprecated

  • array: array's 'u' format code, deprecated in docs since Python 3.3, emits DeprecationWarning since 3.13 and will be removed in Python 3.16. Use the 'w' format code instead. (contributed by Hugo van Kemenade in 80480)
  • ctypes: Deprecate undocumented !ctypes.SetPointerType and !ctypes.ARRAY functions. Replace ctypes.ARRAY(item_type, size) with item_type * size. (Contributed by Victor Stinner in 105733.)
  • decimal: Deprecate non-standard format specifier "N" for decimal.Decimal. It was not documented and only supported in the C implementation. (Contributed by Serhiy Storchaka in 89902.)
  • dis: The dis.HAVE_ARGUMENT separator is deprecated. Check membership in ~dis.hasarg instead. (Contributed by Irit Katriel in 109319.)
  • getopt and optparse modules: They are now soft deprecated: the argparse module should be used for new projects. Previously, the optparse module was already deprecated, its removal was not scheduled, and no warnings was emitted: so there is no change in practice. (Contributed by Victor Stinner in 106535.)
  • gettext: Emit deprecation warning for non-integer numbers in gettext functions and methods that consider plural forms even if the translation was not found. (Contributed by Serhiy Storchaka in 88434.)
  • http.server: http.server.CGIHTTPRequestHandler now emits a DeprecationWarning as it will be removed in 3.15. Process-based CGI HTTP servers have been out of favor for a very long time. This code was outdated, unmaintained, and rarely used. It has a high potential for both security and functionality bugs. This includes removal of the --cgi flag to the python -m http.server command line in 3.15.
  • pathlib: pathlib.PurePath.is_reserved is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved to detect reserved paths on Windows.
  • pydoc: Deprecate undocumented !pydoc.ispackage function. (Contributed by Zackery Spytz in 64020.)
  • sqlite3: Passing more than one positional argument to sqlite3.connect and the sqlite3.Connection constructor is deprecated. The remaining parameters will become keyword-only in Python 3.15.

    Deprecate passing name, number of arguments, and the callable as keyword arguments for the following sqlite3.Connection APIs:

    • ~sqlite3.Connection.create_function
    • ~sqlite3.Connection.create_aggregate

    Deprecate passing the callback callable by keyword for the following sqlite3.Connection APIs:

    • ~sqlite3.Connection.set_authorizer
    • ~sqlite3.Connection.set_progress_handler
    • ~sqlite3.Connection.set_trace_callback

    The affected parameters will become positional-only in Python 3.15.

    (Contributed by Erlend E. Aasland in 107948 and 108278.)

  • sys: sys._enablelegacywindowsfsencoding function. Replace it with the PYTHONLEGACYWINDOWSFSENCODING environment variable. (Contributed by Inada Naoki in 73427.)
  • traceback: The field exc_type of traceback.TracebackException is deprecated. Use exc_type_str instead.
  • typing:
    • Creating a typing.NamedTuple class using keyword arguments to denote the fields (NT = NamedTuple("NT", x=int, y=int)) is deprecated, and will be disallowed in Python 3.15. Use the class-based syntax or the functional syntax instead. (Contributed by Alex Waygood in 105566.)
    • When using the functional syntax to create a typing.NamedTuple class or a typing.TypedDict class, failing to pass a value to the 'fields' parameter (NT = NamedTuple("NT") or TD = TypedDict("TD")) is deprecated. Passing None to the 'fields' parameter (NT = NamedTuple("NT", None) or TD = TypedDict("TD", None)) is also deprecated. Both will be disallowed in Python 3.15. To create a NamedTuple class with 0 fields, use class NT(NamedTuple): pass or NT = NamedTuple("NT", []). To create a TypedDict class with 0 fields, use class TD(TypedDict): pass or TD = TypedDict("TD", {}). (Contributed by Alex Waygood in 105566 and 105570.)
    • typing.no_type_check_decorator is deprecated, and scheduled for removal in Python 3.15. After eight years in the typing module, it has yet to be supported by any major type checkers. (Contributed by Alex Waygood in 106309.)
    • typing.AnyStr is deprecated. In Python 3.16, it will be removed from typing.__all__, and a DeprecationWarning will be emitted when it is imported or accessed. It will be removed entirely in Python 3.18. Use the new type parameter syntax <type-params> instead. (Contributed by Michael The in 107116.)
  • wave: Deprecate the getmark(), setmark() and getmarkers() methods of the wave.Wave_read and wave.Wave_write classes. They will be removed in Python 3.15. (Contributed by Victor Stinner in 105096.)
  • Calling frame.clear on a suspended frame raises RuntimeError (as has always been the case for an executing frame). (Contributed by Irit Katriel in 79932.)
  • Assignment to a function's ~function.__code__ attribute where the new code object's type does not match the function's type, is deprecated. The different types are: plain function, generator, async generator and coroutine. (Contributed by Irit Katriel in 81137.)
  • The undocumented and unused tarfile attribute of tarfile.TarFile is deprecated and scheduled for removal in Python 3.16.
  • platform.java_ver is deprecated and will be removed in 3.15. It was largely untested, had a confusing API, and was only useful for Jython support. (Contributed by Nikita Sobolev in 116349.)

Pending Removal in Python 3.14

  • argparse: The type, choices, and metavar parameters of !argparse.BooleanOptionalAction are deprecated and will be removed in 3.14. (Contributed by Nikita Sobolev in 92248.)
  • ast: The following features have been deprecated in documentation since Python 3.8, now cause a DeprecationWarning to be emitted at runtime when they are accessed or used, and will be removed in Python 3.14:

    • !ast.Num
    • !ast.Str
    • !ast.Bytes
    • !ast.NameConstant
    • !ast.Ellipsis

    Use ast.Constant instead. (Contributed by Serhiy Storchaka in 90953.)

  • collections.abc: Deprecated ~collections.abc.ByteString. Prefer !Sequence or ~collections.abc.Buffer. For use in typing, prefer a union, like bytes | bytearray, or collections.abc.Buffer. (Contributed by Shantanu Jain in 91896.)
  • email: Deprecated the isdst parameter in email.utils.localtime. (Contributed by Alan Williams in 72346.)
  • importlib: __package__ and __cached__ will cease to be set or taken into consideration by the import system (97879).
  • importlib.abc deprecated classes:

    • !importlib.abc.ResourceReader
    • !importlib.abc.Traversable
    • !importlib.abc.TraversableResources

    Use importlib.resources.abc classes instead:

    • importlib.resources.abc.Traversable
    • importlib.resources.abc.TraversableResources

    (Contributed by Jason R. Coombs and Hugo van Kemenade in 93963.)

  • itertools had undocumented, inefficient, historically buggy, and inconsistent support for copy, deepcopy, and pickle operations. This will be removed in 3.14 for a significant reduction in code volume and maintenance burden. (Contributed by Raymond Hettinger in 101588.)
  • multiprocessing: The default start method will change to a safer one on Linux, BSDs, and other non-macOS POSIX platforms where 'fork' is currently the default (84559). Adding a runtime warning about this was deemed too disruptive as the majority of code is not expected to care. Use the ~multiprocessing.get_context or ~multiprocessing.set_start_method APIs to explicitly specify when your code requires 'fork'. See multiprocessing-start-methods.
  • pathlib: ~pathlib.PurePath.is_relative_to and ~pathlib.PurePath.relative_to: passing additional arguments is deprecated.
  • pkgutil: ~pkgutil.find_loader and ~pkgutil.get_loader now raise DeprecationWarning; use importlib.util.find_spec instead. (Contributed by Nikita Sobolev in 97850.)
  • pty:
    • master_open(): use pty.openpty.
    • slave_open(): use pty.openpty.
  • shutil.rmtree onerror parameter is deprecated in 3.12, and will be removed in 3.14: use the onexc parameter instead.
  • sqlite3:
    • ~sqlite3.version and ~sqlite3.version_info.
    • ~sqlite3.Cursor.execute and ~sqlite3.Cursor.executemany if named placeholders <sqlite3-placeholders> are used and parameters is a sequence instead of a dict.
    • date and datetime adapter, date and timestamp converter: see the sqlite3 documentation for suggested replacement recipes.
  • types.CodeType: Accessing ~codeobject.co_lnotab was deprecated in 626 since 3.10 and was planned to be removed in 3.12, but it only got a proper DeprecationWarning in 3.12. May be removed in 3.14. (Contributed by Nikita Sobolev in 101866.)
  • typing: ~typing.ByteString, deprecated since Python 3.9, now causes a DeprecationWarning to be emitted when it is used.
  • !urllib.parse.Quoter is deprecated: it was not intended to be a public API. (Contributed by Gregory P. Smith in 88168.)
  • xml.etree.ElementTree: Testing the truth value of an ~xml.etree.ElementTree.Element is deprecated and will raise an exception in Python 3.14.

Pending Removal in Python 3.15

  • http.server.CGIHTTPRequestHandler will be removed along with its related --cgi flag to python -m http.server. It was obsolete and rarely used. No direct replacement exists. Anything is better than CGI to interface a web server with a request handler.
  • locale: locale.getdefaultlocale was deprecated in Python 3.11 and originally planned for removal in Python 3.13 (90817), but removal has been postponed to Python 3.15. Use locale.setlocale(), locale.getencoding() and locale.getlocale() instead. (Contributed by Hugo van Kemenade in 111187.)
  • pathlib: pathlib.PurePath.is_reserved is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved to detect reserved paths on Windows.
  • threading: Passing any arguments to threading.RLock is now deprecated. C version allows any numbers of args and kwargs, but they are just ignored. Python version does not allow any arguments. All arguments will be removed from threading.RLock in Python 3.15. (Contributed by Nikita Sobolev in 102029.)
  • typing.NamedTuple:
    • The undocumented keyword argument syntax for creating NamedTuple classes (NT = NamedTuple("NT", x=int)) is deprecated, and will be disallowed in 3.15. Use the class-based syntax or the functional syntax instead.
    • When using the functional syntax to create a NamedTuple class, failing to pass a value to the 'fields' parameter (NT = NamedTuple("NT")) is deprecated. Passing None to the 'fields' parameter (NT = NamedTuple("NT", None)) is also deprecated. Both will be disallowed in Python 3.15. To create a NamedTuple class with 0 fields, use class NT(NamedTuple): pass or NT = NamedTuple("NT", []).
  • typing.TypedDict: When using the functional syntax to create a TypedDict class, failing to pass a value to the 'fields' parameter (TD = TypedDict("TD")) is deprecated. Passing None to the 'fields' parameter (TD = TypedDict("TD", None)) is also deprecated. Both will be disallowed in Python 3.15. To create a TypedDict class with 0 fields, use class TD(TypedDict): pass or TD = TypedDict("TD", {}).
  • wave: Deprecate the getmark(), setmark() and getmarkers() methods of the wave.Wave_read and wave.Wave_write classes. They will be removed in Python 3.15. (Contributed by Victor Stinner in 105096.)
  • platform.java_ver is deprecated and will be removed in 3.15. It was largely untested, had a confusing API, and was only useful for Jython support. (Contributed by Nikita Sobolev in 116349.)

Pending Removal in Python 3.16

  • array.array 'u' type (:cwchar_t): use the 'w' type instead (Py_UCS4).

Pending Removal in Future Versions

The following APIs were deprecated in earlier Python versions and will be removed, although there is currently no date scheduled for their removal.

  • argparse: Nesting argument groups and nesting mutually exclusive groups are deprecated.
  • builtins:
    • ~bool, bitwise inversion on bool.
    • bool(NotImplemented).
    • Generators: throw(type, exc, tb) and athrow(type, exc, tb) signature is deprecated: use throw(exc) and athrow(exc) instead, the single argument signature.
    • Currently Python accepts numeric literals immediately followed by keywords, for example 0in x, 1or x, 0if 1else 2. It allows confusing and ambiguous expressions like [0x1for x in y] (which can be interpreted as [0x1 for x in y] or [0x1f or x in y]). A syntax warning is raised if the numeric literal is immediately followed by one of keywords and, else, for, if, in, is and or. In a future release it will be changed to a syntax error. (87999)
    • Support for __index__() and __int__() method returning non-int type: these methods will be required to return an instance of a strict subclass of int.
    • Support for __float__() method returning a strict subclass of float: these methods will be required to return an instance of float.
    • Support for __complex__() method returning a strict subclass of complex: these methods will be required to return an instance of complex.
    • Delegation of int() to __trunc__() method.
  • calendar: calendar.January and calendar.February constants are deprecated and replaced by calendar.JANUARY and calendar.FEBRUARY. (Contributed by Prince Roshan in 103636.)
  • codeobject.co_lnotab: use the codeobject.co_lines method instead.
  • datetime:
    • ~datetime.datetime.utcnow: use datetime.datetime.now(tz=datetime.UTC).
    • ~datetime.datetime.utcfromtimestamp: use datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
  • gettext: Plural value must be an integer.
  • importlib:
    • load_module() method: use exec_module() instead.
    • ~importlib.util.cache_from_source debug_override parameter is deprecated: use the optimization parameter instead.
  • importlib.metadata:
    • EntryPoints tuple interface.
    • Implicit None on return values.
  • mailbox: Use of StringIO input and text mode is deprecated, use BytesIO and binary mode instead.
  • os: Calling os.register_at_fork in multi-threaded process.
  • !pydoc.ErrorDuringImport: A tuple value for exc_info parameter is deprecated, use an exception instance.
  • re: More strict rules are now applied for numerical group references and group names in regular expressions. Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in 91760.)
  • !sre_compile, !sre_constants and !sre_parse modules.
  • ssl options and protocols:
    • ssl.SSLContext without protocol argument is deprecated.
    • ssl.SSLContext: ~ssl.SSLContext.set_npn_protocols and !selected_npn_protocol are deprecated: use ALPN instead.
    • ssl.OP_NO_SSL* options
    • ssl.OP_NO_TLS* options
    • ssl.PROTOCOL_SSLv3
    • ssl.PROTOCOL_TLS
    • ssl.PROTOCOL_TLSv1
    • ssl.PROTOCOL_TLSv1_1
    • ssl.PROTOCOL_TLSv1_2
    • ssl.TLSVersion.SSLv3
    • ssl.TLSVersion.TLSv1
    • ssl.TLSVersion.TLSv1_1
  • sysconfig.is_python_build check_home parameter is deprecated and ignored.
  • threading methods:
    • !threading.Condition.notifyAll: use ~threading.Condition.notify_all.
    • !threading.Event.isSet: use ~threading.Event.is_set.
    • !threading.Thread.isDaemon, threading.Thread.setDaemon: use threading.Thread.daemon attribute.
    • !threading.Thread.getName, threading.Thread.setName: use threading.Thread.name attribute.
    • !threading.currentThread: use threading.current_thread.
    • !threading.activeCount: use threading.active_count.
  • typing.Text (92332).
  • unittest.IsolatedAsyncioTestCase: it is deprecated to return a value that is not None from a test case.
  • urllib.parse deprecated functions: ~urllib.parse.urlparse instead
    • splitattr()
    • splithost()
    • splitnport()
    • splitpasswd()
    • splitport()
    • splitquery()
    • splittag()
    • splittype()
    • splituser()
    • splitvalue()
    • to_bytes()
  • urllib.request: ~urllib.request.URLopener and ~urllib.request.FancyURLopener style of invoking requests is deprecated. Use newer ~urllib.request.urlopen functions and methods.
  • wsgiref: SimpleHandler.stdout.write() should not do partial writes.
  • zipimport.zipimporter.load_module is deprecated: use ~zipimport.zipimporter.exec_module instead.

Removed

PEP 594: dead batteries

  • 594 removed 19 modules from the standard library, deprecated in Python 3.11:
    • !aifc. (Contributed by Victor Stinner in 104773.)
    • !audioop. (Contributed by Victor Stinner in 104773.)
    • !chunk. (Contributed by Victor Stinner in 104773.)
    • !cgi and !cgitb.

      • cgi.FieldStorage can typically be replaced with urllib.parse.parse_qsl for GET and HEAD requests, and the email.message module or multipart PyPI project for POST and PUT.
      • cgi.parse() can be replaced by calling urllib.parse.parse_qs directly on the desired query string, except for multipart/form-data input, which can be handled as described for cgi.parse_multipart().
      • cgi.parse_header() can be replaced with the functionality in the email package, which implements the same MIME RFCs. For example, with email.message.EmailMessage:

        from email.message import EmailMessage
        msg = EmailMessage()
        msg['content-type'] = 'application/json; charset="utf8"'
        main, params = msg.get_content_type(), msg['content-type'].params
      • cgi.parse_multipart() can be replaced with the functionality in the email package (e.g. email.message.EmailMessage and email.message.Message) which implements the same MIME RFCs, or with the multipart PyPI project.

      (Contributed by Victor Stinner in 104773.)

    • !crypt module and its private !_crypt extension. The hashlib module is a potential replacement for certain use cases. Otherwise, the following PyPI projects can be used:

      • bcrypt: Modern password hashing for your software and your servers.
      • passlib: Comprehensive password hashing framework supporting over 30 schemes.
      • argon2-cffi: The secure Argon2 password hashing algorithm.
      • legacycrypt: Wrapper to the POSIX crypt library call and associated functionality.

      (Contributed by Victor Stinner in 104773.)

    • !imghdr: use the projects filetype, puremagic, or python-magic instead. (Contributed by Victor Stinner in 104773.)
    • !mailcap. The mimetypes module provides an alternative. (Contributed by Victor Stinner in 104773.)
    • !msilib. (Contributed by Zachary Ware in 104773.)
    • !nis. (Contributed by Victor Stinner in 104773.)
    • !nntplib: the PyPI nntplib project can be used instead. (Contributed by Victor Stinner in 104773.)
    • !ossaudiodev: use the pygame project for audio playback. (Contributed by Victor Stinner in 104780.)
    • !pipes: use the subprocess module instead. (Contributed by Victor Stinner in 104773.)
    • !sndhdr: use the projects filetype, puremagic, or python-magic instead. (Contributed by Victor Stinner in 104773.)
    • !spwd: the python-pam project can be used instead. (Contributed by Victor Stinner in 104773.)
    • !sunau. (Contributed by Victor Stinner in 104773.)
    • !telnetlib, use the projects telnetlib3 or Exscript instead. (Contributed by Victor Stinner in 104773.)
    • !uu: the base64 module is a modern alternative. (Contributed by Victor Stinner in 104773.)
    • !xdrlib. (Contributed by Victor Stinner in 104773.)

2to3

  • Remove the 2to3 program and the !lib2to3 module, deprecated in Python 3.11. (Contributed by Victor Stinner in 104780.)

configparser

  • Remove the undocumented !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 104886.)

importlib

  • Remove importlib.resources deprecated methods:

    • contents()
    • is_resource()
    • open_binary()
    • open_text()
    • path()
    • read_binary()
    • read_text()

    Use importlib.resources.files() instead. Refer to importlib-resources: Migrating from Legacy for migration advice. (Contributed by Jason R. Coombs in 106532.)

  • Remove deprecated ~object.__getitem__ access for !importlib.metadata.EntryPoint objects. (Contributed by Jason R. Coombs in 113175.)

locale

  • Remove locale.resetlocale() function deprecated in Python 3.11: use locale.setlocale(locale.LC_ALL, "") instead. (Contributed by Victor Stinner in 104783.)

logging

  • logging: Remove undocumented and untested Logger.warn() and LoggerAdapter.warn() methods and logging.warn() function. Deprecated since Python 3.3, they were aliases to the logging.Logger.warning method, !logging.LoggerAdapter.warning method and logging.warning function. (Contributed by Victor Stinner in 105376.)

pathlib

  • Remove support for using pathlib.Path objects as context managers. This functionality was deprecated and made a no-op in Python 3.9.

re

  • Remove undocumented, never working, and deprecated re.template function and re.TEMPLATE flag (and re.T alias). (Contributed by Serhiy Storchaka and Nikita Sobolev in 105687.)

tkinter

  • Remove the !tkinter.tix module, deprecated in Python 3.6. The third-party Tix library which the module wrapped is unmaintained. (Contributed by Zachary Ware in 75552.)

turtle

  • Remove the !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 104876.)

typing

  • Namespaces typing.io and typing.re, deprecated in Python 3.8, are now removed. The items in those namespaces can be imported directly from typing. (Contributed by Sebastian Rittau in 92871.)
  • Remove support for the keyword-argument method of creating typing.TypedDict types, deprecated in Python 3.11. (Contributed by Tomas Roun in 104786.)

unittest

  • Removed the following unittest functions, deprecated in Python 3.11:

    • !unittest.findTestCases
    • !unittest.makeSuite
    • !unittest.getTestCaseNames

    Use ~unittest.TestLoader methods instead:

    • unittest.TestLoader.loadTestsFromModule
    • unittest.TestLoader.loadTestsFromTestCase
    • unittest.TestLoader.getTestCaseNames

    (Contributed by Hugo van Kemenade in 104835.)

  • Remove the untested and undocumented !unittest.TestProgram.usageExit method, deprecated in Python 3.11. (Contributed by Hugo van Kemenade in 104992.)

urllib

  • Remove cafile, capath and cadefault parameters of the urllib.request.urlopen function, deprecated in Python 3.6: use the context parameter instead. Please use ssl.SSLContext.load_cert_chain instead, or let ssl.create_default_context select the system's trusted CA certificates for you. (Contributed by Victor Stinner in 105382.)

webbrowser

  • Remove the untested and undocumented webbrowser !MacOSX class, deprecated in Python 3.11. Use the !MacOSXOSAScript class (introduced in Python 3.2) instead. (Contributed by Hugo van Kemenade in 104804.)
  • Remove deprecated webbrowser.MacOSXOSAScript._name attribute. Use webbrowser.MacOSXOSAScript.name <webbrowser.controller.name> attribute instead. (Contributed by Nikita Sobolev in 105546.)

Others

  • None yet

CPython bytecode changes

  • The oparg of YIELD_VALUE is now 1 if the yield is part of a yield-from or await, and 0 otherwise. The oparg of RESUME was changed to add a bit indicating whether the except-depth is 1, which is needed to optimize closing of generators. (Contributed by Irit Katriel in 111354.)

Porting to Python 3.13

This section lists previously described changes and other bugfixes that may require changes to your code.

Changes in the Python API

  • Functions :cPyDict_GetItem, :cPyDict_GetItemString, :cPyMapping_HasKey, :cPyMapping_HasKeyString, :cPyObject_HasAttr, :cPyObject_HasAttrString, and :cPySys_GetObject, which clear all errors which occurred when calling them, now report them using sys.unraisablehook. You may replace them with other functions as recommended in the documentation. (Contributed by Serhiy Storchaka in 106672.)
  • An OSError is now raised by getpass.getuser for any failure to retrieve a username, instead of ImportError on non-Unix platforms or KeyError on Unix platforms where the password database is empty.
  • The threading module now expects the !_thread module to have an _is_main_interpreter attribute. It is a function with no arguments that return True if the current interpreter is the main interpreter.

    Any library or application that provides a custom _thread module must provide _is_main_interpreter(), just like the module's other "private" attributes. (See 112826.)

  • mailbox.Maildir now ignores files with a leading dot. (Contributed by Zackery Spytz in 65559.)
  • pathlib.Path.glob and ~pathlib.Path.rglob now return both files and directories if a pattern that ends with "**" is given, rather than directories only. Users may add a trailing slash to match only directories.

Build Changes

  • Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate the configure script. (Contributed by Christian Heimes in 89886.)
  • SQLite 3.15.2 or newer is required to build the sqlite3 extension module. (Contributed by Erlend Aasland in 105875.)
  • Python built with configure --with-trace-refs (tracing references) is now ABI compatible with the Python release build and debug build <debug-build>. (Contributed by Victor Stinner in 108634.)
  • Building CPython now requires a compiler with support for the C11 atomic library, GCC built-in atomic functions, or MSVC interlocked intrinsics.
  • The errno, fcntl, grp, md5, pwd, resource, winsound, _ctypes_test, _multiprocessing.posixshmem, _scproxy, _stat, _testimportmultiple and _uuid C extensions are now built with the limited C API <limited-c-api>. (Contributed by Victor Stinner in 85283.)
  • wasm32-wasi is now a tier 2 platform. (Contributed by Brett Cannon in 115192.)
  • wasm32-emscripten is no longer a supported platform. (Contributed by Brett Cannon in 115192.)

C API Changes

New Features

  • You no longer have to define the PY_SSIZE_T_CLEAN macro before including Python.h when using # formats in format codes <arg-parsing-string-and-buffers>. APIs accepting the format codes always use Py_ssize_t for # formats. (Contributed by Inada Naoki in 104922.)
  • The keywords parameter of :cPyArg_ParseTupleAndKeywords and :cPyArg_VaParseTupleAndKeywords now has type :cchar * const * in C and :cconst char * const * in C++, instead of :cchar **. It makes these functions compatible with arguments of type :cconst char * const *, :cconst char ** or :cchar * const * in C++ and :cchar * const * in C without an explicit type cast. This can be overridden with the :cPY_CXX_CONST macro. (Contributed by Serhiy Storchaka in 65210.)
  • Add :cPyImport_AddModuleRef: similar to :cPyImport_AddModule, but return a strong reference instead of a borrowed reference. (Contributed by Victor Stinner in 105922.)
  • Add :cPyWeakref_GetRef function: similar to :cPyWeakref_GetObject but returns a strong reference, or NULL if the referent is no longer live. (Contributed by Victor Stinner in 105927.)
  • Add :cPyObject_GetOptionalAttr and :cPyObject_GetOptionalAttrString, variants of :cPyObject_GetAttr and :cPyObject_GetAttrString which don't raise AttributeError if the attribute is not found. These variants are more convenient and faster if the missing attribute should not be treated as a failure. (Contributed by Serhiy Storchaka in 106521.)
  • Add :cPyMapping_GetOptionalItem and :cPyMapping_GetOptionalItemString: variants of :cPyObject_GetItem and :cPyMapping_GetItemString which don't raise KeyError if the key is not found. These variants are more convenient and faster if the missing key should not be treated as a failure. (Contributed by Serhiy Storchaka in 106307.)
  • Add fixed variants of functions which silently ignore errors:

    • :cPyObject_HasAttrWithError replaces :cPyObject_HasAttr.
    • :cPyObject_HasAttrStringWithError replaces :cPyObject_HasAttrString.
    • :cPyMapping_HasKeyWithError replaces :cPyMapping_HasKey.
    • :cPyMapping_HasKeyStringWithError replaces :cPyMapping_HasKeyString.

    New functions return not only 1 for true and 0 for false, but also -1 for error.

    (Contributed by Serhiy Storchaka in 108511.)

  • If Python is built in debug mode <debug-build> or with assertions <--with-assertions>, :cPyTuple_SET_ITEM and :cPyList_SET_ITEM now check the index argument with an assertion. (Contributed by Victor Stinner in 106168.)
  • Add :cPyModule_Add function: similar to :cPyModule_AddObjectRef and :cPyModule_AddObject but always steals a reference to the value. (Contributed by Serhiy Storchaka in 86493.)
  • Add :cPyDict_GetItemRef and :cPyDict_GetItemStringRef functions: similar to :cPyDict_GetItemWithError but returning a strong reference instead of a borrowed reference. Moreover, these functions return -1 on error and so checking PyErr_Occurred() is not needed. (Contributed by Victor Stinner in 106004.)
  • Added :cPyDict_SetDefaultRef, which is similar to :cPyDict_SetDefault but returns a strong reference instead of a borrowed reference. This function returns -1 on error, 0 on insertion, and 1 if the key was already present in the dictionary. (Contributed by Sam Gross in 112066.)
  • Add :cPyDict_ContainsString function: same as :cPyDict_Contains, but key is specified as a :cconst char* UTF-8 encoded bytes string, rather than a :cPyObject*. (Contributed by Victor Stinner in 108314.)
  • Added :cPyList_GetItemRef function: similar to :cPyList_GetItem but returns a strong reference instead of a borrowed reference.
  • Add :cPy_IsFinalizing function: check if the main Python interpreter is shutting down <interpreter shutdown>. (Contributed by Victor Stinner in 108014.)
  • Add :cPyLong_AsInt function: similar to :cPyLong_AsLong, but store the result in a C :cint instead of a C :clong. Previously, it was known as the private function :c!_PyLong_AsInt (with an underscore prefix). (Contributed by Victor Stinner in 108014.)
  • Python built with configure --with-trace-refs (tracing references) now supports the Limited API <limited-c-api>. (Contributed by Victor Stinner in 108634.)
  • Add :cPyObject_VisitManagedDict and :cPyObject_ClearManagedDict functions which must be called by the traverse and clear functions of a type using :cPy_TPFLAGS_MANAGED_DICT flag. The pythoncapi-compat project can be used to get these functions on Python 3.11 and 3.12. (Contributed by Victor Stinner in 107073.)
  • Add :cPyUnicode_EqualToUTF8AndSize and :cPyUnicode_EqualToUTF8 functions: compare Unicode object with a :cconst char* UTF-8 encoded string and return true (1) if they are equal, or false (0) otherwise. These functions do not raise exceptions. (Contributed by Serhiy Storchaka in 110289.)
  • Add :cPyThreadState_GetUnchecked() function: similar to :cPyThreadState_Get(), but don't kill the process with a fatal error if it is NULL. The caller is responsible to check if the result is NULL. Previously, the function was private and known as _PyThreadState_UncheckedGet(). (Contributed by Victor Stinner in 108867.)
  • Add :cPySys_AuditTuple function: similar to :cPySys_Audit, but pass event arguments as a Python tuple object. (Contributed by Victor Stinner in 85283.)
  • :cPyArg_ParseTupleAndKeywords now supports non-ASCII keyword parameter names. (Contributed by Serhiy Storchaka in 110815.)
  • Add :cPyMem_RawMalloc, :cPyMem_RawCalloc, :cPyMem_RawRealloc and :cPyMem_RawFree to the limited C API (version 3.13). (Contributed by Victor Stinner in 85283.)
  • Add :cPySys_Audit and :cPySys_AuditTuple functions to the limited C API. (Contributed by Victor Stinner in 85283.)
  • Add :cPyErr_FormatUnraisable function: similar to :cPyErr_WriteUnraisable, but allow customizing the warning message. (Contributed by Serhiy Storchaka in 108082.)
  • Add :cPyList_Extend and :cPyList_Clear functions: similar to Python list.extend() and list.clear() methods. (Contributed by Victor Stinner in 111138.)
  • Add :cPyDict_Pop and :cPyDict_PopString functions: remove a key from a dictionary and optionally return the removed value. This is similar to dict.pop, but without the default value and not raising KeyError if the key is missing. (Contributed by Stefan Behnel and Victor Stinner in 111262.)
  • Add :cPy_HashPointer function to hash a pointer. (Contributed by Victor Stinner in 111545.)
  • Add PyTime C API:

    • :cPyTime_t type.
    • :cPyTime_MIN and :cPyTime_MAX constants.
    • :cPyTime_AsSecondsDouble :cPyTime_Monotonic, :cPyTime_PerfCounter, and :cPyTime_Time functions.

    (Contributed by Victor Stinner and Petr Viktorin in 110850.)

  • Add :cPyLong_AsNativeBytes, :cPyLong_FromNativeBytes and :cPyLong_FromUnsignedNativeBytes functions to simplify converting between native integer types and Python int objects. (Contributed by Steve Dower in 111140.)
  • Add :cPyType_GetFullyQualifiedName function to get the type's fully qualified name. Equivalent to f"{type.__module__}.{type.__qualname__}", or type.__qualname__ if type.__module__ is not a string or is equal to "builtins". (Contributed by Victor Stinner in 111696.)
  • Add :cPyType_GetModuleName function to get the type's module name. Equivalent to getting the type.__module__ attribute. (Contributed by Eric Snow and Victor Stinner in 111696.)
  • Add support for %T, %T#, %N and %N# formats to :cPyUnicode_FromFormat: format the fully qualified name of an object type and of a type: call :cPyType_GetModuleName. See 737 for more information. (Contributed by Victor Stinner in 111696.)

Porting to Python 3.13

  • Python.h no longer includes the <ieeefp.h> standard header. It was included for the finite() function which is now provided by the <math.h> header. It should now be included explicitly if needed. Remove also the HAVE_IEEEFP_H macro. (Contributed by Victor Stinner in 108765.)
  • Python.h no longer includes these standard header files: <time.h>, <sys/select.h> and <sys/time.h>. If needed, they should now be included explicitly. For example, <time.h> provides the clock() and gmtime() functions, <sys/select.h> provides the select() function, and <sys/time.h> provides the futimes(), gettimeofday() and setitimer() functions. (Contributed by Victor Stinner in 108765.)
  • If the :cPy_LIMITED_API macro is defined, :c!Py_BUILD_CORE, :c!Py_BUILD_CORE_BUILTIN and :c!Py_BUILD_CORE_MODULE macros are now undefined by <Python.h>. (Contributed by Victor Stinner in 85283.)
  • The old trashcan macros Py_TRASHCAN_SAFE_BEGIN and Py_TRASHCAN_SAFE_END were removed. They should be replaced by the new macros Py_TRASHCAN_BEGIN and Py_TRASHCAN_END.

    A tp_dealloc function that has the old macros, such as:

    static void
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_SAFE_BEGIN(p);
        ...
        Py_TRASHCAN_SAFE_END
    }

    should migrate to the new macros as follows:

    static void
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_BEGIN(p, mytype_dealloc)
        ...
        Py_TRASHCAN_END
    }

    Note that Py_TRASHCAN_BEGIN has a second argument which should be the deallocation function it is in.

  • On Windows, Python.h no longer includes the <stddef.h> standard header file. If needed, it should now be included explicitly. For example, it provides offsetof() function, and size_t and ptrdiff_t types. Including <stddef.h> explicitly was already needed by all other platforms, the HAVE_STDDEF_H macro is only defined on Windows. (Contributed by Victor Stinner in 108765.)

Deprecated

  • Passing optional arguments maxsplit, count and flags in module-level functions re.split, re.sub and re.subn as positional arguments is now deprecated. In future Python versions these parameters will be keyword-only <keyword-only_parameter>. (Contributed by Serhiy Storchaka in 56166.)
  • Deprecate the old Py_UNICODE and PY_UNICODE_TYPE types: use directly the :cwchar_t type instead. Since Python 3.3, Py_UNICODE and PY_UNICODE_TYPE are just aliases to :cwchar_t. (Contributed by Victor Stinner in 105156.)
  • Deprecate old Python initialization functions:

    • :cPySys_ResetWarnOptions: clear sys.warnoptions and !warnings.filters instead.
    • :cPy_GetExecPrefix: get sys.exec_prefix instead.
    • :cPy_GetPath: get sys.path instead.
    • :cPy_GetPrefix: get sys.prefix instead.
    • :cPy_GetProgramFullPath: get sys.executable instead.
    • :cPy_GetProgramName: get sys.executable instead.
    • :cPy_GetPythonHome: get :cPyConfig.home or PYTHONHOME environment variable instead.

    Functions scheduled for removal in Python 3.15. (Contributed by Victor Stinner in 105145.)

  • Deprecate the :cPyImport_ImportModuleNoBlock function which is just an alias to :cPyImport_ImportModule since Python 3.3. Scheduled for removal in Python 3.15. (Contributed by Victor Stinner in 105396.)
  • Deprecate the :cPyWeakref_GetObject and :cPyWeakref_GET_OBJECT functions, which return a borrowed reference: use the new :cPyWeakref_GetRef function instead, it returns a strong reference. The pythoncapi-compat project can be used to get :cPyWeakref_GetRef on Python 3.12 and older. (Contributed by Victor Stinner in 105927.)

Removed

  • Removed chained classmethod descriptors (introduced in 63272). This can no longer be used to wrap other descriptors such as property. The core design of this feature was flawed and caused a number of downstream problems. To "pass-through" a classmethod, consider using the !__wrapped__ attribute that was added in Python 3.10. (Contributed by Raymond Hettinger in 89519.)
  • Remove many APIs (functions, macros, variables) with names prefixed by _Py or _PY (considered as private API). If your project is affected by one of these removals and you consider that the removed API should remain available, please open a new issue to request a public C API and add cc @vstinner to the issue to notify Victor Stinner. (Contributed by Victor Stinner in 106320.)
  • Remove functions deprecated in Python 3.9:

    • PyEval_CallObject(), PyEval_CallObjectWithKeywords(): use :cPyObject_CallNoArgs or :cPyObject_Call instead. Warning: :cPyObject_Call positional arguments must be a tuple and must not be NULL, keyword arguments must be a dict or NULL, whereas removed functions checked arguments type and accepted NULL positional and keyword arguments. To replace PyEval_CallObjectWithKeywords(func, NULL, kwargs) with :cPyObject_Call, pass an empty tuple as positional arguments using :cPyTuple_New(0) <PyTuple_New>.
    • PyEval_CallFunction(): use :cPyObject_CallFunction instead.
    • PyEval_CallMethod(): use :cPyObject_CallMethod instead.
    • PyCFunction_Call(): use :cPyObject_Call instead.

    (Contributed by Victor Stinner in 105107.)

  • Remove old buffer protocols deprecated in Python 3.0. Use bufferobjects instead.

    • :c!PyObject_CheckReadBuffer: Use :cPyObject_CheckBuffer to test if the object supports the buffer protocol. Note that :cPyObject_CheckBuffer doesn't guarantee that :cPyObject_GetBuffer will succeed. To test if the object is actually readable, see the next example of :cPyObject_GetBuffer.
    • :c!PyObject_AsCharBuffer, :c!PyObject_AsReadBuffer: :cPyObject_GetBuffer and :cPyBuffer_Release instead:

      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!PyObject_AsWriteBuffer: Use :cPyObject_GetBuffer and :cPyBuffer_Release instead:

      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 85275.)

  • Remove the following old functions to configure the Python initialization, deprecated in Python 3.11:

    • PySys_AddWarnOptionUnicode(): use :cPyConfig.warnoptions instead.
    • PySys_AddWarnOption(): use :cPyConfig.warnoptions instead.
    • PySys_AddXOption(): use :cPyConfig.xoptions instead.
    • PySys_HasWarnOptions(): use :cPyConfig.xoptions instead.
    • PySys_SetArgvEx(): set :cPyConfig.argv instead.
    • PySys_SetArgv(): set :cPyConfig.argv instead.
    • PySys_SetPath(): set :cPyConfig.module_search_paths instead.
    • Py_SetPath(): set :cPyConfig.module_search_paths instead.
    • Py_SetProgramName(): set :cPyConfig.program_name instead.
    • Py_SetPythonHome(): set :cPyConfig.home instead.
    • Py_SetStandardStreamEncoding(): set :cPyConfig.stdio_encoding instead, and set also maybe :cPyConfig.legacy_windows_stdio (on Windows).
    • _Py_SetProgramFullPath(): set :cPyConfig.executable instead.

    Use the new :cPyConfig API of the Python Initialization Configuration <init-config> instead (587), added to Python 3.8. (Contributed by Victor Stinner in 105145.)

  • 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 105111.)
  • 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 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:

    • :cPyEval_SaveThread and :cPyEval_RestoreThread;
    • low-level :cPyEval_AcquireThread and :cPyEval_RestoreThread;
    • or :cPyGILState_Ensure and :cPyGILState_Release.

    (Contributed by Victor Stinner in 105182.)

  • Remove private _PyObject_FastCall() function: use PyObject_Vectorcall() which is available since Python 3.8 (590). (Contributed by Victor Stinner in 106023.)
  • Remove cpython/pytime.h header file: it only contained private functions. (Contributed by Victor Stinner in 106316.)
  • Remove _PyInterpreterState_Get() alias to :cPyInterpreterState_Get() which was kept for backward compatibility with Python 3.8. The pythoncapi-compat project can be used to get :cPyInterpreterState_Get() on Python 3.8 and older. (Contributed by Victor Stinner in 106320.)
  • The :cPyModule_AddObject function is now soft deprecated: :cPyModule_Add or :cPyModule_AddObjectRef functions should be used instead. (Contributed by Serhiy Storchaka in 86493.)

Pending Removal in Python 3.14

  • Creating immutable types (:cPy_TPFLAGS_IMMUTABLETYPE) with mutable bases using the C API.
  • Global configuration variables:

    • :cPy_DebugFlag: use :cPyConfig.parser_debug
    • :cPy_VerboseFlag: use :cPyConfig.verbose
    • :cPy_QuietFlag: use :cPyConfig.quiet
    • :cPy_InteractiveFlag: use :cPyConfig.interactive
    • :cPy_InspectFlag: use :cPyConfig.inspect
    • :cPy_OptimizeFlag: use :cPyConfig.optimization_level
    • :cPy_NoSiteFlag: use :cPyConfig.site_import
    • :cPy_BytesWarningFlag: use :cPyConfig.bytes_warning
    • :cPy_FrozenFlag: use :cPyConfig.pathconfig_warnings
    • :cPy_IgnoreEnvironmentFlag: use :cPyConfig.use_environment
    • :cPy_DontWriteBytecodeFlag: use :cPyConfig.write_bytecode
    • :cPy_NoUserSiteDirectory: use :cPyConfig.user_site_directory
    • :cPy_UnbufferedStdioFlag: use :cPyConfig.buffered_stdio
    • :cPy_HashRandomizationFlag: use :cPyConfig.use_hash_seed and :cPyConfig.hash_seed
    • :cPy_IsolatedFlag: use :cPyConfig.isolated
    • :cPy_LegacyWindowsFSEncodingFlag: use :cPyPreConfig.legacy_windows_fs_encoding
    • :cPy_LegacyWindowsStdioFlag: use :cPyConfig.legacy_windows_stdio
    • :c!Py_FileSystemDefaultEncoding: use :cPyConfig.filesystem_encoding
    • :c!Py_HasFileSystemDefaultEncoding: use :cPyConfig.filesystem_encoding
    • :c!Py_FileSystemDefaultEncodeErrors: use :cPyConfig.filesystem_errors
    • :c!Py_UTF8Mode: use :cPyPreConfig.utf8_mode (see :cPy_PreInitialize)

    The :cPy_InitializeFromConfig API should be used with :cPyConfig instead.

Pending Removal in Python 3.15

  • :cPyImport_ImportModuleNoBlock: use :cPyImport_ImportModule.
  • :cPyWeakref_GET_OBJECT: use :cPyWeakref_GetRef instead.
  • :cPyWeakref_GetObject: use :cPyWeakref_GetRef instead.
  • :c!Py_UNICODE_WIDE type: use :cwchar_t instead.
  • :cPy_UNICODE type: use :cwchar_t instead.
  • Python initialization functions:
    • :cPySys_ResetWarnOptions: clear sys.warnoptions and !warnings.filters instead.
    • :cPy_GetExecPrefix: get sys.exec_prefix instead.
    • :cPy_GetPath: get sys.path instead.
    • :cPy_GetPrefix: get sys.prefix instead.
    • :cPy_GetProgramFullPath: get sys.executable instead.
    • :cPy_GetProgramName: get sys.executable instead.
    • :cPy_GetPythonHome: get :cPyConfig.home or PYTHONHOME environment variable instead.

Pending Removal in Future Versions

The following APIs were deprecated in earlier Python versions and will be removed, although there is currently no date scheduled for their removal.

  • :cPy_TPFLAGS_HAVE_FINALIZE: no needed since Python 3.8.
  • :cPyErr_Fetch: use :cPyErr_GetRaisedException.
  • :cPyErr_NormalizeException: use :cPyErr_GetRaisedException.
  • :cPyErr_Restore: use :cPyErr_SetRaisedException.
  • :cPyModule_GetFilename: use :cPyModule_GetFilenameObject.
  • :cPyOS_AfterFork: use :cPyOS_AfterFork_Child().
  • :cPySlice_GetIndicesEx.
  • :c!PyUnicode_AsDecodedObject.
  • :c!PyUnicode_AsDecodedUnicode.
  • :c!PyUnicode_AsEncodedObject.
  • :c!PyUnicode_AsEncodedUnicode.
  • :cPyUnicode_READY: not needed since Python 3.12.
  • :c!_PyErr_ChainExceptions.
  • :c!PyBytesObject.ob_shash member: call :cPyObject_Hash instead.
  • :c!PyDictObject.ma_version_tag member.
  • TLS API:
    • :cPyThread_create_key: use :cPyThread_tss_alloc.
    • :cPyThread_delete_key: use :cPyThread_tss_free.
    • :cPyThread_set_key_value: use :cPyThread_tss_set.
    • :cPyThread_get_key_value: use :cPyThread_tss_get.
    • :cPyThread_delete_key_value: use :cPyThread_tss_delete.
    • :cPyThread_ReInitTLS: no longer needed.
  • Remove undocumented PY_TIMEOUT_MAX constant from the limited C API. (Contributed by Victor Stinner in 110014.)

Regression Test Changes

  • Python built with configure --with-pydebug now supports a -X presite=package.module <-X> command-line option. If used, it specifies a module that should be imported early in the lifecycle of the interpreter, before site.py is executed. (Contributed by Łukasz Langa in 110769.)