3279 lines
416 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" data-content_root="../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta property="og:title" content="Whats New In Python 3.12" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://docs.python.org/3/whatsnew/3.12.html" />
<meta property="og:site_name" content="Python documentation" />
<meta property="og:description" content="Editor, Adam Turner,. This article explains the new features in Python 3.12, compared to 3.11. Python 3.12 was released on October 2, 2023. For full details, see the changelog. Summary Release hi..." />
<meta property="og:image" content="https://docs.python.org/3/_static/og-image.png" />
<meta property="og:image:alt" content="Python documentation" />
<meta name="description" content="Editor, Adam Turner,. This article explains the new features in Python 3.12, compared to 3.11. Python 3.12 was released on October 2, 2023. For full details, see the changelog. Summary Release hi..." />
<meta property="og:image:width" content="200">
<meta property="og:image:height" content="200">
<meta name="theme-color" content="#3776ab">
<title>Whats New In Python 3.12 &#8212; Python 3.13.3 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=23252803" />
<link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=5349f25f" />
<script src="../_static/documentation_options.js?v=5d57ca2d"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/sidebar.js"></script>
<link rel="search" type="application/opensearchdescription+xml"
title="Search within Python 3.13.3 documentation"
href="../_static/opensearch.xml"/>
<link rel="author" title="About these documents" href="../about.html" />
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="copyright" title="Copyright" href="../copyright.html" />
<link rel="next" title="Whats New In Python 3.11" href="3.11.html" />
<link rel="prev" title="Whats New In Python 3.13" href="3.13.html" />
<link rel="canonical" href="https://docs.python.org/3/whatsnew/3.12.html">
<style>
@media only screen {
table.full-width-table {
width: 100%;
}
}
</style>
<link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
<script type="text/javascript" src="../_static/copybutton.js"></script>
<script type="text/javascript" src="../_static/menu.js"></script>
<script type="text/javascript" src="../_static/search-focus.js"></script>
<script type="text/javascript" src="../_static/themetoggle.js"></script>
<script type="text/javascript" src="../_static/rtd_switcher.js"></script>
<meta name="readthedocs-addons-api-version" content="1">
</head>
<body>
<div class="mobile-nav">
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
<nav class="nav-content" role="navigation">
<label for="menuToggler" class="toggler__label">
<span></span>
</label>
<span class="nav-items-wrapper">
<a href="https://www.python.org/" class="nav-logo">
<img src="../_static/py.svg" alt="Python logo"/>
</a>
<span class="version_switcher_placeholder"></span>
<form role="search" class="search" action="../search.html" method="get">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
<path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
</svg>
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
<input type="submit" value="Go"/>
</form>
</span>
</nav>
<div class="menu-wrapper">
<nav class="menu" role="navigation" aria-label="main navigation">
<div class="language_switcher_placeholder"></div>
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label>
<div>
<h3><a href="../contents.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Whats New In Python 3.12</a><ul>
<li><a class="reference internal" href="#summary-release-highlights">Summary Release highlights</a></li>
<li><a class="reference internal" href="#new-features">New Features</a><ul>
<li><a class="reference internal" href="#pep-695-type-parameter-syntax">PEP 695: Type Parameter Syntax</a></li>
<li><a class="reference internal" href="#pep-701-syntactic-formalization-of-f-strings">PEP 701: Syntactic formalization of f-strings</a></li>
<li><a class="reference internal" href="#pep-684-a-per-interpreter-gil">PEP 684: A Per-Interpreter GIL</a></li>
<li><a class="reference internal" href="#pep-669-low-impact-monitoring-for-cpython">PEP 669: Low impact monitoring for CPython</a></li>
<li><a class="reference internal" href="#pep-688-making-the-buffer-protocol-accessible-in-python">PEP 688: Making the buffer protocol accessible in Python</a></li>
<li><a class="reference internal" href="#pep-709-comprehension-inlining">PEP 709: Comprehension inlining</a></li>
<li><a class="reference internal" href="#improved-error-messages">Improved Error Messages</a></li>
</ul>
</li>
<li><a class="reference internal" href="#new-features-related-to-type-hints">New Features Related to Type Hints</a><ul>
<li><a class="reference internal" href="#pep-692-using-typeddict-for-more-precise-kwargs-typing">PEP 692: Using <code class="docutils literal notranslate"><span class="pre">TypedDict</span></code> for more precise <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code> typing</a></li>
<li><a class="reference internal" href="#pep-698-override-decorator-for-static-typing">PEP 698: Override Decorator for Static Typing</a></li>
</ul>
</li>
<li><a class="reference internal" href="#other-language-changes">Other Language Changes</a></li>
<li><a class="reference internal" href="#new-modules">New Modules</a></li>
<li><a class="reference internal" href="#improved-modules">Improved Modules</a><ul>
<li><a class="reference internal" href="#array">array</a></li>
<li><a class="reference internal" href="#asyncio">asyncio</a></li>
<li><a class="reference internal" href="#calendar">calendar</a></li>
<li><a class="reference internal" href="#csv">csv</a></li>
<li><a class="reference internal" href="#dis">dis</a></li>
<li><a class="reference internal" href="#fractions">fractions</a></li>
<li><a class="reference internal" href="#importlib-resources">importlib.resources</a></li>
<li><a class="reference internal" href="#inspect">inspect</a></li>
<li><a class="reference internal" href="#itertools">itertools</a></li>
<li><a class="reference internal" href="#math">math</a></li>
<li><a class="reference internal" href="#os">os</a></li>
<li><a class="reference internal" href="#os-path">os.path</a></li>
<li><a class="reference internal" href="#pathlib">pathlib</a></li>
<li><a class="reference internal" href="#platform">platform</a></li>
<li><a class="reference internal" href="#pdb">pdb</a></li>
<li><a class="reference internal" href="#random">random</a></li>
<li><a class="reference internal" href="#shutil">shutil</a></li>
<li><a class="reference internal" href="#sqlite3">sqlite3</a></li>
<li><a class="reference internal" href="#statistics">statistics</a></li>
<li><a class="reference internal" href="#sys">sys</a></li>
<li><a class="reference internal" href="#tempfile">tempfile</a></li>
<li><a class="reference internal" href="#threading">threading</a></li>
<li><a class="reference internal" href="#tkinter">tkinter</a></li>
<li><a class="reference internal" href="#tokenize">tokenize</a></li>
<li><a class="reference internal" href="#types">types</a></li>
<li><a class="reference internal" href="#typing">typing</a></li>
<li><a class="reference internal" href="#unicodedata">unicodedata</a></li>
<li><a class="reference internal" href="#unittest">unittest</a></li>
<li><a class="reference internal" href="#uuid">uuid</a></li>
</ul>
</li>
<li><a class="reference internal" href="#optimizations">Optimizations</a></li>
<li><a class="reference internal" href="#cpython-bytecode-changes">CPython bytecode changes</a></li>
<li><a class="reference internal" href="#demos-and-tools">Demos and Tools</a></li>
<li><a class="reference internal" href="#deprecated">Deprecated</a><ul>
<li><a class="reference internal" href="#pending-removal-in-python-3-13">Pending Removal in Python 3.13</a></li>
<li><a class="reference internal" href="#pending-removal-in-python-3-14">Pending Removal in Python 3.14</a></li>
<li><a class="reference internal" href="#pending-removal-in-python-3-15">Pending Removal in Python 3.15</a></li>
<li><a class="reference internal" href="#pending-removal-in-python-3-16">Pending removal in Python 3.16</a></li>
<li><a class="reference internal" href="#pending-removal-in-future-versions">Pending Removal in Future Versions</a></li>
</ul>
</li>
<li><a class="reference internal" href="#removed">Removed</a><ul>
<li><a class="reference internal" href="#asynchat-and-asyncore">asynchat and asyncore</a></li>
<li><a class="reference internal" href="#configparser">configparser</a></li>
<li><a class="reference internal" href="#distutils">distutils</a></li>
<li><a class="reference internal" href="#ensurepip">ensurepip</a></li>
<li><a class="reference internal" href="#enum">enum</a></li>
<li><a class="reference internal" href="#ftplib">ftplib</a></li>
<li><a class="reference internal" href="#gzip">gzip</a></li>
<li><a class="reference internal" href="#hashlib">hashlib</a></li>
<li><a class="reference internal" href="#importlib">importlib</a></li>
<li><a class="reference internal" href="#imp">imp</a></li>
<li><a class="reference internal" href="#io">io</a></li>
<li><a class="reference internal" href="#locale">locale</a></li>
<li><a class="reference internal" href="#smtpd">smtpd</a></li>
<li><a class="reference internal" href="#id2">sqlite3</a></li>
<li><a class="reference internal" href="#ssl">ssl</a></li>
<li><a class="reference internal" href="#id3">unittest</a></li>
<li><a class="reference internal" href="#webbrowser">webbrowser</a></li>
<li><a class="reference internal" href="#xml-etree-elementtree">xml.etree.ElementTree</a></li>
<li><a class="reference internal" href="#zipimport">zipimport</a></li>
<li><a class="reference internal" href="#others">Others</a></li>
</ul>
</li>
<li><a class="reference internal" href="#porting-to-python-3-12">Porting to Python 3.12</a><ul>
<li><a class="reference internal" href="#changes-in-the-python-api">Changes in the Python API</a></li>
</ul>
</li>
<li><a class="reference internal" href="#build-changes">Build Changes</a></li>
<li><a class="reference internal" href="#c-api-changes">C API Changes</a><ul>
<li><a class="reference internal" href="#id4">New Features</a></li>
<li><a class="reference internal" href="#id5">Porting to Python 3.12</a></li>
<li><a class="reference internal" href="#id6">Deprecated</a><ul>
<li><a class="reference internal" href="#id7">Pending Removal in Python 3.14</a></li>
<li><a class="reference internal" href="#id8">Pending Removal in Python 3.15</a></li>
<li><a class="reference internal" href="#id9">Pending Removal in Future Versions</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id10">Removed</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div>
<h4>Previous topic</h4>
<p class="topless"><a href="3.13.html"
title="previous chapter">Whats New In Python 3.13</a></p>
</div>
<div>
<h4>Next topic</h4>
<p class="topless"><a href="3.11.html"
title="next chapter">Whats New In Python 3.11</a></p>
</div>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">Report a Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/main/Doc/whatsnew/3.12.rst"
rel="nofollow">Show Source
</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
<div class="related" role="navigation" aria-label="Related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="3.11.html" title="Whats New In Python 3.11"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="3.13.html" title="Whats New In Python 3.13"
accesskey="P">previous</a> |</li>
<li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.13.3 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Whats New in Python</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">Whats New In Python 3.12</a></li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
<input type="submit" value="Go" />
</form>
</div>
|
</li>
<li class="right">
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label> |</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="what-s-new-in-python-3-12">
<h1>Whats New In Python 3.12<a class="headerlink" href="#what-s-new-in-python-3-12" title="Link to this heading"></a></h1>
<dl class="field-list simple">
<dt class="field-odd">Editor<span class="colon">:</span></dt>
<dd class="field-odd"><p>Adam Turner</p>
</dd>
</dl>
<p>This article explains the new features in Python 3.12, compared to 3.11.
Python 3.12 was released on October 2, 2023.
For full details, see the <a class="reference internal" href="changelog.html#changelog"><span class="std std-ref">changelog</span></a>.</p>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><span class="target" id="index-0"></span><a class="pep reference external" href="https://peps.python.org/pep-0693/"><strong>PEP 693</strong></a> Python 3.12 Release Schedule</p>
</div>
<section id="summary-release-highlights">
<h2>Summary Release highlights<a class="headerlink" href="#summary-release-highlights" title="Link to this heading"></a></h2>
<p>Python 3.12 is a stable release of the Python programming language,
with a mix of changes to the language and the standard library.
The library changes focus on cleaning up deprecated APIs, usability, and correctness.
Of note, the <code class="xref py py-mod docutils literal notranslate"><span class="pre">distutils</span></code> package has been removed from the standard library.
Filesystem support in <a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a> and <a class="reference internal" href="../library/pathlib.html#module-pathlib" title="pathlib: Object-oriented filesystem paths"><code class="xref py py-mod docutils literal notranslate"><span class="pre">pathlib</span></code></a> has seen a number of improvements,
and several modules have better performance.</p>
<p>The language changes focus on usability,
as <a class="reference internal" href="../glossary.html#term-f-string"><span class="xref std std-term">f-strings</span></a> have had many limitations removed
and Did you mean …’ suggestions continue to improve.
The new <a class="reference internal" href="#whatsnew312-pep695"><span class="std std-ref">type parameter syntax</span></a>
and <a class="reference internal" href="../reference/simple_stmts.html#type"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">type</span></code></a> statement improve ergonomics for using <a class="reference internal" href="../glossary.html#term-generic-type"><span class="xref std std-term">generic types</span></a> and <a class="reference internal" href="../glossary.html#term-type-alias"><span class="xref std std-term">type aliases</span></a> with static type checkers.</p>
<p>This article doesnt attempt to provide a complete specification of all new features,
but instead gives a convenient overview.
For full details, you should refer to the documentation,
such as the <a class="reference internal" href="../library/index.html#library-index"><span class="std std-ref">Library Reference</span></a>
and <a class="reference internal" href="../reference/index.html#reference-index"><span class="std std-ref">Language Reference</span></a>.
If you want to understand the complete implementation and design rationale for a change,
refer to the PEP for a particular new feature;
but note that PEPs usually are not kept up-to-date
once a feature has been fully implemented.</p>
<hr class="docutils" />
<p>New syntax features:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#whatsnew312-pep695"><span class="std std-ref">PEP 695</span></a>, type parameter syntax and the <a class="reference internal" href="../reference/simple_stmts.html#type"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">type</span></code></a> statement</p></li>
</ul>
<p>New grammar features:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#whatsnew312-pep701"><span class="std std-ref">PEP 701</span></a>, <a class="reference internal" href="../glossary.html#term-f-string"><span class="xref std std-term">f-strings</span></a> in the grammar</p></li>
</ul>
<p>Interpreter improvements:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#whatsnew312-pep684"><span class="std std-ref">PEP 684</span></a>, a unique per-interpreter <a class="reference internal" href="../glossary.html#term-global-interpreter-lock"><span class="xref std std-term">GIL</span></a></p></li>
<li><p><a class="reference internal" href="#whatsnew312-pep669"><span class="std std-ref">PEP 669</span></a>, low impact monitoring</p></li>
<li><p><a class="reference internal" href="#improved-error-messages">Improved Did you mean …’ suggestions</a>
for <a class="reference internal" href="../library/exceptions.html#NameError" title="NameError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NameError</span></code></a>, <a class="reference internal" href="../library/exceptions.html#ImportError" title="ImportError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ImportError</span></code></a>, and <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> exceptions</p></li>
</ul>
<p>Python data model improvements:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#whatsnew312-pep688"><span class="std std-ref">PEP 688</span></a>, using the <a class="reference internal" href="../c-api/buffer.html#bufferobjects"><span class="std std-ref">buffer protocol</span></a> from Python</p></li>
</ul>
<p>Significant improvements in the standard library:</p>
<ul class="simple">
<li><p>The <a class="reference internal" href="../library/pathlib.html#pathlib.Path" title="pathlib.Path"><code class="xref py py-class docutils literal notranslate"><span class="pre">pathlib.Path</span></code></a> class now supports subclassing</p></li>
<li><p>The <a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a> module received several improvements for Windows support</p></li>
<li><p>A <a class="reference internal" href="../library/sqlite3.html#sqlite3-cli"><span class="std std-ref">command-line interface</span></a> has been added to the
<a class="reference internal" href="../library/sqlite3.html#module-sqlite3" title="sqlite3: A DB-API 2.0 implementation using SQLite 3.x."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sqlite3</span></code></a> module</p></li>
<li><p><a class="reference internal" href="../library/functions.html#isinstance" title="isinstance"><code class="xref py py-func docutils literal notranslate"><span class="pre">isinstance()</span></code></a> checks against <a class="reference internal" href="../library/typing.html#typing.runtime_checkable" title="typing.runtime_checkable"><code class="xref py py-func docutils literal notranslate"><span class="pre">runtime-checkable</span> <span class="pre">protocols</span></code></a> enjoy a speed up of between two and 20 times</p></li>
<li><p>The <a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a> package has had a number of performance improvements,
with some benchmarks showing a 75% speed up.</p></li>
<li><p>A <a class="reference internal" href="../library/uuid.html#uuid-cli"><span class="std std-ref">command-line interface</span></a> has been added to the
<a class="reference internal" href="../library/uuid.html#module-uuid" title="uuid: UUID objects (universally unique identifiers) according to RFC 4122"><code class="xref py py-mod docutils literal notranslate"><span class="pre">uuid</span></code></a> module</p></li>
<li><p>Due to the changes in <a class="reference internal" href="#whatsnew312-pep701"><span class="std std-ref">PEP 701</span></a>,
producing tokens via the <a class="reference internal" href="../library/tokenize.html#module-tokenize" title="tokenize: Lexical scanner for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tokenize</span></code></a> module is up to 64% faster.</p></li>
</ul>
<p>Security improvements:</p>
<ul class="simple">
<li><p>Replace the builtin <a class="reference internal" href="../library/hashlib.html#module-hashlib" title="hashlib: Secure hash and message digest algorithms."><code class="xref py py-mod docutils literal notranslate"><span class="pre">hashlib</span></code></a> implementations of
SHA1, SHA3, SHA2-384, SHA2-512, and MD5 with formally verified code from the
<a class="reference external" href="https://github.com/hacl-star/hacl-star/">HACL*</a> project.
These builtin implementations remain as fallbacks that are only used when
OpenSSL does not provide them.</p></li>
</ul>
<p>C API improvements:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#whatsnew312-pep697"><span class="std std-ref">PEP 697</span></a>, unstable C API tier</p></li>
<li><p><a class="reference internal" href="#whatsnew312-pep683"><span class="std std-ref">PEP 683</span></a>, immortal objects</p></li>
</ul>
<p>CPython implementation improvements:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#whatsnew312-pep709"><span class="std std-ref">PEP 709</span></a>, comprehension inlining</p></li>
<li><p><a class="reference internal" href="../howto/perf_profiling.html#perf-profiling"><span class="std std-ref">CPython support</span></a> for the Linux <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler</p></li>
<li><p>Implement stack overflow protection on supported platforms</p></li>
</ul>
<p>New typing features:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#whatsnew312-pep692"><span class="std std-ref">PEP 692</span></a>, using <a class="reference internal" href="../library/typing.html#typing.TypedDict" title="typing.TypedDict"><code class="xref py py-class docutils literal notranslate"><span class="pre">TypedDict</span></code></a> to
annotate <a class="reference internal" href="../glossary.html#term-argument"><span class="xref std std-term">**kwargs</span></a></p></li>
<li><p><a class="reference internal" href="#whatsnew312-pep698"><span class="std std-ref">PEP 698</span></a>, <a class="reference internal" href="../library/typing.html#typing.override" title="typing.override"><code class="xref py py-func docutils literal notranslate"><span class="pre">typing.override()</span></code></a> decorator</p></li>
</ul>
<p>Important deprecations, removals or restrictions:</p>
<ul class="simple">
<li><p><span class="target" id="index-1"></span><a class="pep reference external" href="https://peps.python.org/pep-0623/"><strong>PEP 623</strong></a>: Remove <code class="docutils literal notranslate"><span class="pre">wstr</span></code> from Unicode objects in Pythons C API,
reducing the size of every <a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a> object by at least 8 bytes.</p></li>
<li><p><span class="target" id="index-2"></span><a class="pep reference external" href="https://peps.python.org/pep-0632/"><strong>PEP 632</strong></a>: Remove the <code class="xref py py-mod docutils literal notranslate"><span class="pre">distutils</span></code> package.
See <span class="target" id="index-3"></span><a class="pep reference external" href="https://peps.python.org/pep-0632/#migration-advice"><strong>the migration guide</strong></a>
for advice replacing the APIs it provided.
The third-party <a class="reference external" href="https://setuptools.pypa.io/en/latest/deprecated/distutils-legacy.html">Setuptools</a>
package continues to provide <code class="xref py py-mod docutils literal notranslate"><span class="pre">distutils</span></code>,
if you still require it in Python 3.12 and beyond.</p></li>
<li><p><a class="reference external" href="https://github.com/python/cpython/issues/95299">gh-95299</a>: Do not pre-install <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> in virtual environments
created with <a class="reference internal" href="../library/venv.html#module-venv" title="venv: Creation of virtual environments."><code class="xref py py-mod docutils literal notranslate"><span class="pre">venv</span></code></a>.
This means that <code class="docutils literal notranslate"><span class="pre">distutils</span></code>, <code class="docutils literal notranslate"><span class="pre">setuptools</span></code>, <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code>,
and <code class="docutils literal notranslate"><span class="pre">easy_install</span></code> will no longer available by default; to access these
run <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">setuptools</span></code> in the <a class="reference internal" href="../library/venv.html#venv-explanation"><span class="std std-ref">activated</span></a>
virtual environment.</p></li>
<li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code>, and <code class="xref py py-mod docutils literal notranslate"><span class="pre">imp</span></code> modules have been
removed, along with several <a class="reference internal" href="../library/unittest.html#unittest.TestCase" title="unittest.TestCase"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestCase</span></code></a>
<a class="reference internal" href="#unittest-testcase-removed-aliases">method aliases</a>.</p></li>
</ul>
</section>
<section id="new-features">
<h2>New Features<a class="headerlink" href="#new-features" title="Link to this heading"></a></h2>
<section id="pep-695-type-parameter-syntax">
<span id="whatsnew312-pep695"></span><h3>PEP 695: Type Parameter Syntax<a class="headerlink" href="#pep-695-type-parameter-syntax" title="Link to this heading"></a></h3>
<p>Generic classes and functions under <span class="target" id="index-4"></span><a class="pep reference external" href="https://peps.python.org/pep-0484/"><strong>PEP 484</strong></a> were declared using a verbose syntax
that left the scope of type parameters unclear and required explicit declarations of
variance.</p>
<p><span class="target" id="index-5"></span><a class="pep reference external" href="https://peps.python.org/pep-0695/"><strong>PEP 695</strong></a> introduces a new, more compact and explicit way to create
<a class="reference internal" href="../reference/compound_stmts.html#generic-classes"><span class="std std-ref">generic classes</span></a> and <a class="reference internal" href="../reference/compound_stmts.html#generic-functions"><span class="std std-ref">functions</span></a>:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">max</span><span class="p">[</span><span class="n">T</span><span class="p">](</span><span class="n">args</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="n">T</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">T</span><span class="p">:</span>
<span class="o">...</span>
<span class="k">class</span><span class="w"> </span><span class="nc">list</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="o">/</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">T</span><span class="p">:</span>
<span class="o">...</span>
<span class="k">def</span><span class="w"> </span><span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">:</span> <span class="n">T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="o">...</span>
</pre></div>
</div>
<p>In addition, the PEP introduces a new way to declare <a class="reference internal" href="../library/typing.html#type-aliases"><span class="std std-ref">type aliases</span></a>
using the <a class="reference internal" href="../reference/simple_stmts.html#type"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">type</span></code></a> statement, which creates an instance of
<a class="reference internal" href="../library/typing.html#typing.TypeAliasType" title="typing.TypeAliasType"><code class="xref py py-class docutils literal notranslate"><span class="pre">TypeAliasType</span></code></a>:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="nb">type</span> <span class="n">Point</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">float</span><span class="p">,</span> <span class="nb">float</span><span class="p">]</span>
</pre></div>
</div>
<p>Type aliases can also be <a class="reference internal" href="../reference/compound_stmts.html#generic-type-aliases"><span class="std std-ref">generic</span></a>:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="nb">type</span> <span class="n">Point</span><span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">[</span><span class="n">T</span><span class="p">,</span> <span class="n">T</span><span class="p">]</span>
</pre></div>
</div>
<p>The new syntax allows declaring <a class="reference internal" href="../library/typing.html#typing.TypeVarTuple" title="typing.TypeVarTuple"><code class="xref py py-class docutils literal notranslate"><span class="pre">TypeVarTuple</span></code></a>
and <a class="reference internal" href="../library/typing.html#typing.ParamSpec" title="typing.ParamSpec"><code class="xref py py-class docutils literal notranslate"><span class="pre">ParamSpec</span></code></a> parameters, as well as <a class="reference internal" href="../library/typing.html#typing.TypeVar" title="typing.TypeVar"><code class="xref py py-class docutils literal notranslate"><span class="pre">TypeVar</span></code></a>
parameters with bounds or constraints:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="nb">type</span> <span class="n">IntFunc</span><span class="p">[</span><span class="o">**</span><span class="n">P</span><span class="p">]</span> <span class="o">=</span> <span class="n">Callable</span><span class="p">[</span><span class="n">P</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="c1"># ParamSpec</span>
<span class="nb">type</span> <span class="n">LabeledTuple</span><span class="p">[</span><span class="o">*</span><span class="n">Ts</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="n">Ts</span><span class="p">]</span> <span class="c1"># TypeVarTuple</span>
<span class="nb">type</span> <span class="n">HashableSequence</span><span class="p">[</span><span class="n">T</span><span class="p">:</span> <span class="n">Hashable</span><span class="p">]</span> <span class="o">=</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="c1"># TypeVar with bound</span>
<span class="nb">type</span> <span class="n">IntOrStrSequence</span><span class="p">[</span><span class="n">T</span><span class="p">:</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">)]</span> <span class="o">=</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="c1"># TypeVar with constraints</span>
</pre></div>
</div>
<p>The value of type aliases and the bound and constraints of type variables
created through this syntax are evaluated only on demand (see
<a class="reference internal" href="../reference/executionmodel.html#lazy-evaluation"><span class="std std-ref">lazy evaluation</span></a>). This means type aliases are able to
refer to other types defined later in the file.</p>
<p>Type parameters declared through a type parameter list are visible within the
scope of the declaration and any nested scopes, but not in the outer scope. For
example, they can be used in the type annotations for the methods of a generic
class or in the class body. However, they cannot be used in the module scope after
the class is defined. See <a class="reference internal" href="../reference/compound_stmts.html#type-params"><span class="std std-ref">Type parameter lists</span></a> for a detailed description of the
runtime semantics of type parameters.</p>
<p>In order to support these scoping semantics, a new kind of scope is introduced,
the <a class="reference internal" href="../reference/executionmodel.html#annotation-scopes"><span class="std std-ref">annotation scope</span></a>. Annotation scopes behave for the
most part like function scopes, but interact differently with enclosing class scopes.
In Python 3.13, <a class="reference internal" href="../glossary.html#term-annotation"><span class="xref std std-term">annotations</span></a> will also be evaluated in
annotation scopes.</p>
<p>See <span class="target" id="index-6"></span><a class="pep reference external" href="https://peps.python.org/pep-0695/"><strong>PEP 695</strong></a> for more details.</p>
<p>(PEP written by Eric Traut. Implementation by Jelle Zijlstra, Eric Traut,
and others in <a class="reference external" href="https://github.com/python/cpython/issues/103764">gh-103764</a>.)</p>
</section>
<section id="pep-701-syntactic-formalization-of-f-strings">
<span id="whatsnew312-pep701"></span><h3>PEP 701: Syntactic formalization of f-strings<a class="headerlink" href="#pep-701-syntactic-formalization-of-f-strings" title="Link to this heading"></a></h3>
<p><span class="target" id="index-7"></span><a class="pep reference external" href="https://peps.python.org/pep-0701/"><strong>PEP 701</strong></a> lifts some restrictions on the usage of <a class="reference internal" href="../glossary.html#term-f-string"><span class="xref std std-term">f-strings</span></a>.
Expression components inside f-strings can now be any valid Python expression,
including strings reusing the same quote as the containing f-string,
multi-line expressions, comments, backslashes, and unicode escape sequences.
Lets cover these in detail:</p>
<ul>
<li><p>Quote reuse: in Python 3.11, reusing the same quotes as the enclosing f-string
raises a <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>, forcing the user to either use other available
quotes (like using double quotes or triple quotes if the f-string uses single
quotes). In Python 3.12, you can now do things like this:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">songs</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Take me back to Eden&#39;</span><span class="p">,</span> <span class="s1">&#39;Alkaline&#39;</span><span class="p">,</span> <span class="s1">&#39;Ascensionism&#39;</span><span class="p">]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="sa">f</span><span class="s2">&quot;This is the playlist: </span><span class="si">{</span><span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">songs</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="go">&#39;This is the playlist: Take me back to Eden, Alkaline, Ascensionism&#39;</span>
</pre></div>
</div>
<p>Note that before this change there was no explicit limit in how f-strings can
be nested, but the fact that string quotes cannot be reused inside the
expression component of f-strings made it impossible to nest f-strings
arbitrarily. In fact, this is the most nested f-string that could be written:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="sa">f</span><span class="s2">&quot;&quot;&quot;</span><span class="si">{</span><span class="sa">f</span><span class="s1">&#39;&#39;&#39;</span><span class="si">{</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="mi">1</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s1">&#39;</span><span class="si">}</span><span class="s1">&#39;&#39;&#39;</span><span class="si">}</span><span class="s2">&quot;&quot;&quot;</span>
<span class="go">&#39;2&#39;</span>
</pre></div>
</div>
<p>As now f-strings can contain any valid Python expression inside expression
components, it is now possible to nest f-strings arbitrarily:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="mi">1</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="go">&#39;2&#39;</span>
</pre></div>
</div>
</li>
<li><p>Multi-line expressions and comments: In Python 3.11, f-string expressions
must be defined in a single line, even if the expression within the f-string
could normally span multiple lines
(like literal lists being defined over multiple lines),
making them harder to read. In Python 3.12 you can now define f-strings
spanning multiple lines, and add inline comments:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span>&gt;&gt;&gt; f&quot;This is the playlist: {&quot;, &quot;.join([
... &#39;Take me back to Eden&#39;, # My, my, those eyes like fire
... &#39;Alkaline&#39;, # Not acid nor alkaline
... &#39;Ascensionism&#39; # Take to the broken skies at last
... ])}&quot;
&#39;This is the playlist: Take me back to Eden, Alkaline, Ascensionism&#39;
</pre></div>
</div>
</li>
<li><p>Backslashes and unicode characters: before Python 3.12 f-string expressions
couldnt contain any <code class="docutils literal notranslate"><span class="pre">\</span></code> character. This also affected unicode <a class="reference internal" href="../reference/lexical_analysis.html#escape-sequences"><span class="std std-ref">escape
sequences</span></a> (such as <code class="docutils literal notranslate"><span class="pre">\N{snowman}</span></code>) as these contain
the <code class="docutils literal notranslate"><span class="pre">\N</span></code> part that previously could not be part of expression components of
f-strings. Now, you can define expressions like this:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;This is the playlist: </span><span class="si">{</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">songs</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="go">This is the playlist: Take me back to Eden</span>
<span class="go">Alkaline</span>
<span class="go">Ascensionism</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;This is the playlist: </span><span class="si">{</span><span class="s2">&quot;</span><span class="se">\N{BLACK HEART SUIT}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">songs</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="go">This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism</span>
</pre></div>
</div>
</li>
</ul>
<p>See <span class="target" id="index-8"></span><a class="pep reference external" href="https://peps.python.org/pep-0701/"><strong>PEP 701</strong></a> for more details.</p>
<p>As a positive side-effect of how this feature has been implemented (by parsing f-strings
with <span class="target" id="index-9"></span><a class="pep reference external" href="https://peps.python.org/pep-0617/"><strong>the PEG parser</strong></a>), now error messages for f-strings are more precise
and include the exact location of the error. For example, in Python 3.11, the following
f-string raises a <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">my_string</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">x</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="n">y</span><span class="si">}</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span>
File <span class="nb">&quot;&lt;stdin&gt;&quot;</span>, line <span class="m">1</span>
<span class="w"> </span><span class="p">(</span><span class="n">x</span> <span class="n">z</span> <span class="n">y</span><span class="p">)</span>
<span class="w"> </span><span class="pm">^^^</span>
<span class="gr">SyntaxError</span>: <span class="n">f-string: invalid syntax. Perhaps you forgot a comma?</span>
</pre></div>
</div>
<p>but the error message doesnt include the exact location of the error within the line and
also has the expression artificially surrounded by parentheses. In Python 3.12, as f-strings
are parsed with the PEG parser, error messages can be more precise and show the entire line:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">my_string</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">x</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="n">y</span><span class="si">}</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span>
File <span class="nb">&quot;&lt;stdin&gt;&quot;</span>, line <span class="m">1</span>
<span class="w"> </span><span class="n">my_string</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">x</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="n">y</span><span class="si">}</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="w"> </span><span class="pm">^^^</span>
<span class="gr">SyntaxError</span>: <span class="n">invalid syntax. Perhaps you forgot a comma?</span>
</pre></div>
</div>
<p>(Contributed by Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián
Maureira-Fredes and Marta Gómez in <a class="reference external" href="https://github.com/python/cpython/issues/102856">gh-102856</a>. PEP written by Pablo Galindo,
Batuhan Taskaya, Lysandros Nikolaou and Marta Gómez).</p>
</section>
<section id="pep-684-a-per-interpreter-gil">
<span id="whatsnew312-pep684"></span><h3>PEP 684: A Per-Interpreter GIL<a class="headerlink" href="#pep-684-a-per-interpreter-gil" title="Link to this heading"></a></h3>
<p><span class="target" id="index-10"></span><a class="pep reference external" href="https://peps.python.org/pep-0684/"><strong>PEP 684</strong></a> introduces a per-interpreter <a class="reference internal" href="../glossary.html#term-global-interpreter-lock"><span class="xref std std-term">GIL</span></a>,
so that sub-interpreters may now be created with a unique GIL per interpreter.
This allows Python programs to take full advantage of multiple CPU
cores. This is currently only available through the C-API,
though a Python API is <span class="target" id="index-11"></span><a class="pep reference external" href="https://peps.python.org/pep-0554/"><strong>anticipated for 3.13</strong></a>.</p>
<p>Use the new <a class="reference internal" href="../c-api/init.html#c.Py_NewInterpreterFromConfig" title="Py_NewInterpreterFromConfig"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_NewInterpreterFromConfig()</span></code></a> function to
create an interpreter with its own GIL:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">PyInterpreterConfig</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">check_multi_interp_extensions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">gil</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PyInterpreterConfig_OWN_GIL</span><span class="p">,</span>
<span class="p">};</span>
<span class="n">PyThreadState</span><span class="w"> </span><span class="o">*</span><span class="n">tstate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="n">PyStatus</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Py_NewInterpreterFromConfig</span><span class="p">(</span><span class="o">&amp;</span><span class="n">tstate</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">config</span><span class="p">);</span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">PyStatus_Exception</span><span class="p">(</span><span class="n">status</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="p">}</span>
<span class="cm">/* The new interpreter is now active in the current thread. */</span>
</pre></div>
</div>
<p>For further examples how to use the C-API for sub-interpreters with a
per-interpreter GIL, see <code class="docutils literal notranslate"><span class="pre">Modules/_xxsubinterpretersmodule.c</span></code>.</p>
<p>(Contributed by Eric Snow in <a class="reference external" href="https://github.com/python/cpython/issues/104210">gh-104210</a>, etc.)</p>
</section>
<section id="pep-669-low-impact-monitoring-for-cpython">
<span id="whatsnew312-pep669"></span><h3>PEP 669: Low impact monitoring for CPython<a class="headerlink" href="#pep-669-low-impact-monitoring-for-cpython" title="Link to this heading"></a></h3>
<p><span class="target" id="index-12"></span><a class="pep reference external" href="https://peps.python.org/pep-0669/"><strong>PEP 669</strong></a> defines a new <a class="reference internal" href="../library/sys.monitoring.html#module-sys.monitoring" title="sys.monitoring: Access and control event monitoring"><code class="xref py py-mod docutils literal notranslate"><span class="pre">API</span></code></a> for profilers,
debuggers, and other tools to monitor events in CPython.
It covers a wide range of events, including calls,
returns, lines, exceptions, jumps, and more.
This means that you only pay for what you use, providing support
for near-zero overhead debuggers and coverage tools.
See <a class="reference internal" href="../library/sys.monitoring.html#module-sys.monitoring" title="sys.monitoring: Access and control event monitoring"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sys.monitoring</span></code></a> for details.</p>
<p>(Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/103082">gh-103082</a>.)</p>
</section>
<section id="pep-688-making-the-buffer-protocol-accessible-in-python">
<span id="whatsnew312-pep688"></span><h3>PEP 688: Making the buffer protocol accessible in Python<a class="headerlink" href="#pep-688-making-the-buffer-protocol-accessible-in-python" title="Link to this heading"></a></h3>
<p><span class="target" id="index-13"></span><a class="pep reference external" href="https://peps.python.org/pep-0688/"><strong>PEP 688</strong></a> introduces a way to use the <a class="reference internal" href="../c-api/buffer.html#bufferobjects"><span class="std std-ref">buffer protocol</span></a>
from Python code. Classes that implement the <a class="reference internal" href="../reference/datamodel.html#object.__buffer__" title="object.__buffer__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__buffer__()</span></code></a> method
are now usable as buffer types.</p>
<p>The new <a class="reference internal" href="../library/collections.abc.html#collections.abc.Buffer" title="collections.abc.Buffer"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Buffer</span></code></a> ABC provides a standard
way to represent buffer objects, for example in type annotations.
The new <a class="reference internal" href="../library/inspect.html#inspect.BufferFlags" title="inspect.BufferFlags"><code class="xref py py-class docutils literal notranslate"><span class="pre">inspect.BufferFlags</span></code></a> enum represents the flags that
can be used to customize buffer creation.
(Contributed by Jelle Zijlstra in <a class="reference external" href="https://github.com/python/cpython/issues/102500">gh-102500</a>.)</p>
</section>
<section id="pep-709-comprehension-inlining">
<span id="whatsnew312-pep709"></span><h3>PEP 709: Comprehension inlining<a class="headerlink" href="#pep-709-comprehension-inlining" title="Link to this heading"></a></h3>
<p>Dictionary, list, and set comprehensions are now inlined, rather than creating a
new single-use function object for each execution of the comprehension. This
speeds up execution of a comprehension by up to two times.
See <span class="target" id="index-14"></span><a class="pep reference external" href="https://peps.python.org/pep-0709/"><strong>PEP 709</strong></a> for further details.</p>
<p>Comprehension iteration variables remain isolated and dont overwrite a
variable of the same name in the outer scope, nor are they visible after the
comprehension. Inlining does result in a few visible behavior changes:</p>
<ul class="simple">
<li><p>There is no longer a separate frame for the comprehension in tracebacks,
and tracing/profiling no longer shows the comprehension as a function call.</p></li>
<li><p>The <a class="reference internal" href="../library/symtable.html#module-symtable" title="symtable: Interface to the compiler's internal symbol tables."><code class="xref py py-mod docutils literal notranslate"><span class="pre">symtable</span></code></a> module will no longer produce child symbol tables for each
comprehension; instead, the comprehensions locals will be included in the
parent functions symbol table.</p></li>
<li><p>Calling <a class="reference internal" href="../library/functions.html#locals" title="locals"><code class="xref py py-func docutils literal notranslate"><span class="pre">locals()</span></code></a> inside a comprehension now includes variables
from outside the comprehension, and no longer includes the synthetic <code class="docutils literal notranslate"><span class="pre">.0</span></code>
variable for the comprehension “argument”.</p></li>
<li><p>A comprehension iterating directly over <code class="docutils literal notranslate"><span class="pre">locals()</span></code> (e.g. <code class="docutils literal notranslate"><span class="pre">[k</span> <span class="pre">for</span> <span class="pre">k</span> <span class="pre">in</span>
<span class="pre">locals()]</span></code>) may see “RuntimeError: dictionary changed size during iteration”
when run under tracing (e.g. code coverage measurement). This is the same
behavior already seen in e.g. <code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">k</span> <span class="pre">in</span> <span class="pre">locals():</span></code>. To avoid the error, first
create a list of keys to iterate over: <code class="docutils literal notranslate"><span class="pre">keys</span> <span class="pre">=</span> <span class="pre">list(locals());</span> <span class="pre">[k</span> <span class="pre">for</span> <span class="pre">k</span> <span class="pre">in</span>
<span class="pre">keys]</span></code>.</p></li>
</ul>
<p>(Contributed by Carl Meyer and Vladimir Matveev in <span class="target" id="index-15"></span><a class="pep reference external" href="https://peps.python.org/pep-0709/"><strong>PEP 709</strong></a>.)</p>
</section>
<section id="improved-error-messages">
<h3>Improved Error Messages<a class="headerlink" href="#improved-error-messages" title="Link to this heading"></a></h3>
<ul>
<li><p>Modules from the standard library are now potentially suggested as part of
the error messages displayed by the interpreter when a <a class="reference internal" href="../library/exceptions.html#NameError" title="NameError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NameError</span></code></a> is
raised to the top level. (Contributed by Pablo Galindo in <a class="reference external" href="https://github.com/python/cpython/issues/98254">gh-98254</a>.)</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">sys</span><span class="o">.</span><span class="n">version_info</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">&quot;&lt;stdin&gt;&quot;</span>, line <span class="m">1</span>, in <span class="n">&lt;module&gt;</span>
<span class="gr">NameError</span>: <span class="n">name &#39;sys&#39; is not defined. Did you forget to import &#39;sys&#39;?</span>
</pre></div>
</div>
</li>
<li><p>Improve the error suggestion for <a class="reference internal" href="../library/exceptions.html#NameError" title="NameError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NameError</span></code></a> exceptions for instances.
Now if a <a class="reference internal" href="../library/exceptions.html#NameError" title="NameError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NameError</span></code></a> is raised in a method and the instance has an
attribute thats exactly equal to the name in the exception, the suggestion
will include <code class="docutils literal notranslate"><span class="pre">self.&lt;NAME&gt;</span></code> instead of the closest match in the method
scope. (Contributed by Pablo Galindo in <a class="reference external" href="https://github.com/python/cpython/issues/99139">gh-99139</a>.)</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span><span class="w"> </span><span class="nc">A</span><span class="p">:</span>
<span class="gp">... </span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">blech</span> <span class="o">=</span> <span class="mi">1</span>
<span class="gp">...</span>
<span class="gp">... </span> <span class="k">def</span><span class="w"> </span><span class="nf">foo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span> <span class="n">somethin</span> <span class="o">=</span> <span class="n">blech</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">A</span><span class="p">()</span><span class="o">.</span><span class="n">foo</span><span class="p">()</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">&quot;&lt;stdin&gt;&quot;</span>, line <span class="m">1</span>
<span class="w"> </span><span class="n">somethin</span> <span class="o">=</span> <span class="n">blech</span>
<span class="w"> </span><span class="pm">^^^^^</span>
<span class="gr">NameError</span>: <span class="n">name &#39;blech&#39; is not defined. Did you mean: &#39;self.blech&#39;?</span>
</pre></div>
</div>
</li>
<li><p>Improve the <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> error message when the user types <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">x</span>
<span class="pre">from</span> <span class="pre">y</span></code> instead of <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">y</span> <span class="pre">import</span> <span class="pre">x</span></code>. (Contributed by Pablo Galindo in <a class="reference external" href="https://github.com/python/cpython/issues/98931">gh-98931</a>.)</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span><span class="w"> </span><span class="nn">a.y.z</span> <span class="kn">from</span><span class="w"> </span><span class="nn">b.y.z</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">&quot;&lt;stdin&gt;&quot;</span>, line <span class="m">1</span>
<span class="w"> </span><span class="kn">import</span><span class="w"> </span><span class="nn">a.y.z</span> <span class="kn">from</span><span class="w"> </span><span class="nn">b.y.z</span>
<span class="w"> </span><span class="pm">^^^^^^^^^^^^^^^^^^^^^^^</span>
<span class="gr">SyntaxError</span>: <span class="n">Did you mean to use &#39;from ... import ...&#39; instead?</span>
</pre></div>
</div>
</li>
<li><p><a class="reference internal" href="../library/exceptions.html#ImportError" title="ImportError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ImportError</span></code></a> exceptions raised from failed <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">&lt;module&gt;</span> <span class="pre">import</span>
<span class="pre">&lt;name&gt;</span></code> statements now include suggestions for the value of <code class="docutils literal notranslate"><span class="pre">&lt;name&gt;</span></code> based on the
available names in <code class="docutils literal notranslate"><span class="pre">&lt;module&gt;</span></code>. (Contributed by Pablo Galindo in <a class="reference external" href="https://github.com/python/cpython/issues/91058">gh-91058</a>.)</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">chainmap</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">&quot;&lt;stdin&gt;&quot;</span>, line <span class="m">1</span>, in <span class="n">&lt;module&gt;</span>
<span class="gr">ImportError</span>: <span class="n">cannot import name &#39;chainmap&#39; from &#39;collections&#39;. Did you mean: &#39;ChainMap&#39;?</span>
</pre></div>
</div>
</li>
</ul>
</section>
</section>
<section id="new-features-related-to-type-hints">
<h2>New Features Related to Type Hints<a class="headerlink" href="#new-features-related-to-type-hints" title="Link to this heading"></a></h2>
<p>This section covers major changes affecting <span class="target" id="index-16"></span><a class="pep reference external" href="https://peps.python.org/pep-0484/"><strong>type hints</strong></a> and
the <a class="reference internal" href="../library/typing.html#module-typing" title="typing: Support for type hints (see :pep:`484`)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">typing</span></code></a> module.</p>
<section id="pep-692-using-typeddict-for-more-precise-kwargs-typing">
<span id="whatsnew312-pep692"></span><h3>PEP 692: Using <code class="docutils literal notranslate"><span class="pre">TypedDict</span></code> for more precise <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code> typing<a class="headerlink" href="#pep-692-using-typeddict-for-more-precise-kwargs-typing" title="Link to this heading"></a></h3>
<p>Typing <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code> in a function signature as introduced by <span class="target" id="index-17"></span><a class="pep reference external" href="https://peps.python.org/pep-0484/"><strong>PEP 484</strong></a> allowed
for valid annotations only in cases where all of the <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code> were of the
same type.</p>
<p><span class="target" id="index-18"></span><a class="pep reference external" href="https://peps.python.org/pep-0692/"><strong>PEP 692</strong></a> specifies a more precise way of typing <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code> by relying on
typed dictionaries:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">TypedDict</span><span class="p">,</span> <span class="n">Unpack</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Movie</span><span class="p">(</span><span class="n">TypedDict</span><span class="p">):</span>
<span class="n">name</span><span class="p">:</span> <span class="nb">str</span>
<span class="n">year</span><span class="p">:</span> <span class="nb">int</span>
<span class="k">def</span><span class="w"> </span><span class="nf">foo</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n">Unpack</span><span class="p">[</span><span class="n">Movie</span><span class="p">]):</span> <span class="o">...</span>
</pre></div>
</div>
<p>See <span class="target" id="index-19"></span><a class="pep reference external" href="https://peps.python.org/pep-0692/"><strong>PEP 692</strong></a> for more details.</p>
<p>(Contributed by Franek Magiera in <a class="reference external" href="https://github.com/python/cpython/issues/103629">gh-103629</a>.)</p>
</section>
<section id="pep-698-override-decorator-for-static-typing">
<span id="whatsnew312-pep698"></span><h3>PEP 698: Override Decorator for Static Typing<a class="headerlink" href="#pep-698-override-decorator-for-static-typing" title="Link to this heading"></a></h3>
<p>A new decorator <a class="reference internal" href="../library/typing.html#typing.override" title="typing.override"><code class="xref py py-func docutils literal notranslate"><span class="pre">typing.override()</span></code></a> has been added to the <a class="reference internal" href="../library/typing.html#module-typing" title="typing: Support for type hints (see :pep:`484`)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">typing</span></code></a>
module. It indicates to type checkers that the method is intended to override
a method in a superclass. This allows type checkers to catch mistakes where
a method that is intended to override something in a base class
does not in fact do so.</p>
<p>Example:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">override</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Base</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_color</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;blue&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">GoodChild</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="nd">@override</span> <span class="c1"># ok: overrides Base.get_color</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_color</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;yellow&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">BadChild</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="nd">@override</span> <span class="c1"># type checker error: does not override Base.get_color</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_colour</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;red&quot;</span>
</pre></div>
</div>
<p>See <span class="target" id="index-20"></span><a class="pep reference external" href="https://peps.python.org/pep-0698/"><strong>PEP 698</strong></a> for more details.</p>
<p>(Contributed by Steven Troxler in <a class="reference external" href="https://github.com/python/cpython/issues/101561">gh-101561</a>.)</p>
</section>
</section>
<section id="other-language-changes">
<h2>Other Language Changes<a class="headerlink" href="#other-language-changes" title="Link to this heading"></a></h2>
<ul class="simple">
<li><p>The parser now raises <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> when parsing source code containing
null bytes. (Contributed by Pablo Galindo in <a class="reference external" href="https://github.com/python/cpython/issues/96670">gh-96670</a>.)</p></li>
<li><p>A backslash-character pair that is not a valid escape sequence now generates
a <a class="reference internal" href="../library/exceptions.html#SyntaxWarning" title="SyntaxWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxWarning</span></code></a>, instead of <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a>.
For example, <code class="docutils literal notranslate"><span class="pre">re.compile(&quot;\d+\.\d+&quot;)</span></code> now emits a <a class="reference internal" href="../library/exceptions.html#SyntaxWarning" title="SyntaxWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxWarning</span></code></a>
(<code class="docutils literal notranslate"><span class="pre">&quot;\d&quot;</span></code> is an invalid escape sequence, use raw strings for regular
expression: <code class="docutils literal notranslate"><span class="pre">re.compile(r&quot;\d+\.\d+&quot;)</span></code>).
In a future Python version, <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> will eventually be raised,
instead of <a class="reference internal" href="../library/exceptions.html#SyntaxWarning" title="SyntaxWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxWarning</span></code></a>.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/98401">gh-98401</a>.)</p></li>
<li><p>Octal escapes with value larger than <code class="docutils literal notranslate"><span class="pre">0o377</span></code> (ex: <code class="docutils literal notranslate"><span class="pre">&quot;\477&quot;</span></code>), deprecated
in Python 3.11, now produce a <a class="reference internal" href="../library/exceptions.html#SyntaxWarning" title="SyntaxWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxWarning</span></code></a>, instead of
<a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a>.
In a future Python version they will be eventually a <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/98401">gh-98401</a>.)</p></li>
<li><p>Variables used in the target part of comprehensions that are not stored to
can now be used in assignment expressions (<code class="docutils literal notranslate"><span class="pre">:=</span></code>).
For example, in <code class="docutils literal notranslate"><span class="pre">[(b</span> <span class="pre">:=</span> <span class="pre">1)</span> <span class="pre">for</span> <span class="pre">a,</span> <span class="pre">b.prop</span> <span class="pre">in</span> <span class="pre">some_iter]</span></code>, the assignment to
<code class="docutils literal notranslate"><span class="pre">b</span></code> is now allowed. Note that assigning to variables stored to in the target
part of comprehensions (like <code class="docutils literal notranslate"><span class="pre">a</span></code>) is still disallowed, as per <span class="target" id="index-21"></span><a class="pep reference external" href="https://peps.python.org/pep-0572/"><strong>PEP 572</strong></a>.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/100581">gh-100581</a>.)</p></li>
<li><p>Exceptions raised in a class or types <code class="docutils literal notranslate"><span class="pre">__set_name__</span></code> method are no longer
wrapped by a <a class="reference internal" href="../library/exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">RuntimeError</span></code></a>. Context information is added to the
exception as a <span class="target" id="index-22"></span><a class="pep reference external" href="https://peps.python.org/pep-0678/"><strong>PEP 678</strong></a> note. (Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/77757">gh-77757</a>.)</p></li>
<li><p>When a <code class="docutils literal notranslate"><span class="pre">try-except*</span></code> construct handles the entire <a class="reference internal" href="../library/exceptions.html#ExceptionGroup" title="ExceptionGroup"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ExceptionGroup</span></code></a>
and raises one other exception, that exception is no longer wrapped in an
<a class="reference internal" href="../library/exceptions.html#ExceptionGroup" title="ExceptionGroup"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ExceptionGroup</span></code></a>. Also changed in version 3.11.4. (Contributed by Irit
Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/103590">gh-103590</a>.)</p></li>
<li><p>The Garbage Collector now runs only on the eval breaker mechanism of the
Python bytecode evaluation loop instead of object allocations. The GC can
also run when <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_CheckSignals" title="PyErr_CheckSignals"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_CheckSignals()</span></code></a> is called so C extensions that
need to run for a long time without executing any Python code also have a
chance to execute the GC periodically. (Contributed by Pablo Galindo in
<a class="reference external" href="https://github.com/python/cpython/issues/97922">gh-97922</a>.)</p></li>
<li><p>All builtin and extension callables expecting boolean parameters now accept
arguments of any type instead of just <a class="reference internal" href="../library/functions.html#bool" title="bool"><code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></a> and <a class="reference internal" href="../library/functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a>.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/60203">gh-60203</a>.)</p></li>
<li><p><a class="reference internal" href="../library/stdtypes.html#memoryview" title="memoryview"><code class="xref py py-class docutils literal notranslate"><span class="pre">memoryview</span></code></a> now supports the half-float type (the “e” format code).
(Contributed by Donghee Na and Antoine Pitrou in <a class="reference external" href="https://github.com/python/cpython/issues/90751">gh-90751</a>.)</p></li>
<li><p><a class="reference internal" href="../library/functions.html#slice" title="slice"><code class="xref py py-class docutils literal notranslate"><span class="pre">slice</span></code></a> objects are now hashable, allowing them to be used as dict keys and
set items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/101264">gh-101264</a>.)</p></li>
<li><p><a class="reference internal" href="../library/functions.html#sum" title="sum"><code class="xref py py-func docutils literal notranslate"><span class="pre">sum()</span></code></a> now uses Neumaier summation to improve accuracy and commutativity
when summing floats or mixed ints and floats.
(Contributed by Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/100425">gh-100425</a>.)</p></li>
<li><p><a class="reference internal" href="../library/ast.html#ast.parse" title="ast.parse"><code class="xref py py-func docutils literal notranslate"><span class="pre">ast.parse()</span></code></a> now raises <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> instead of <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>
when parsing source code containing null bytes. (Contributed by Pablo Galindo
in <a class="reference external" href="https://github.com/python/cpython/issues/96670">gh-96670</a>.)</p></li>
<li><p>The extraction methods in <a class="reference internal" href="../library/tarfile.html#module-tarfile" title="tarfile: Read and write tar-format archive files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tarfile</span></code></a>, and <a class="reference internal" href="../library/shutil.html#shutil.unpack_archive" title="shutil.unpack_archive"><code class="xref py py-func docutils literal notranslate"><span class="pre">shutil.unpack_archive()</span></code></a>,
have a new a <em>filter</em> argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See <a class="reference internal" href="../library/tarfile.html#tarfile-extraction-filter"><span class="std std-ref">tarfile extraction filters</span></a> for details.
In Python 3.14, the default will switch to <code class="docutils literal notranslate"><span class="pre">'data'</span></code>.
(Contributed by Petr Viktorin in <span class="target" id="index-23"></span><a class="pep reference external" href="https://peps.python.org/pep-0706/"><strong>PEP 706</strong></a>.)</p></li>
<li><p><a class="reference internal" href="../library/types.html#types.MappingProxyType" title="types.MappingProxyType"><code class="xref py py-class docutils literal notranslate"><span class="pre">types.MappingProxyType</span></code></a> instances are now hashable if the underlying
mapping is hashable.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/87995">gh-87995</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../howto/perf_profiling.html#perf-profiling"><span class="std std-ref">support for the perf profiler</span></a> through the new
environment variable <span class="target" id="index-24"></span><a class="reference internal" href="../using/cmdline.html#envvar-PYTHONPERFSUPPORT"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONPERFSUPPORT</span></code></a>
and command-line option <a class="reference internal" href="../using/cmdline.html#cmdoption-X"><code class="xref std std-option docutils literal notranslate"><span class="pre">-X</span> <span class="pre">perf</span></code></a>,
as well as the new <a class="reference internal" href="../library/sys.html#sys.activate_stack_trampoline" title="sys.activate_stack_trampoline"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.activate_stack_trampoline()</span></code></a>,
<a class="reference internal" href="../library/sys.html#sys.deactivate_stack_trampoline" title="sys.deactivate_stack_trampoline"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.deactivate_stack_trampoline()</span></code></a>,
and <a class="reference internal" href="../library/sys.html#sys.is_stack_trampoline_active" title="sys.is_stack_trampoline_active"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.is_stack_trampoline_active()</span></code></a> functions.
(Design by Pablo Galindo. Contributed by Pablo Galindo and Christian Heimes
with contributions from Gregory P. Smith [Google] and Mark Shannon
in <a class="reference external" href="https://github.com/python/cpython/issues/96123">gh-96123</a>.)</p></li>
</ul>
</section>
<section id="new-modules">
<h2>New Modules<a class="headerlink" href="#new-modules" title="Link to this heading"></a></h2>
<ul class="simple">
<li><p>None.</p></li>
</ul>
</section>
<section id="improved-modules">
<h2>Improved Modules<a class="headerlink" href="#improved-modules" title="Link to this heading"></a></h2>
<section id="array">
<h3>array<a class="headerlink" href="#array" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>The <a class="reference internal" href="../library/array.html#array.array" title="array.array"><code class="xref py py-class docutils literal notranslate"><span class="pre">array.array</span></code></a> class now supports subscripting, making it a
<a class="reference internal" href="../glossary.html#term-generic-type"><span class="xref std std-term">generic type</span></a>. (Contributed by Jelle Zijlstra in <a class="reference external" href="https://github.com/python/cpython/issues/98658">gh-98658</a>.)</p></li>
</ul>
</section>
<section id="asyncio">
<h3>asyncio<a class="headerlink" href="#asyncio" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>The performance of writing to sockets in <a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a> has been
significantly improved. <code class="docutils literal notranslate"><span class="pre">asyncio</span></code> now avoids unnecessary copying when
writing to sockets and uses <a class="reference internal" href="../library/socket.html#socket.socket.sendmsg" title="socket.socket.sendmsg"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sendmsg()</span></code></a> if the platform
supports it. (Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/91166">gh-91166</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../library/asyncio-task.html#asyncio.eager_task_factory" title="asyncio.eager_task_factory"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.eager_task_factory()</span></code></a> and <a class="reference internal" href="../library/asyncio-task.html#asyncio.create_eager_task_factory" title="asyncio.create_eager_task_factory"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.create_eager_task_factory()</span></code></a>
functions to allow opting an event loop in to eager task execution,
making some use-cases 2x to 5x faster.
(Contributed by Jacob Bower &amp; Itamar Oren in <a class="reference external" href="https://github.com/python/cpython/issues/102853">gh-102853</a>, <a class="reference external" href="https://github.com/python/cpython/issues/104140">gh-104140</a>, and <a class="reference external" href="https://github.com/python/cpython/issues/104138">gh-104138</a>)</p></li>
<li><p>On Linux, <a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a> uses <a class="reference internal" href="../library/asyncio-policy.html#asyncio.PidfdChildWatcher" title="asyncio.PidfdChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.PidfdChildWatcher</span></code></a> by default
if <a class="reference internal" href="../library/os.html#os.pidfd_open" title="os.pidfd_open"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.pidfd_open()</span></code></a> is available and functional instead of
<a class="reference internal" href="../library/asyncio-policy.html#asyncio.ThreadedChildWatcher" title="asyncio.ThreadedChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.ThreadedChildWatcher</span></code></a>.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/98024">gh-98024</a>.)</p></li>
<li><p>The event loop now uses the best available child watcher for each platform
(<a class="reference internal" href="../library/asyncio-policy.html#asyncio.PidfdChildWatcher" title="asyncio.PidfdChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.PidfdChildWatcher</span></code></a> if supported and
<a class="reference internal" href="../library/asyncio-policy.html#asyncio.ThreadedChildWatcher" title="asyncio.ThreadedChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.ThreadedChildWatcher</span></code></a> otherwise), so manually
configuring a child watcher is not recommended.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/94597">gh-94597</a>.)</p></li>
<li><p>Add <em>loop_factory</em> parameter to <a class="reference internal" href="../library/asyncio-runner.html#asyncio.run" title="asyncio.run"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.run()</span></code></a> to allow specifying
a custom event loop factory.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/99388">gh-99388</a>.)</p></li>
<li><p>Add C implementation of <a class="reference internal" href="../library/asyncio-task.html#asyncio.current_task" title="asyncio.current_task"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.current_task()</span></code></a> for 4x-6x speedup.
(Contributed by Itamar Oren and Pranav Thulasiram Bhat in <a class="reference external" href="https://github.com/python/cpython/issues/100344">gh-100344</a>.)</p></li>
<li><p><a class="reference internal" href="../library/asyncio-task.html#asyncio.iscoroutine" title="asyncio.iscoroutine"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.iscoroutine()</span></code></a> now returns <code class="docutils literal notranslate"><span class="pre">False</span></code> for generators as
<a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a> does not support legacy generator-based coroutines.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/102748">gh-102748</a>.)</p></li>
<li><p><a class="reference internal" href="../library/asyncio-task.html#asyncio.wait" title="asyncio.wait"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.wait()</span></code></a> and <a class="reference internal" href="../library/asyncio-task.html#asyncio.as_completed" title="asyncio.as_completed"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.as_completed()</span></code></a> now accepts generators
yielding tasks.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/78530">gh-78530</a>.)</p></li>
</ul>
</section>
<section id="calendar">
<h3>calendar<a class="headerlink" href="#calendar" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add enums <a class="reference internal" href="../library/calendar.html#calendar.Month" title="calendar.Month"><code class="xref py py-data docutils literal notranslate"><span class="pre">calendar.Month</span></code></a> and <a class="reference internal" href="../library/calendar.html#calendar.Day" title="calendar.Day"><code class="xref py py-data docutils literal notranslate"><span class="pre">calendar.Day</span></code></a>
defining months of the year and days of the week.
(Contributed by Prince Roshan in <a class="reference external" href="https://github.com/python/cpython/issues/103636">gh-103636</a>.)</p></li>
</ul>
</section>
<section id="csv">
<h3>csv<a class="headerlink" href="#csv" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/csv.html#csv.QUOTE_NOTNULL" title="csv.QUOTE_NOTNULL"><code class="xref py py-const docutils literal notranslate"><span class="pre">csv.QUOTE_NOTNULL</span></code></a> and <a class="reference internal" href="../library/csv.html#csv.QUOTE_STRINGS" title="csv.QUOTE_STRINGS"><code class="xref py py-const docutils literal notranslate"><span class="pre">csv.QUOTE_STRINGS</span></code></a> flags to
provide finer grained control of <code class="docutils literal notranslate"><span class="pre">None</span></code> and empty strings by
<a class="reference internal" href="../library/csv.html#csv.reader" title="csv.reader"><code class="xref py py-class docutils literal notranslate"><span class="pre">reader</span></code></a> and <a class="reference internal" href="../library/csv.html#csv.writer" title="csv.writer"><code class="xref py py-class docutils literal notranslate"><span class="pre">writer</span></code></a> objects.</p></li>
</ul>
</section>
<section id="dis">
<h3>dis<a class="headerlink" href="#dis" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Pseudo instruction opcodes (which are used by the compiler but
do not appear in executable bytecode) are now exposed in the
<a class="reference internal" href="../library/dis.html#module-dis" title="dis: Disassembler for Python bytecode."><code class="xref py py-mod docutils literal notranslate"><span class="pre">dis</span></code></a> module.
<a class="reference internal" href="../library/dis.html#opcode-HAVE_ARGUMENT"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">HAVE_ARGUMENT</span></code></a> is still relevant to real opcodes,
but it is not useful for pseudo instructions. Use the new
<a class="reference internal" href="../library/dis.html#dis.hasarg" title="dis.hasarg"><code class="xref py py-data docutils literal notranslate"><span class="pre">dis.hasarg</span></code></a> collection instead.
(Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/94216">gh-94216</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#dis.hasexc" title="dis.hasexc"><code class="xref py py-data docutils literal notranslate"><span class="pre">dis.hasexc</span></code></a> collection to signify instructions that set
an exception handler. (Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/94216">gh-94216</a>.)</p></li>
</ul>
</section>
<section id="fractions">
<h3>fractions<a class="headerlink" href="#fractions" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Objects of type <a class="reference internal" href="../library/fractions.html#fractions.Fraction" title="fractions.Fraction"><code class="xref py py-class docutils literal notranslate"><span class="pre">fractions.Fraction</span></code></a> now support float-style
formatting. (Contributed by Mark Dickinson in <a class="reference external" href="https://github.com/python/cpython/issues/100161">gh-100161</a>.)</p></li>
</ul>
</section>
<section id="importlib-resources">
<h3>importlib.resources<a class="headerlink" href="#importlib-resources" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p><a class="reference internal" href="../library/importlib.resources.html#importlib.resources.as_file" title="importlib.resources.as_file"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.resources.as_file()</span></code></a> now supports resource directories.
(Contributed by Jason R. Coombs in <a class="reference external" href="https://github.com/python/cpython/issues/97930">gh-97930</a>.)</p></li>
<li><p>Rename first parameter of <a class="reference internal" href="../library/importlib.resources.html#importlib.resources.files" title="importlib.resources.files"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.resources.files()</span></code></a> to <em>anchor</em>.
(Contributed by Jason R. Coombs in <a class="reference external" href="https://github.com/python/cpython/issues/100598">gh-100598</a>.)</p></li>
</ul>
</section>
<section id="inspect">
<h3>inspect<a class="headerlink" href="#inspect" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/inspect.html#inspect.markcoroutinefunction" title="inspect.markcoroutinefunction"><code class="xref py py-func docutils literal notranslate"><span class="pre">inspect.markcoroutinefunction()</span></code></a> to mark sync functions that return
a <a class="reference internal" href="../glossary.html#term-coroutine"><span class="xref std std-term">coroutine</span></a> for use with <a class="reference internal" href="../library/inspect.html#inspect.iscoroutinefunction" title="inspect.iscoroutinefunction"><code class="xref py py-func docutils literal notranslate"><span class="pre">inspect.iscoroutinefunction()</span></code></a>.
(Contributed by Carlton Gibson in <a class="reference external" href="https://github.com/python/cpython/issues/99247">gh-99247</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../library/inspect.html#inspect.getasyncgenstate" title="inspect.getasyncgenstate"><code class="xref py py-func docutils literal notranslate"><span class="pre">inspect.getasyncgenstate()</span></code></a> and <a class="reference internal" href="../library/inspect.html#inspect.getasyncgenlocals" title="inspect.getasyncgenlocals"><code class="xref py py-func docutils literal notranslate"><span class="pre">inspect.getasyncgenlocals()</span></code></a>
for determining the current state of asynchronous generators.
(Contributed by Thomas Krennwallner in <a class="reference external" href="https://github.com/python/cpython/issues/79940">gh-79940</a>.)</p></li>
<li><p>The performance of <a class="reference internal" href="../library/inspect.html#inspect.getattr_static" title="inspect.getattr_static"><code class="xref py py-func docutils literal notranslate"><span class="pre">inspect.getattr_static()</span></code></a> has been considerably
improved. Most calls to the function should be at least 2x faster than they
were in Python 3.11. (Contributed by Alex Waygood in <a class="reference external" href="https://github.com/python/cpython/issues/103193">gh-103193</a>.)</p></li>
</ul>
</section>
<section id="itertools">
<h3>itertools<a class="headerlink" href="#itertools" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/itertools.html#itertools.batched" title="itertools.batched"><code class="xref py py-func docutils literal notranslate"><span class="pre">itertools.batched()</span></code></a> for collecting into even-sized
tuples where the last batch may be shorter than the rest.
(Contributed by Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/98363">gh-98363</a>.)</p></li>
</ul>
</section>
<section id="math">
<h3>math<a class="headerlink" href="#math" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/math.html#math.sumprod" title="math.sumprod"><code class="xref py py-func docutils literal notranslate"><span class="pre">math.sumprod()</span></code></a> for computing a sum of products.
(Contributed by Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/100485">gh-100485</a>.)</p></li>
<li><p>Extend <a class="reference internal" href="../library/math.html#math.nextafter" title="math.nextafter"><code class="xref py py-func docutils literal notranslate"><span class="pre">math.nextafter()</span></code></a> to include a <em>steps</em> argument
for moving up or down multiple steps at a time. (Contributed by
Matthias Goergens, Mark Dickinson, and Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/94906">gh-94906</a>.)</p></li>
</ul>
</section>
<section id="os">
<h3>os<a class="headerlink" href="#os" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/os.html#os.PIDFD_NONBLOCK" title="os.PIDFD_NONBLOCK"><code class="xref py py-const docutils literal notranslate"><span class="pre">os.PIDFD_NONBLOCK</span></code></a> to open a file descriptor
for a process with <a class="reference internal" href="../library/os.html#os.pidfd_open" title="os.pidfd_open"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.pidfd_open()</span></code></a> in non-blocking mode.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/93312">gh-93312</a>.)</p></li>
<li><p><a class="reference internal" href="../library/os.html#os.DirEntry" title="os.DirEntry"><code class="xref py py-class docutils literal notranslate"><span class="pre">os.DirEntry</span></code></a> now includes an <a class="reference internal" href="../library/os.html#os.DirEntry.is_junction" title="os.DirEntry.is_junction"><code class="xref py py-meth docutils literal notranslate"><span class="pre">os.DirEntry.is_junction()</span></code></a>
method to check if the entry is a junction.
(Contributed by Charles Machalow in <a class="reference external" href="https://github.com/python/cpython/issues/99547">gh-99547</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../library/os.html#os.listdrives" title="os.listdrives"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.listdrives()</span></code></a>, <a class="reference internal" href="../library/os.html#os.listvolumes" title="os.listvolumes"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.listvolumes()</span></code></a> and <a class="reference internal" href="../library/os.html#os.listmounts" title="os.listmounts"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.listmounts()</span></code></a>
functions on Windows for enumerating drives, volumes and mount points.
(Contributed by Steve Dower in <a class="reference external" href="https://github.com/python/cpython/issues/102519">gh-102519</a>.)</p></li>
<li><p><a class="reference internal" href="../library/os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.stat()</span></code></a> and <a class="reference internal" href="../library/os.html#os.lstat" title="os.lstat"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.lstat()</span></code></a> are now more accurate on Windows.
The <code class="docutils literal notranslate"><span class="pre">st_birthtime</span></code> field will now be filled with the creation time
of the file, and <code class="docutils literal notranslate"><span class="pre">st_ctime</span></code> is deprecated but still contains the
creation time (but in the future will return the last metadata change,
for consistency with other platforms). <code class="docutils literal notranslate"><span class="pre">st_dev</span></code> may be up to 64 bits
and <code class="docutils literal notranslate"><span class="pre">st_ino</span></code> up to 128 bits depending on your file system, and
<code class="docutils literal notranslate"><span class="pre">st_rdev</span></code> is always set to zero rather than incorrect values.
Both functions may be significantly faster on newer releases of
Windows. (Contributed by Steve Dower in <a class="reference external" href="https://github.com/python/cpython/issues/99726">gh-99726</a>.)</p></li>
</ul>
</section>
<section id="os-path">
<h3>os.path<a class="headerlink" href="#os-path" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/os.path.html#os.path.isjunction" title="os.path.isjunction"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.path.isjunction()</span></code></a> to check if a given path is a junction.
(Contributed by Charles Machalow in <a class="reference external" href="https://github.com/python/cpython/issues/99547">gh-99547</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../library/os.path.html#os.path.splitroot" title="os.path.splitroot"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.path.splitroot()</span></code></a> to split a path into a triad
<code class="docutils literal notranslate"><span class="pre">(drive,</span> <span class="pre">root,</span> <span class="pre">tail)</span></code>. (Contributed by Barney Gale in <a class="reference external" href="https://github.com/python/cpython/issues/101000">gh-101000</a>.)</p></li>
</ul>
</section>
<section id="pathlib">
<h3>pathlib<a class="headerlink" href="#pathlib" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add support for subclassing <a class="reference internal" href="../library/pathlib.html#pathlib.PurePath" title="pathlib.PurePath"><code class="xref py py-class docutils literal notranslate"><span class="pre">pathlib.PurePath</span></code></a> and
<a class="reference internal" href="../library/pathlib.html#pathlib.Path" title="pathlib.Path"><code class="xref py py-class docutils literal notranslate"><span class="pre">pathlib.Path</span></code></a>, plus their Posix- and Windows-specific variants.
Subclasses may override the <a class="reference internal" href="../library/pathlib.html#pathlib.PurePath.with_segments" title="pathlib.PurePath.with_segments"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pathlib.PurePath.with_segments()</span></code></a> method
to pass information between path instances.</p></li>
<li><p>Add <a class="reference internal" href="../library/pathlib.html#pathlib.Path.walk" title="pathlib.Path.walk"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pathlib.Path.walk()</span></code></a> for walking the directory trees and generating
all file or directory names within them, similar to <a class="reference internal" href="../library/os.html#os.walk" title="os.walk"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.walk()</span></code></a>.
(Contributed by Stanislav Zmiev in <a class="reference external" href="https://github.com/python/cpython/issues/90385">gh-90385</a>.)</p></li>
<li><p>Add <em>walk_up</em> optional parameter to <a class="reference internal" href="../library/pathlib.html#pathlib.PurePath.relative_to" title="pathlib.PurePath.relative_to"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pathlib.PurePath.relative_to()</span></code></a>
to allow the insertion of <code class="docutils literal notranslate"><span class="pre">..</span></code> entries in the result; this behavior is
more consistent with <a class="reference internal" href="../library/os.path.html#os.path.relpath" title="os.path.relpath"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.path.relpath()</span></code></a>.
(Contributed by Domenico Ragusa in <a class="reference external" href="https://github.com/python/cpython/issues/84538">gh-84538</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../library/pathlib.html#pathlib.Path.is_junction" title="pathlib.Path.is_junction"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pathlib.Path.is_junction()</span></code></a> as a proxy to <a class="reference internal" href="../library/os.path.html#os.path.isjunction" title="os.path.isjunction"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.path.isjunction()</span></code></a>.
(Contributed by Charles Machalow in <a class="reference external" href="https://github.com/python/cpython/issues/99547">gh-99547</a>.)</p></li>
<li><p>Add <em>case_sensitive</em> optional parameter to <a class="reference internal" href="../library/pathlib.html#pathlib.Path.glob" title="pathlib.Path.glob"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pathlib.Path.glob()</span></code></a>,
<a class="reference internal" href="../library/pathlib.html#pathlib.Path.rglob" title="pathlib.Path.rglob"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pathlib.Path.rglob()</span></code></a> and <a class="reference internal" href="../library/pathlib.html#pathlib.PurePath.match" title="pathlib.PurePath.match"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pathlib.PurePath.match()</span></code></a> for matching
the paths case sensitivity, allowing for more precise control over the matching process.</p></li>
</ul>
</section>
<section id="platform">
<h3>platform<a class="headerlink" href="#platform" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add support for detecting Windows 11 and Windows Server releases past 2012.
Previously, lookups on Windows Server platforms newer than Windows Server 2012
and on Windows 11 would return <code class="docutils literal notranslate"><span class="pre">Windows-10</span></code>.
(Contributed by Steve Dower in <a class="reference external" href="https://github.com/python/cpython/issues/89545">gh-89545</a>.)</p></li>
</ul>
</section>
<section id="pdb">
<h3>pdb<a class="headerlink" href="#pdb" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add convenience variables to hold values temporarily for debug session
and provide quick access to values like the current frame or the return
value.
(Contributed by Tian Gao in <a class="reference external" href="https://github.com/python/cpython/issues/103693">gh-103693</a>.)</p></li>
</ul>
</section>
<section id="random">
<h3>random<a class="headerlink" href="#random" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/random.html#random.binomialvariate" title="random.binomialvariate"><code class="xref py py-func docutils literal notranslate"><span class="pre">random.binomialvariate()</span></code></a>.
(Contributed by Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/81620">gh-81620</a>.)</p></li>
<li><p>Add a default of <code class="docutils literal notranslate"><span class="pre">lambd=1.0</span></code> to <a class="reference internal" href="../library/random.html#random.expovariate" title="random.expovariate"><code class="xref py py-func docutils literal notranslate"><span class="pre">random.expovariate()</span></code></a>.
(Contributed by Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/100234">gh-100234</a>.)</p></li>
</ul>
</section>
<section id="shutil">
<h3>shutil<a class="headerlink" href="#shutil" title="Link to this heading"></a></h3>
<ul>
<li><p><a class="reference internal" href="../library/shutil.html#shutil.make_archive" title="shutil.make_archive"><code class="xref py py-func docutils literal notranslate"><span class="pre">shutil.make_archive()</span></code></a> now passes the <em>root_dir</em> argument to custom
archivers which support it.
In this case it no longer temporarily changes the current working directory
of the process to <em>root_dir</em> to perform archiving.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/74696">gh-74696</a>.)</p></li>
<li><p><a class="reference internal" href="../library/shutil.html#shutil.rmtree" title="shutil.rmtree"><code class="xref py py-func docutils literal notranslate"><span class="pre">shutil.rmtree()</span></code></a> now accepts a new argument <em>onexc</em> which is an
error handler like <em>onerror</em> but which expects an exception instance
rather than a <em>(typ, val, tb)</em> triplet. <em>onerror</em> is deprecated.
(Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/102828">gh-102828</a>.)</p></li>
<li><p><a class="reference internal" href="../library/shutil.html#shutil.which" title="shutil.which"><code class="xref py py-func docutils literal notranslate"><span class="pre">shutil.which()</span></code></a> now consults the <em>PATHEXT</em> environment variable to
find matches within <em>PATH</em> on Windows even when the given <em>cmd</em> includes
a directory component.
(Contributed by Charles Machalow in <a class="reference external" href="https://github.com/python/cpython/issues/103179">gh-103179</a>.)</p>
<p><a class="reference internal" href="../library/shutil.html#shutil.which" title="shutil.which"><code class="xref py py-func docutils literal notranslate"><span class="pre">shutil.which()</span></code></a> will call <code class="docutils literal notranslate"><span class="pre">NeedCurrentDirectoryForExePathW</span></code> when
querying for executables on Windows to determine if the current working
directory should be prepended to the search path.
(Contributed by Charles Machalow in <a class="reference external" href="https://github.com/python/cpython/issues/103179">gh-103179</a>.)</p>
<p><a class="reference internal" href="../library/shutil.html#shutil.which" title="shutil.which"><code class="xref py py-func docutils literal notranslate"><span class="pre">shutil.which()</span></code></a> will return a path matching the <em>cmd</em> with a component
from <code class="docutils literal notranslate"><span class="pre">PATHEXT</span></code> prior to a direct match elsewhere in the search path on
Windows.
(Contributed by Charles Machalow in <a class="reference external" href="https://github.com/python/cpython/issues/103179">gh-103179</a>.)</p>
</li>
</ul>
</section>
<section id="sqlite3">
<h3>sqlite3<a class="headerlink" href="#sqlite3" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add a <a class="reference internal" href="../library/sqlite3.html#sqlite3-cli"><span class="std std-ref">command-line interface</span></a>.
(Contributed by Erlend E. Aasland in <a class="reference external" href="https://github.com/python/cpython/issues/77617">gh-77617</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/sqlite3.html#sqlite3.Connection.autocommit" title="sqlite3.Connection.autocommit"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sqlite3.Connection.autocommit</span></code></a> attribute
to <a class="reference internal" href="../library/sqlite3.html#sqlite3.Connection" title="sqlite3.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">sqlite3.Connection</span></code></a>
and the <em>autocommit</em> parameter to <a class="reference internal" href="../library/sqlite3.html#sqlite3.connect" title="sqlite3.connect"><code class="xref py py-func docutils literal notranslate"><span class="pre">sqlite3.connect()</span></code></a>
to control <span class="target" id="index-25"></span><a class="pep reference external" href="https://peps.python.org/pep-0249/"><strong>PEP 249</strong></a>-compliant
<a class="reference internal" href="../library/sqlite3.html#sqlite3-transaction-control-autocommit"><span class="std std-ref">transaction handling</span></a>.
(Contributed by Erlend E. Aasland in <a class="reference external" href="https://github.com/python/cpython/issues/83638">gh-83638</a>.)</p></li>
<li><p>Add <em>entrypoint</em> keyword-only parameter to
<a class="reference internal" href="../library/sqlite3.html#sqlite3.Connection.load_extension" title="sqlite3.Connection.load_extension"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sqlite3.Connection.load_extension()</span></code></a>,
for overriding the SQLite extension entry point.
(Contributed by Erlend E. Aasland in <a class="reference external" href="https://github.com/python/cpython/issues/103015">gh-103015</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../library/sqlite3.html#sqlite3.Connection.getconfig" title="sqlite3.Connection.getconfig"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sqlite3.Connection.getconfig()</span></code></a> and
<a class="reference internal" href="../library/sqlite3.html#sqlite3.Connection.setconfig" title="sqlite3.Connection.setconfig"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sqlite3.Connection.setconfig()</span></code></a> to <a class="reference internal" href="../library/sqlite3.html#sqlite3.Connection" title="sqlite3.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">sqlite3.Connection</span></code></a>
to make configuration changes to a database connection.
(Contributed by Erlend E. Aasland in <a class="reference external" href="https://github.com/python/cpython/issues/103489">gh-103489</a>.)</p></li>
</ul>
</section>
<section id="statistics">
<h3>statistics<a class="headerlink" href="#statistics" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Extend <a class="reference internal" href="../library/statistics.html#statistics.correlation" title="statistics.correlation"><code class="xref py py-func docutils literal notranslate"><span class="pre">statistics.correlation()</span></code></a> to include as a <code class="docutils literal notranslate"><span class="pre">ranked</span></code> method
for computing the Spearman correlation of ranked data.
(Contributed by Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/95861">gh-95861</a>.)</p></li>
</ul>
</section>
<section id="sys">
<h3>sys<a class="headerlink" href="#sys" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add the <a class="reference internal" href="../library/sys.monitoring.html#module-sys.monitoring" title="sys.monitoring: Access and control event monitoring"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sys.monitoring</span></code></a> namespace to expose the new <a class="reference internal" href="#whatsnew312-pep669"><span class="std std-ref">PEP 669</span></a> monitoring API.
(Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/103082">gh-103082</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../library/sys.html#sys.activate_stack_trampoline" title="sys.activate_stack_trampoline"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.activate_stack_trampoline()</span></code></a> and
<a class="reference internal" href="../library/sys.html#sys.deactivate_stack_trampoline" title="sys.deactivate_stack_trampoline"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.deactivate_stack_trampoline()</span></code></a> for activating and deactivating
stack profiler trampolines,
and <a class="reference internal" href="../library/sys.html#sys.is_stack_trampoline_active" title="sys.is_stack_trampoline_active"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.is_stack_trampoline_active()</span></code></a> for querying if stack profiler
trampolines are active.
(Contributed by Pablo Galindo and Christian Heimes
with contributions from Gregory P. Smith [Google] and Mark Shannon
in <a class="reference external" href="https://github.com/python/cpython/issues/96123">gh-96123</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../library/sys.html#sys.last_exc" title="sys.last_exc"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.last_exc</span></code></a> which holds the last unhandled exception that
was raised (for post-mortem debugging use cases). Deprecate the
three fields that have the same information in its legacy form:
<a class="reference internal" href="../library/sys.html#sys.last_type" title="sys.last_type"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.last_type</span></code></a>, <a class="reference internal" href="../library/sys.html#sys.last_value" title="sys.last_value"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.last_value</span></code></a> and <a class="reference internal" href="../library/sys.html#sys.last_traceback" title="sys.last_traceback"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.last_traceback</span></code></a>.
(Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/102778">gh-102778</a>.)</p></li>
<li><p><a class="reference internal" href="../library/sys.html#sys._current_exceptions" title="sys._current_exceptions"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys._current_exceptions()</span></code></a> now returns a mapping from thread-id to an
exception instance, rather than to a <code class="docutils literal notranslate"><span class="pre">(typ,</span> <span class="pre">exc,</span> <span class="pre">tb)</span></code> tuple.
(Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/103176">gh-103176</a>.)</p></li>
<li><p><a class="reference internal" href="../library/sys.html#sys.setrecursionlimit" title="sys.setrecursionlimit"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.setrecursionlimit()</span></code></a> and <a class="reference internal" href="../library/sys.html#sys.getrecursionlimit" title="sys.getrecursionlimit"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.getrecursionlimit()</span></code></a>.
The recursion limit now applies only to Python code. Builtin functions do
not use the recursion limit, but are protected by a different mechanism
that prevents recursion from causing a virtual machine crash.</p></li>
</ul>
</section>
<section id="tempfile">
<h3>tempfile<a class="headerlink" href="#tempfile" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>The <a class="reference internal" href="../library/tempfile.html#tempfile.NamedTemporaryFile" title="tempfile.NamedTemporaryFile"><code class="xref py py-class docutils literal notranslate"><span class="pre">tempfile.NamedTemporaryFile</span></code></a> function has a new optional parameter
<em>delete_on_close</em> (Contributed by Evgeny Zorin in <a class="reference external" href="https://github.com/python/cpython/issues/58451">gh-58451</a>.)</p></li>
<li><p><a class="reference internal" href="../library/tempfile.html#tempfile.mkdtemp" title="tempfile.mkdtemp"><code class="xref py py-func docutils literal notranslate"><span class="pre">tempfile.mkdtemp()</span></code></a> now always returns an absolute path, even if the
argument provided to the <em>dir</em> parameter is a relative path.</p></li>
</ul>
</section>
<section id="threading">
<h3>threading<a class="headerlink" href="#threading" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/threading.html#threading.settrace_all_threads" title="threading.settrace_all_threads"><code class="xref py py-func docutils literal notranslate"><span class="pre">threading.settrace_all_threads()</span></code></a> and
<a class="reference internal" href="../library/threading.html#threading.setprofile_all_threads" title="threading.setprofile_all_threads"><code class="xref py py-func docutils literal notranslate"><span class="pre">threading.setprofile_all_threads()</span></code></a> that allow to set tracing and
profiling functions in all running threads in addition to the calling one.
(Contributed by Pablo Galindo in <a class="reference external" href="https://github.com/python/cpython/issues/93503">gh-93503</a>.)</p></li>
</ul>
</section>
<section id="tkinter">
<h3>tkinter<a class="headerlink" href="#tkinter" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">tkinter.Canvas.coords()</span></code> now flattens its arguments.
It now accepts not only coordinates as separate arguments
(<code class="docutils literal notranslate"><span class="pre">x1,</span> <span class="pre">y1,</span> <span class="pre">x2,</span> <span class="pre">y2,</span> <span class="pre">...</span></code>) and a sequence of coordinates
(<code class="docutils literal notranslate"><span class="pre">[x1,</span> <span class="pre">y1,</span> <span class="pre">x2,</span> <span class="pre">y2,</span> <span class="pre">...]</span></code>), but also coordinates grouped in pairs
(<code class="docutils literal notranslate"><span class="pre">(x1,</span> <span class="pre">y1),</span> <span class="pre">(x2,</span> <span class="pre">y2),</span> <span class="pre">...</span></code> and <code class="docutils literal notranslate"><span class="pre">[(x1,</span> <span class="pre">y1),</span> <span class="pre">(x2,</span> <span class="pre">y2),</span> <span class="pre">...]</span></code>),
like <code class="docutils literal notranslate"><span class="pre">create_*()</span></code> methods.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/94473">gh-94473</a>.)</p></li>
</ul>
</section>
<section id="tokenize">
<h3>tokenize<a class="headerlink" href="#tokenize" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>The <a class="reference internal" href="../library/tokenize.html#module-tokenize" title="tokenize: Lexical scanner for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tokenize</span></code></a> module includes the changes introduced in <span class="target" id="index-26"></span><a class="pep reference external" href="https://peps.python.org/pep-0701/"><strong>PEP 701</strong></a>.
(Contributed by Marta Gómez Macías and Pablo Galindo in <a class="reference external" href="https://github.com/python/cpython/issues/102856">gh-102856</a>.)
See <a class="reference internal" href="#whatsnew312-porting-to-python312"><span class="std std-ref">Porting to Python 3.12</span></a> for more information on the
changes to the <a class="reference internal" href="../library/tokenize.html#module-tokenize" title="tokenize: Lexical scanner for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tokenize</span></code></a> module.</p></li>
</ul>
</section>
<section id="types">
<h3>types<a class="headerlink" href="#types" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add <a class="reference internal" href="../library/types.html#types.get_original_bases" title="types.get_original_bases"><code class="xref py py-func docutils literal notranslate"><span class="pre">types.get_original_bases()</span></code></a> to allow for further introspection of
<a class="reference internal" href="../library/typing.html#user-defined-generics"><span class="std std-ref">User-defined generic types</span></a> when subclassed. (Contributed by
James Hilton-Balfe and Alex Waygood in <a class="reference external" href="https://github.com/python/cpython/issues/101827">gh-101827</a>.)</p></li>
</ul>
</section>
<section id="typing">
<span id="whatsnew-typing-py312"></span><h3>typing<a class="headerlink" href="#typing" title="Link to this heading"></a></h3>
<ul>
<li><p><a class="reference internal" href="../library/functions.html#isinstance" title="isinstance"><code class="xref py py-func docutils literal notranslate"><span class="pre">isinstance()</span></code></a> checks against
<a class="reference internal" href="../library/typing.html#typing.runtime_checkable" title="typing.runtime_checkable"><code class="xref py py-func docutils literal notranslate"><span class="pre">runtime-checkable</span> <span class="pre">protocols</span></code></a> now use
<a class="reference internal" href="../library/inspect.html#inspect.getattr_static" title="inspect.getattr_static"><code class="xref py py-func docutils literal notranslate"><span class="pre">inspect.getattr_static()</span></code></a> rather than <a class="reference internal" href="../library/functions.html#hasattr" title="hasattr"><code class="xref py py-func docutils literal notranslate"><span class="pre">hasattr()</span></code></a> to lookup whether
attributes exist. This means that descriptors and <a class="reference internal" href="../reference/datamodel.html#object.__getattr__" title="object.__getattr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattr__()</span></code></a>
methods are no longer unexpectedly evaluated during <code class="docutils literal notranslate"><span class="pre">isinstance()</span></code> checks
against runtime-checkable protocols. However, it may also mean that some
objects which used to be considered instances of a runtime-checkable protocol
may no longer be considered instances of that protocol on Python 3.12+, and
vice versa. Most users are unlikely to be affected by this change.
(Contributed by Alex Waygood in <a class="reference external" href="https://github.com/python/cpython/issues/102433">gh-102433</a>.)</p></li>
<li><p>The members of a runtime-checkable protocol are now considered “frozen” at
runtime as soon as the class has been created. Monkey-patching attributes
onto a runtime-checkable protocol will still work, but will have no impact on
<a class="reference internal" href="../library/functions.html#isinstance" title="isinstance"><code class="xref py py-func docutils literal notranslate"><span class="pre">isinstance()</span></code></a> checks comparing objects to the protocol. For example:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Protocol</span><span class="p">,</span> <span class="n">runtime_checkable</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nd">@runtime_checkable</span>
<span class="gp">... </span><span class="k">class</span><span class="w"> </span><span class="nc">HasX</span><span class="p">(</span><span class="n">Protocol</span><span class="p">):</span>
<span class="gp">... </span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span><span class="w"> </span><span class="nc">Foo</span><span class="p">:</span> <span class="o">...</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">HasX</span><span class="p">)</span>
<span class="go">False</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">1</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">HasX</span><span class="p">)</span>
<span class="go">True</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">HasX</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">2</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">HasX</span><span class="p">)</span> <span class="c1"># unchanged, even though HasX now also has a &quot;y&quot; attribute</span>
<span class="go">True</span>
</pre></div>
</div>
<p>This change was made in order to speed up <code class="docutils literal notranslate"><span class="pre">isinstance()</span></code> checks against
runtime-checkable protocols.</p>
</li>
<li><p>The performance profile of <a class="reference internal" href="../library/functions.html#isinstance" title="isinstance"><code class="xref py py-func docutils literal notranslate"><span class="pre">isinstance()</span></code></a> checks against
<a class="reference internal" href="../library/typing.html#typing.runtime_checkable" title="typing.runtime_checkable"><code class="xref py py-func docutils literal notranslate"><span class="pre">runtime-checkable</span> <span class="pre">protocols</span></code></a> has changed
significantly. Most <code class="docutils literal notranslate"><span class="pre">isinstance()</span></code> checks against protocols with only a few
members should be at least 2x faster than in 3.11, and some may be 20x
faster or more. However, <code class="docutils literal notranslate"><span class="pre">isinstance()</span></code> checks against protocols with many
members may be slower than in Python 3.11. (Contributed by Alex
Waygood in <a class="reference external" href="https://github.com/python/cpython/issues/74690">gh-74690</a> and <a class="reference external" href="https://github.com/python/cpython/issues/103193">gh-103193</a>.)</p></li>
<li><p>All <a class="reference internal" href="../library/typing.html#typing.TypedDict" title="typing.TypedDict"><code class="xref py py-data docutils literal notranslate"><span class="pre">typing.TypedDict</span></code></a> and <a class="reference internal" href="../library/typing.html#typing.NamedTuple" title="typing.NamedTuple"><code class="xref py py-data docutils literal notranslate"><span class="pre">typing.NamedTuple</span></code></a> classes now have the
<code class="docutils literal notranslate"><span class="pre">__orig_bases__</span></code> attribute. (Contributed by Adrian Garcia Badaracco in
<a class="reference external" href="https://github.com/python/cpython/issues/103699">gh-103699</a>.)</p></li>
<li><p>Add <code class="docutils literal notranslate"><span class="pre">frozen_default</span></code> parameter to <a class="reference internal" href="../library/typing.html#typing.dataclass_transform" title="typing.dataclass_transform"><code class="xref py py-func docutils literal notranslate"><span class="pre">typing.dataclass_transform()</span></code></a>.
(Contributed by Erik De Bonte in <a class="reference external" href="https://github.com/python/cpython/issues/99957">gh-99957</a>.)</p></li>
</ul>
</section>
<section id="unicodedata">
<h3>unicodedata<a class="headerlink" href="#unicodedata" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>The Unicode database has been updated to version 15.0.0. (Contributed by
Benjamin Peterson in <a class="reference external" href="https://github.com/python/cpython/issues/96734">gh-96734</a>).</p></li>
</ul>
</section>
<section id="unittest">
<h3>unittest<a class="headerlink" href="#unittest" title="Link to this heading"></a></h3>
<p>Add a <code class="docutils literal notranslate"><span class="pre">--durations</span></code> command line option, showing the N slowest test cases:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">unittest</span> <span class="o">--</span><span class="n">durations</span><span class="o">=</span><span class="mi">3</span> <span class="n">lib</span><span class="o">.</span><span class="n">tests</span><span class="o">.</span><span class="n">test_threading</span>
<span class="o">.....</span>
<span class="n">Slowest</span> <span class="n">test</span> <span class="n">durations</span>
<span class="o">----------------------------------------------------------------------</span>
<span class="mf">1.210</span><span class="n">s</span> <span class="n">test_timeout</span> <span class="p">(</span><span class="n">Lib</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">test_threading</span><span class="o">.</span><span class="n">BarrierTests</span><span class="p">)</span>
<span class="mf">1.003</span><span class="n">s</span> <span class="n">test_default_timeout</span> <span class="p">(</span><span class="n">Lib</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">test_threading</span><span class="o">.</span><span class="n">BarrierTests</span><span class="p">)</span>
<span class="mf">0.518</span><span class="n">s</span> <span class="n">test_timeout</span> <span class="p">(</span><span class="n">Lib</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">test_threading</span><span class="o">.</span><span class="n">EventTests</span><span class="p">)</span>
<span class="p">(</span><span class="mf">0.000</span> <span class="n">durations</span> <span class="n">hidden</span><span class="o">.</span> <span class="n">Use</span> <span class="o">-</span><span class="n">v</span> <span class="n">to</span> <span class="n">show</span> <span class="n">these</span> <span class="n">durations</span><span class="o">.</span><span class="p">)</span>
<span class="o">----------------------------------------------------------------------</span>
<span class="n">Ran</span> <span class="mi">158</span> <span class="n">tests</span> <span class="ow">in</span> <span class="mf">9.869</span><span class="n">s</span>
<span class="n">OK</span> <span class="p">(</span><span class="n">skipped</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
</pre></div>
</div>
<p>(Contributed by Giampaolo Rodola in <a class="reference external" href="https://github.com/python/cpython/issues/48330">gh-48330</a>)</p>
</section>
<section id="uuid">
<h3>uuid<a class="headerlink" href="#uuid" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Add a <a class="reference internal" href="../library/uuid.html#uuid-cli"><span class="std std-ref">command-line interface</span></a>.
(Contributed by Adam Chhina in <a class="reference external" href="https://github.com/python/cpython/issues/88597">gh-88597</a>.)</p></li>
</ul>
</section>
</section>
<section id="optimizations">
<h2>Optimizations<a class="headerlink" href="#optimizations" title="Link to this heading"></a></h2>
<ul class="simple">
<li><p>Remove <code class="docutils literal notranslate"><span class="pre">wstr</span></code> and <code class="docutils literal notranslate"><span class="pre">wstr_length</span></code> members from Unicode objects.
It reduces object size by 8 or 16 bytes on 64bit platform. (<span class="target" id="index-27"></span><a class="pep reference external" href="https://peps.python.org/pep-0623/"><strong>PEP 623</strong></a>)
(Contributed by Inada Naoki in <a class="reference external" href="https://github.com/python/cpython/issues/92536">gh-92536</a>.)</p></li>
<li><p>Add experimental support for using the BOLT binary optimizer in the build
process, which improves performance by 1-5%.
(Contributed by Kevin Modzelewski in <a class="reference external" href="https://github.com/python/cpython/issues/90536">gh-90536</a> and tuned by Donghee Na in <a class="reference external" href="https://github.com/python/cpython/issues/101525">gh-101525</a>)</p></li>
<li><p>Speed up the regular expression substitution (functions <a class="reference internal" href="../library/re.html#re.sub" title="re.sub"><code class="xref py py-func docutils literal notranslate"><span class="pre">re.sub()</span></code></a> and
<a class="reference internal" href="../library/re.html#re.subn" title="re.subn"><code class="xref py py-func docutils literal notranslate"><span class="pre">re.subn()</span></code></a> and corresponding <code class="xref py py-class docutils literal notranslate"><span class="pre">re.Pattern</span></code> methods) for
replacement strings containing group references by 23 times.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/91524">gh-91524</a>.)</p></li>
<li><p>Speed up <a class="reference internal" href="../library/asyncio-task.html#asyncio.Task" title="asyncio.Task"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.Task</span></code></a> creation by deferring expensive string formatting.
(Contributed by Itamar Oren in <a class="reference external" href="https://github.com/python/cpython/issues/103793">gh-103793</a>.)</p></li>
<li><p>The <a class="reference internal" href="../library/tokenize.html#tokenize.tokenize" title="tokenize.tokenize"><code class="xref py py-func docutils literal notranslate"><span class="pre">tokenize.tokenize()</span></code></a> and <a class="reference internal" href="../library/tokenize.html#tokenize.generate_tokens" title="tokenize.generate_tokens"><code class="xref py py-func docutils literal notranslate"><span class="pre">tokenize.generate_tokens()</span></code></a> functions are
up to 64% faster as a side effect of the changes required to cover <span class="target" id="index-28"></span><a class="pep reference external" href="https://peps.python.org/pep-0701/"><strong>PEP 701</strong></a> in
the <a class="reference internal" href="../library/tokenize.html#module-tokenize" title="tokenize: Lexical scanner for Python source code."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tokenize</span></code></a> module. (Contributed by Marta Gómez Macías and Pablo Galindo
in <a class="reference external" href="https://github.com/python/cpython/issues/102856">gh-102856</a>.)</p></li>
<li><p>Speed up <a class="reference internal" href="../library/functions.html#super" title="super"><code class="xref py py-func docutils literal notranslate"><span class="pre">super()</span></code></a> method calls and attribute loads via the
new <a class="reference internal" href="../library/dis.html#opcode-LOAD_SUPER_ATTR"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_SUPER_ATTR</span></code></a> instruction. (Contributed by Carl Meyer and
Vladimir Matveev in <a class="reference external" href="https://github.com/python/cpython/issues/103497">gh-103497</a>.)</p></li>
</ul>
</section>
<section id="cpython-bytecode-changes">
<h2>CPython bytecode changes<a class="headerlink" href="#cpython-bytecode-changes" title="Link to this heading"></a></h2>
<ul class="simple">
<li><p>Remove the <code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_METHOD</span></code> instruction. It has been merged into
<a class="reference internal" href="../library/dis.html#opcode-LOAD_ATTR"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_ATTR</span></code></a>. <a class="reference internal" href="../library/dis.html#opcode-LOAD_ATTR"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_ATTR</span></code></a> will now behave like the old
<code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_METHOD</span></code> instruction if the low bit of its oparg is set.
(Contributed by Ken Jin in <a class="reference external" href="https://github.com/python/cpython/issues/93429">gh-93429</a>.)</p></li>
<li><p>Remove the <code class="xref std std-opcode docutils literal notranslate"><span class="pre">JUMP_IF_FALSE_OR_POP</span></code> and <code class="xref std std-opcode docutils literal notranslate"><span class="pre">JUMP_IF_TRUE_OR_POP</span></code>
instructions. (Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/102859">gh-102859</a>.)</p></li>
<li><p>Remove the <code class="xref std std-opcode docutils literal notranslate"><span class="pre">PRECALL</span></code> instruction. (Contributed by Mark Shannon in
<a class="reference external" href="https://github.com/python/cpython/issues/92925">gh-92925</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-BINARY_SLICE"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">BINARY_SLICE</span></code></a> and <a class="reference internal" href="../library/dis.html#opcode-STORE_SLICE"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">STORE_SLICE</span></code></a> instructions.
(Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/94163">gh-94163</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-CALL_INTRINSIC_1"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">CALL_INTRINSIC_1</span></code></a> instructions.
(Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/99005">gh-99005</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-CALL_INTRINSIC_2"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">CALL_INTRINSIC_2</span></code></a> instruction.
(Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/101799">gh-101799</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-CLEANUP_THROW"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">CLEANUP_THROW</span></code></a> instruction.
(Contributed by Brandt Bucher in <a class="reference external" href="https://github.com/python/cpython/issues/90997">gh-90997</a>.)</p></li>
<li><p>Add the <code class="xref std std-opcode docutils literal notranslate"><span class="pre">END_SEND</span></code> instruction.
(Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/103082">gh-103082</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-LOAD_FAST_AND_CLEAR"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_FAST_AND_CLEAR</span></code></a> instruction as part of the
implementation of <span class="target" id="index-29"></span><a class="pep reference external" href="https://peps.python.org/pep-0709/"><strong>PEP 709</strong></a>. (Contributed by Carl Meyer in <a class="reference external" href="https://github.com/python/cpython/issues/101441">gh-101441</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-LOAD_FAST_CHECK"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_FAST_CHECK</span></code></a> instruction.
(Contributed by Dennis Sweeney in <a class="reference external" href="https://github.com/python/cpython/issues/93143">gh-93143</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-LOAD_FROM_DICT_OR_DEREF"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_FROM_DICT_OR_DEREF</span></code></a>, <a class="reference internal" href="../library/dis.html#opcode-LOAD_FROM_DICT_OR_GLOBALS"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_FROM_DICT_OR_GLOBALS</span></code></a>,
and <a class="reference internal" href="../library/dis.html#opcode-LOAD_LOCALS"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_LOCALS</span></code></a> opcodes as part of the implementation of <span class="target" id="index-30"></span><a class="pep reference external" href="https://peps.python.org/pep-0695/"><strong>PEP 695</strong></a>.
Remove the <code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_CLASSDEREF</span></code> opcode, which can be replaced with
<a class="reference internal" href="../library/dis.html#opcode-LOAD_LOCALS"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_LOCALS</span></code></a> plus <a class="reference internal" href="../library/dis.html#opcode-LOAD_FROM_DICT_OR_DEREF"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_FROM_DICT_OR_DEREF</span></code></a>. (Contributed
by Jelle Zijlstra in <a class="reference external" href="https://github.com/python/cpython/issues/103764">gh-103764</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-LOAD_SUPER_ATTR"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_SUPER_ATTR</span></code></a> instruction. (Contributed by Carl Meyer and
Vladimir Matveev in <a class="reference external" href="https://github.com/python/cpython/issues/103497">gh-103497</a>.)</p></li>
<li><p>Add the <a class="reference internal" href="../library/dis.html#opcode-RETURN_CONST"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">RETURN_CONST</span></code></a> instruction. (Contributed by Wenyang Wang in <a class="reference external" href="https://github.com/python/cpython/issues/101632">gh-101632</a>.)</p></li>
</ul>
</section>
<section id="demos-and-tools">
<h2>Demos and Tools<a class="headerlink" href="#demos-and-tools" title="Link to this heading"></a></h2>
<ul class="simple">
<li><p>Remove the <code class="docutils literal notranslate"><span class="pre">Tools/demo/</span></code> directory which contained old demo scripts. A copy
can be found in the <a class="reference external" href="https://github.com/gvanrossum/old-demos">old-demos project</a>.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/97681">gh-97681</a>.)</p></li>
<li><p>Remove outdated example scripts of the <code class="docutils literal notranslate"><span class="pre">Tools/scripts/</span></code> directory.
A copy can be found in the <a class="reference external" href="https://github.com/gvanrossum/old-demos">old-demos project</a>.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/97669">gh-97669</a>.)</p></li>
</ul>
</section>
<section id="deprecated">
<h2>Deprecated<a class="headerlink" href="#deprecated" title="Link to this heading"></a></h2>
<ul>
<li><p><a class="reference internal" href="../library/argparse.html#module-argparse" title="argparse: Command-line option and argument parsing library."><code class="xref py py-mod docutils literal notranslate"><span class="pre">argparse</span></code></a>: The <em>type</em>, <em>choices</em>, and <em>metavar</em> parameters
of <code class="xref py py-class docutils literal notranslate"><span class="pre">argparse.BooleanOptionalAction</span></code> are deprecated
and will be removed in 3.14.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/92248">gh-92248</a>.)</p></li>
<li><p><a class="reference internal" href="../library/ast.html#module-ast" title="ast: Abstract Syntax Tree classes and manipulation."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ast</span></code></a>: The following <a class="reference internal" href="../library/ast.html#module-ast" title="ast: Abstract Syntax Tree classes and manipulation."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ast</span></code></a> features have been deprecated in documentation since
Python 3.8, now cause a <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> to be emitted at runtime
when they are accessed or used, and will be removed in Python 3.14:</p>
<ul class="simple">
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Num</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Str</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Bytes</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.NameConstant</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Ellipsis</span></code></p></li>
</ul>
<p>Use <a class="reference internal" href="../library/ast.html#ast.Constant" title="ast.Constant"><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Constant</span></code></a> instead.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/90953">gh-90953</a>.)</p>
</li>
<li><p><a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a>:</p>
<ul class="simple">
<li><p>The child watcher classes <a class="reference internal" href="../library/asyncio-policy.html#asyncio.MultiLoopChildWatcher" title="asyncio.MultiLoopChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.MultiLoopChildWatcher</span></code></a>,
<a class="reference internal" href="../library/asyncio-policy.html#asyncio.FastChildWatcher" title="asyncio.FastChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.FastChildWatcher</span></code></a>, <a class="reference internal" href="../library/asyncio-policy.html#asyncio.AbstractChildWatcher" title="asyncio.AbstractChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.AbstractChildWatcher</span></code></a>
and <a class="reference internal" href="../library/asyncio-policy.html#asyncio.SafeChildWatcher" title="asyncio.SafeChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.SafeChildWatcher</span></code></a> are deprecated and
will be removed in Python 3.14.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/94597">gh-94597</a>.)</p></li>
<li><p><a class="reference internal" href="../library/asyncio-policy.html#asyncio.set_child_watcher" title="asyncio.set_child_watcher"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.set_child_watcher()</span></code></a>, <a class="reference internal" href="../library/asyncio-policy.html#asyncio.get_child_watcher" title="asyncio.get_child_watcher"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.get_child_watcher()</span></code></a>,
<a class="reference internal" href="../library/asyncio-policy.html#asyncio.AbstractEventLoopPolicy.set_child_watcher" title="asyncio.AbstractEventLoopPolicy.set_child_watcher"><code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.AbstractEventLoopPolicy.set_child_watcher()</span></code></a> and
<a class="reference internal" href="../library/asyncio-policy.html#asyncio.AbstractEventLoopPolicy.get_child_watcher" title="asyncio.AbstractEventLoopPolicy.get_child_watcher"><code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.AbstractEventLoopPolicy.get_child_watcher()</span></code></a> are deprecated
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/94597">gh-94597</a>.)</p></li>
<li><p>The <a class="reference internal" href="../library/asyncio-eventloop.html#asyncio.get_event_loop" title="asyncio.get_event_loop"><code class="xref py py-meth docutils literal notranslate"><span class="pre">get_event_loop()</span></code></a> method of the
default event loop policy now emits a <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> if there
is no current event loop set and it decides to create one.
(Contributed by Serhiy Storchaka and Guido van Rossum in <a class="reference external" href="https://github.com/python/cpython/issues/100160">gh-100160</a>.)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/calendar.html#module-calendar" title="calendar: Functions for working with calendars, including some emulation of the Unix cal program."><code class="xref py py-mod docutils literal notranslate"><span class="pre">calendar</span></code></a>: <code class="docutils literal notranslate"><span class="pre">calendar.January</span></code> and <code class="docutils literal notranslate"><span class="pre">calendar.February</span></code> constants are deprecated and
replaced by <a class="reference internal" href="../library/calendar.html#calendar.JANUARY" title="calendar.JANUARY"><code class="xref py py-data docutils literal notranslate"><span class="pre">calendar.JANUARY</span></code></a> and <a class="reference internal" href="../library/calendar.html#calendar.FEBRUARY" title="calendar.FEBRUARY"><code class="xref py py-data docutils literal notranslate"><span class="pre">calendar.FEBRUARY</span></code></a>.
(Contributed by Prince Roshan in <a class="reference external" href="https://github.com/python/cpython/issues/103636">gh-103636</a>.)</p></li>
<li><p><a class="reference internal" href="../library/collections.abc.html#module-collections.abc" title="collections.abc: Abstract base classes for containers"><code class="xref py py-mod docutils literal notranslate"><span class="pre">collections.abc</span></code></a>: Deprecated <a class="reference internal" href="../library/collections.abc.html#collections.abc.ByteString" title="collections.abc.ByteString"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.ByteString</span></code></a>.
Prefer <code class="xref py py-class docutils literal notranslate"><span class="pre">Sequence</span></code> or <a class="reference internal" href="../library/collections.abc.html#collections.abc.Buffer" title="collections.abc.Buffer"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Buffer</span></code></a>.
For use in typing, prefer a union, like <code class="docutils literal notranslate"><span class="pre">bytes</span> <span class="pre">|</span> <span class="pre">bytearray</span></code>, or <a class="reference internal" href="../library/collections.abc.html#collections.abc.Buffer" title="collections.abc.Buffer"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Buffer</span></code></a>.
(Contributed by Shantanu Jain in <a class="reference external" href="https://github.com/python/cpython/issues/91896">gh-91896</a>.)</p></li>
<li><p><a class="reference internal" href="../library/datetime.html#module-datetime" title="datetime: Basic date and time types."><code class="xref py py-mod docutils literal notranslate"><span class="pre">datetime</span></code></a>: <a class="reference internal" href="../library/datetime.html#datetime.datetime" title="datetime.datetime"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a>s <a class="reference internal" href="../library/datetime.html#datetime.datetime.utcnow" title="datetime.datetime.utcnow"><code class="xref py py-meth docutils literal notranslate"><span class="pre">utcnow()</span></code></a> and
<a class="reference internal" href="../library/datetime.html#datetime.datetime.utcfromtimestamp" title="datetime.datetime.utcfromtimestamp"><code class="xref py py-meth docutils literal notranslate"><span class="pre">utcfromtimestamp()</span></code></a> are deprecated and will be
removed in a future version. Instead, use timezone-aware objects to represent
datetimes in UTC: respectively, call <a class="reference internal" href="../library/datetime.html#datetime.datetime.now" title="datetime.datetime.now"><code class="xref py py-meth docutils literal notranslate"><span class="pre">now()</span></code></a> and
<a class="reference internal" href="../library/datetime.html#datetime.datetime.fromtimestamp" title="datetime.datetime.fromtimestamp"><code class="xref py py-meth docutils literal notranslate"><span class="pre">fromtimestamp()</span></code></a> with the <em>tz</em> parameter set to
<a class="reference internal" href="../library/datetime.html#datetime.UTC" title="datetime.UTC"><code class="xref py py-const docutils literal notranslate"><span class="pre">datetime.UTC</span></code></a>.
(Contributed by Paul Ganssle in <a class="reference external" href="https://github.com/python/cpython/issues/103857">gh-103857</a>.)</p></li>
<li><p><a class="reference internal" href="../library/email.html#module-email" title="email: Package supporting the parsing, manipulating, and generating email messages."><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code></a>: Deprecate the <em>isdst</em> parameter in <a class="reference internal" href="../library/email.utils.html#email.utils.localtime" title="email.utils.localtime"><code class="xref py py-func docutils literal notranslate"><span class="pre">email.utils.localtime()</span></code></a>.
(Contributed by Alan Williams in <a class="reference external" href="https://github.com/python/cpython/issues/72346">gh-72346</a>.)</p></li>
<li><p><a class="reference internal" href="../library/importlib.html#module-importlib.abc" title="importlib.abc: Abstract base classes related to import"><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib.abc</span></code></a>: Deprecated the following classes, scheduled for removal in
Python 3.14:</p>
<ul class="simple">
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.abc.ResourceReader</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.abc.Traversable</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.abc.TraversableResources</span></code></p></li>
</ul>
<p>Use <a class="reference internal" href="../library/importlib.resources.abc.html#module-importlib.resources.abc" title="importlib.resources.abc: Abstract base classes for resources"><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib.resources.abc</span></code></a> classes instead:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../library/importlib.resources.abc.html#importlib.resources.abc.Traversable" title="importlib.resources.abc.Traversable"><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.resources.abc.Traversable</span></code></a></p></li>
<li><p><a class="reference internal" href="../library/importlib.resources.abc.html#importlib.resources.abc.TraversableResources" title="importlib.resources.abc.TraversableResources"><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.resources.abc.TraversableResources</span></code></a></p></li>
</ul>
<p>(Contributed by Jason R. Coombs and Hugo van Kemenade in <a class="reference external" href="https://github.com/python/cpython/issues/93963">gh-93963</a>.)</p>
</li>
<li><p><a class="reference internal" href="../library/itertools.html#module-itertools" title="itertools: Functions creating iterators for efficient looping."><code class="xref py py-mod docutils literal notranslate"><span class="pre">itertools</span></code></a>: Deprecate the support for copy, deepcopy, and pickle operations,
which is undocumented, inefficient, historically buggy, and inconsistent.
This will be removed in 3.14 for a significant reduction in code
volume and maintenance burden.
(Contributed by Raymond Hettinger in <a class="reference external" href="https://github.com/python/cpython/issues/101588">gh-101588</a>.)</p></li>
<li><p><a class="reference internal" href="../library/multiprocessing.html#module-multiprocessing" title="multiprocessing: Process-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">multiprocessing</span></code></a>: In Python 3.14, the default <a class="reference internal" href="../library/multiprocessing.html#module-multiprocessing" title="multiprocessing: Process-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">multiprocessing</span></code></a>
start method will change to a safer one on Linux, BSDs,
and other non-macOS POSIX platforms where <code class="docutils literal notranslate"><span class="pre">'fork'</span></code> is currently
the default (<a class="reference external" href="https://github.com/python/cpython/issues/84559">gh-84559</a>). Adding a runtime warning about this was deemed too
disruptive as the majority of code is not expected to care. Use the
<a class="reference internal" href="../library/multiprocessing.html#multiprocessing.get_context" title="multiprocessing.get_context"><code class="xref py py-func docutils literal notranslate"><span class="pre">get_context()</span></code></a> or
<a class="reference internal" href="../library/multiprocessing.html#multiprocessing.set_start_method" title="multiprocessing.set_start_method"><code class="xref py py-func docutils literal notranslate"><span class="pre">set_start_method()</span></code></a> APIs to explicitly specify when
your code <em>requires</em> <code class="docutils literal notranslate"><span class="pre">'fork'</span></code>. See <a class="reference internal" href="../library/multiprocessing.html#multiprocessing-start-methods"><span class="std std-ref">contexts and start methods</span></a>.</p></li>
<li><p><a class="reference internal" href="../library/pkgutil.html#module-pkgutil" title="pkgutil: Utilities for the import system."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pkgutil</span></code></a>: <a class="reference internal" href="../library/pkgutil.html#pkgutil.find_loader" title="pkgutil.find_loader"><code class="xref py py-func docutils literal notranslate"><span class="pre">pkgutil.find_loader()</span></code></a> and <a class="reference internal" href="../library/pkgutil.html#pkgutil.get_loader" title="pkgutil.get_loader"><code class="xref py py-func docutils literal notranslate"><span class="pre">pkgutil.get_loader()</span></code></a>
are deprecated and will be removed in Python 3.14;
use <a class="reference internal" href="../library/importlib.html#importlib.util.find_spec" title="importlib.util.find_spec"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.util.find_spec()</span></code></a> instead.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/97850">gh-97850</a>.)</p></li>
<li><p><a class="reference internal" href="../library/pty.html#module-pty" title="pty: Pseudo-Terminal Handling for Unix. (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">pty</span></code></a>: The module has two undocumented <code class="docutils literal notranslate"><span class="pre">master_open()</span></code> and <code class="docutils literal notranslate"><span class="pre">slave_open()</span></code>
functions that have been deprecated since Python 2 but only gained a
proper <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> in 3.12. Remove them in 3.14.
(Contributed by Soumendra Ganguly and Gregory P. Smith in <a class="reference external" href="https://github.com/python/cpython/issues/85984">gh-85984</a>.)</p></li>
<li><p><a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a>:</p>
<ul class="simple">
<li><p>The <code class="docutils literal notranslate"><span class="pre">st_ctime</span></code> fields return by <a class="reference internal" href="../library/os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.stat()</span></code></a> and <a class="reference internal" href="../library/os.html#os.lstat" title="os.lstat"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.lstat()</span></code></a> on
Windows are deprecated. In a future release, they will contain the last
metadata change time, consistent with other platforms. For now, they still
contain the creation time, which is also available in the new <code class="docutils literal notranslate"><span class="pre">st_birthtime</span></code>
field. (Contributed by Steve Dower in <a class="reference external" href="https://github.com/python/cpython/issues/99726">gh-99726</a>.)</p></li>
<li><p>On POSIX platforms, <a class="reference internal" href="../library/os.html#os.fork" title="os.fork"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.fork()</span></code></a> can now raise a
<a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> when it can detect being called from a
multithreaded process. There has always been a fundamental incompatibility
with the POSIX platform when doing so. Even if such code <em>appeared</em> to work.
We added the warning to raise awareness as issues encountered by code doing
this are becoming more frequent. See the <a class="reference internal" href="../library/os.html#os.fork" title="os.fork"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.fork()</span></code></a> documentation for
more details along with <a class="reference external" href="https://discuss.python.org/t/concerns-regarding-deprecation-of-fork-with-alive-threads/33555">this discussion on fork being incompatible with threads</a> for <em>why</em> were now surfacing this
longstanding platform compatibility problem to developers.</p></li>
</ul>
<p>When this warning appears due to usage of <a class="reference internal" href="../library/multiprocessing.html#module-multiprocessing" title="multiprocessing: Process-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">multiprocessing</span></code></a> or
<a class="reference internal" href="../library/concurrent.futures.html#module-concurrent.futures" title="concurrent.futures: Execute computations concurrently using threads or processes."><code class="xref py py-mod docutils literal notranslate"><span class="pre">concurrent.futures</span></code></a> the fix is to use a different
<a class="reference internal" href="../library/multiprocessing.html#module-multiprocessing" title="multiprocessing: Process-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">multiprocessing</span></code></a> start method such as <code class="docutils literal notranslate"><span class="pre">&quot;spawn&quot;</span></code> or <code class="docutils literal notranslate"><span class="pre">&quot;forkserver&quot;</span></code>.</p>
</li>
<li><p><a class="reference internal" href="../library/shutil.html#module-shutil" title="shutil: High-level file operations, including copying."><code class="xref py py-mod docutils literal notranslate"><span class="pre">shutil</span></code></a>: The <em>onerror</em> argument of <a class="reference internal" href="../library/shutil.html#shutil.rmtree" title="shutil.rmtree"><code class="xref py py-func docutils literal notranslate"><span class="pre">shutil.rmtree()</span></code></a> is deprecated;
use <em>onexc</em> instead. (Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/102828">gh-102828</a>.)</p></li>
<li><p><a class="reference internal" href="../library/sqlite3.html#module-sqlite3" title="sqlite3: A DB-API 2.0 implementation using SQLite 3.x."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sqlite3</span></code></a>:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../library/sqlite3.html#sqlite3-default-converters"><span class="std std-ref">default adapters and converters</span></a> are now deprecated.
Instead, use the <a class="reference internal" href="../library/sqlite3.html#sqlite3-adapter-converter-recipes"><span class="std std-ref">Adapter and converter recipes</span></a>
and tailor them to your needs.
(Contributed by Erlend E. Aasland in <a class="reference external" href="https://github.com/python/cpython/issues/90016">gh-90016</a>.)</p></li>
<li><p>In <a class="reference internal" href="../library/sqlite3.html#sqlite3.Cursor.execute" title="sqlite3.Cursor.execute"><code class="xref py py-meth docutils literal notranslate"><span class="pre">execute()</span></code></a>, <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> is now emitted
when <a class="reference internal" href="../library/sqlite3.html#sqlite3-placeholders"><span class="std std-ref">named placeholders</span></a> are used together with
parameters supplied as a <a class="reference internal" href="../glossary.html#term-sequence"><span class="xref std std-term">sequence</span></a> instead of as a <a class="reference internal" href="../library/stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal notranslate"><span class="pre">dict</span></code></a>.
Starting from Python 3.14, using named placeholders with parameters supplied
as a sequence will raise a <a class="reference internal" href="../library/sqlite3.html#sqlite3.ProgrammingError" title="sqlite3.ProgrammingError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ProgrammingError</span></code></a>.
(Contributed by Erlend E. Aasland in <a class="reference external" href="https://github.com/python/cpython/issues/101698">gh-101698</a>.)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/sys.html#module-sys" title="sys: Access system-specific parameters and functions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sys</span></code></a>: The <a class="reference internal" href="../library/sys.html#sys.last_type" title="sys.last_type"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.last_type</span></code></a>, <a class="reference internal" href="../library/sys.html#sys.last_value" title="sys.last_value"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.last_value</span></code></a> and <a class="reference internal" href="../library/sys.html#sys.last_traceback" title="sys.last_traceback"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.last_traceback</span></code></a>
fields are deprecated. Use <a class="reference internal" href="../library/sys.html#sys.last_exc" title="sys.last_exc"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.last_exc</span></code></a> instead.
(Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/102778">gh-102778</a>.)</p></li>
<li><p><a class="reference internal" href="../library/tarfile.html#module-tarfile" title="tarfile: Read and write tar-format archive files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tarfile</span></code></a>: Extracting tar archives without specifying <em>filter</em> is deprecated until
Python 3.14, when <code class="docutils literal notranslate"><span class="pre">'data'</span></code> filter will become the default.
See <a class="reference internal" href="../library/tarfile.html#tarfile-extraction-filter"><span class="std std-ref">Extraction filters</span></a> for details.</p></li>
<li><p><a class="reference internal" href="../library/typing.html#module-typing" title="typing: Support for type hints (see :pep:`484`)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">typing</span></code></a>:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../library/typing.html#typing.Hashable" title="typing.Hashable"><code class="xref py py-class docutils literal notranslate"><span class="pre">typing.Hashable</span></code></a> and <a class="reference internal" href="../library/typing.html#typing.Sized" title="typing.Sized"><code class="xref py py-class docutils literal notranslate"><span class="pre">typing.Sized</span></code></a>, aliases for
<a class="reference internal" href="../library/collections.abc.html#collections.abc.Hashable" title="collections.abc.Hashable"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Hashable</span></code></a> and <a class="reference internal" href="../library/collections.abc.html#collections.abc.Sized" title="collections.abc.Sized"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Sized</span></code></a> respectively, are
deprecated. (<a class="reference external" href="https://github.com/python/cpython/issues/94309">gh-94309</a>.)</p></li>
<li><p><a class="reference internal" href="../library/typing.html#typing.ByteString" title="typing.ByteString"><code class="xref py py-class docutils literal notranslate"><span class="pre">typing.ByteString</span></code></a>, deprecated since Python 3.9, now causes a
<a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> to be emitted when it is used.
(Contributed by Alex Waygood in <a class="reference external" href="https://github.com/python/cpython/issues/91896">gh-91896</a>.)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/xml.etree.elementtree.html#module-xml.etree.ElementTree" title="xml.etree.ElementTree: Implementation of the ElementTree API."><code class="xref py py-mod docutils literal notranslate"><span class="pre">xml.etree.ElementTree</span></code></a>: The module now emits <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a>
when testing the truth value of an <a class="reference internal" href="../library/xml.etree.elementtree.html#xml.etree.ElementTree.Element" title="xml.etree.ElementTree.Element"><code class="xref py py-class docutils literal notranslate"><span class="pre">xml.etree.ElementTree.Element</span></code></a>.
Before, the Python implementation emitted <a class="reference internal" href="../library/exceptions.html#FutureWarning" title="FutureWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">FutureWarning</span></code></a>, and the C
implementation emitted nothing.
(Contributed by Jacob Walls in <a class="reference external" href="https://github.com/python/cpython/issues/83122">gh-83122</a>.)</p></li>
<li><p>The 3-arg signatures (type, value, traceback) of <a class="reference internal" href="../reference/datamodel.html#coroutine.throw" title="coroutine.throw"><code class="xref py py-meth docutils literal notranslate"><span class="pre">coroutine</span> <span class="pre">throw()</span></code></a>, <a class="reference internal" href="../reference/expressions.html#generator.throw" title="generator.throw"><code class="xref py py-meth docutils literal notranslate"><span class="pre">generator</span> <span class="pre">throw()</span></code></a> and
<a class="reference internal" href="../reference/expressions.html#agen.athrow" title="agen.athrow"><code class="xref py py-meth docutils literal notranslate"><span class="pre">async</span> <span class="pre">generator</span> <span class="pre">throw()</span></code></a> are deprecated and
may be removed in a future version of Python. Use the single-arg versions
of these functions instead. (Contributed by Ofey Chan in <a class="reference external" href="https://github.com/python/cpython/issues/89874">gh-89874</a>.)</p></li>
<li><p><a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> is now raised when <a class="reference internal" href="../reference/datamodel.html#module.__package__" title="module.__package__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__package__</span></code></a> on a
module differs from
<a class="reference internal" href="../library/importlib.html#importlib.machinery.ModuleSpec.parent" title="importlib.machinery.ModuleSpec.parent"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__spec__.parent</span></code></a> (previously
it was <a class="reference internal" href="../library/exceptions.html#ImportWarning" title="ImportWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ImportWarning</span></code></a>).
(Contributed by Brett Cannon in <a class="reference external" href="https://github.com/python/cpython/issues/65961">gh-65961</a>.)</p></li>
<li><p>Setting <a class="reference internal" href="../reference/datamodel.html#module.__package__" title="module.__package__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__package__</span></code></a> or <a class="reference internal" href="../reference/datamodel.html#module.__cached__" title="module.__cached__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__cached__</span></code></a> on a
module is deprecated, and will cease to be set or taken into consideration by
the import system in Python 3.14. (Contributed by Brett Cannon in <a class="reference external" href="https://github.com/python/cpython/issues/65961">gh-65961</a>.)</p></li>
<li><p>The bitwise inversion operator (<code class="docutils literal notranslate"><span class="pre">~</span></code>) on bool is deprecated. It will throw an
error in Python 3.16. Use <code class="docutils literal notranslate"><span class="pre">not</span></code> for logical negation of bools instead.
In the rare case that you really need the bitwise inversion of the underlying
<code class="docutils literal notranslate"><span class="pre">int</span></code>, convert to int explicitly: <code class="docutils literal notranslate"><span class="pre">~int(x)</span></code>. (Contributed by Tim Hoffmann
in <a class="reference external" href="https://github.com/python/cpython/issues/103487">gh-103487</a>.)</p></li>
<li><p>Accessing <a class="reference internal" href="../reference/datamodel.html#codeobject.co_lnotab" title="codeobject.co_lnotab"><code class="xref py py-attr docutils literal notranslate"><span class="pre">co_lnotab</span></code></a> on code objects was deprecated in
Python 3.10 via <span class="target" id="index-31"></span><a class="pep reference external" href="https://peps.python.org/pep-0626/"><strong>PEP 626</strong></a>,
but it only got a proper <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/101866">gh-101866</a>.)</p></li>
</ul>
<section id="pending-removal-in-python-3-13">
<h3>Pending Removal in Python 3.13<a class="headerlink" href="#pending-removal-in-python-3-13" title="Link to this heading"></a></h3>
<p>Modules (see <span class="target" id="index-32"></span><a class="pep reference external" href="https://peps.python.org/pep-0594/"><strong>PEP 594</strong></a>):</p>
<ul class="simple">
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">aifc</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">audioop</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">cgi</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">cgitb</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">chunk</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">crypt</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">imghdr</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">mailcap</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">msilib</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">nis</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">nntplib</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">ossaudiodev</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">pipes</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">sndhdr</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">spwd</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">sunau</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">telnetlib</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">uu</span></code></p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">xdrlib</span></code></p></li>
</ul>
<p>Other modules:</p>
<ul class="simple">
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">lib2to3</span></code>, and the <strong class="program">2to3</strong> program (<a class="reference external" href="https://github.com/python/cpython/issues/84540">gh-84540</a>)</p></li>
</ul>
<p>APIs:</p>
<ul>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">configparser.LegacyInterpolation</span></code> (<a class="reference external" href="https://github.com/python/cpython/issues/90765">gh-90765</a>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">locale.resetlocale()</span></code> (<a class="reference external" href="https://github.com/python/cpython/issues/90817">gh-90817</a>)</p></li>
<li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">turtle.RawTurtle.settiltangle()</span></code> (<a class="reference external" href="https://github.com/python/cpython/issues/50096">gh-50096</a>)</p></li>
<li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">unittest.findTestCases()</span></code> (<a class="reference external" href="https://github.com/python/cpython/issues/50096">gh-50096</a>)</p></li>
<li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">unittest.getTestCaseNames()</span></code> (<a class="reference external" href="https://github.com/python/cpython/issues/50096">gh-50096</a>)</p></li>
<li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">unittest.makeSuite()</span></code> (<a class="reference external" href="https://github.com/python/cpython/issues/50096">gh-50096</a>)</p></li>
<li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">unittest.TestProgram.usageExit()</span></code> (<a class="reference external" href="https://github.com/python/cpython/issues/67048">gh-67048</a>)</p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">webbrowser.MacOSX</span></code> (<a class="reference external" href="https://github.com/python/cpython/issues/86421">gh-86421</a>)</p></li>
<li><p><a class="reference internal" href="../library/functions.html#classmethod" title="classmethod"><code class="xref py py-class docutils literal notranslate"><span class="pre">classmethod</span></code></a> descriptor chaining (<a class="reference external" href="https://github.com/python/cpython/issues/89519">gh-89519</a>)</p></li>
<li><p><a class="reference internal" href="../library/importlib.resources.html#module-importlib.resources" title="importlib.resources: Package resource reading, opening, and access"><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib.resources</span></code></a> deprecated methods:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">contents()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">is_resource()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">open_binary()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">open_text()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">path()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">read_binary()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">read_text()</span></code></p></li>
</ul>
<p>Use <a class="reference internal" href="../library/importlib.resources.html#importlib.resources.files" title="importlib.resources.files"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.resources.files()</span></code></a> instead. Refer to <a class="reference external" href="https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy">importlib-resources: Migrating from Legacy</a> (<a class="reference external" href="https://github.com/python/cpython/issues/106531">gh-106531</a>)</p>
</li>
</ul>
</section>
<section id="pending-removal-in-python-3-14">
<h3>Pending Removal in Python 3.14<a class="headerlink" href="#pending-removal-in-python-3-14" title="Link to this heading"></a></h3>
<ul>
<li><p><a class="reference internal" href="../library/argparse.html#module-argparse" title="argparse: Command-line option and argument parsing library."><code class="xref py py-mod docutils literal notranslate"><span class="pre">argparse</span></code></a>: The <em>type</em>, <em>choices</em>, and <em>metavar</em> parameters
of <code class="xref py py-class docutils literal notranslate"><span class="pre">argparse.BooleanOptionalAction</span></code> are deprecated
and will be removed in 3.14.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/92248">gh-92248</a>.)</p></li>
<li><p><a class="reference internal" href="../library/ast.html#module-ast" title="ast: Abstract Syntax Tree classes and manipulation."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ast</span></code></a>: The following features have been deprecated in documentation
since Python 3.8, now cause a <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> to be emitted at
runtime when they are accessed or used, and will be removed in Python 3.14:</p>
<ul class="simple">
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Num</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Str</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Bytes</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.NameConstant</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Ellipsis</span></code></p></li>
</ul>
<p>Use <a class="reference internal" href="../library/ast.html#ast.Constant" title="ast.Constant"><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.Constant</span></code></a> instead.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/90953">gh-90953</a>.)</p>
</li>
<li><p><a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a>:</p>
<ul class="simple">
<li><p>The child watcher classes <a class="reference internal" href="../library/asyncio-policy.html#asyncio.MultiLoopChildWatcher" title="asyncio.MultiLoopChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">MultiLoopChildWatcher</span></code></a>,
<a class="reference internal" href="../library/asyncio-policy.html#asyncio.FastChildWatcher" title="asyncio.FastChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">FastChildWatcher</span></code></a>, <a class="reference internal" href="../library/asyncio-policy.html#asyncio.AbstractChildWatcher" title="asyncio.AbstractChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractChildWatcher</span></code></a>
and <a class="reference internal" href="../library/asyncio-policy.html#asyncio.SafeChildWatcher" title="asyncio.SafeChildWatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">SafeChildWatcher</span></code></a> are deprecated and
will be removed in Python 3.14.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/94597">gh-94597</a>.)</p></li>
<li><p><a class="reference internal" href="../library/asyncio-policy.html#asyncio.set_child_watcher" title="asyncio.set_child_watcher"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.set_child_watcher()</span></code></a>, <a class="reference internal" href="../library/asyncio-policy.html#asyncio.get_child_watcher" title="asyncio.get_child_watcher"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.get_child_watcher()</span></code></a>,
<a class="reference internal" href="../library/asyncio-policy.html#asyncio.AbstractEventLoopPolicy.set_child_watcher" title="asyncio.AbstractEventLoopPolicy.set_child_watcher"><code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.AbstractEventLoopPolicy.set_child_watcher()</span></code></a> and
<a class="reference internal" href="../library/asyncio-policy.html#asyncio.AbstractEventLoopPolicy.get_child_watcher" title="asyncio.AbstractEventLoopPolicy.get_child_watcher"><code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.AbstractEventLoopPolicy.get_child_watcher()</span></code></a> are deprecated
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/94597">gh-94597</a>.)</p></li>
<li><p>The <a class="reference internal" href="../library/asyncio-eventloop.html#asyncio.get_event_loop" title="asyncio.get_event_loop"><code class="xref py py-meth docutils literal notranslate"><span class="pre">get_event_loop()</span></code></a> method of the
default event loop policy now emits a <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> if there
is no current event loop set and it decides to create one.
(Contributed by Serhiy Storchaka and Guido van Rossum in <a class="reference external" href="https://github.com/python/cpython/issues/100160">gh-100160</a>.)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/collections.abc.html#module-collections.abc" title="collections.abc: Abstract base classes for containers"><code class="xref py py-mod docutils literal notranslate"><span class="pre">collections.abc</span></code></a>: Deprecated <a class="reference internal" href="../library/collections.abc.html#collections.abc.ByteString" title="collections.abc.ByteString"><code class="xref py py-class docutils literal notranslate"><span class="pre">ByteString</span></code></a>.
Prefer <code class="xref py py-class docutils literal notranslate"><span class="pre">Sequence</span></code> or <a class="reference internal" href="../library/collections.abc.html#collections.abc.Buffer" title="collections.abc.Buffer"><code class="xref py py-class docutils literal notranslate"><span class="pre">Buffer</span></code></a>.
For use in typing, prefer a union, like <code class="docutils literal notranslate"><span class="pre">bytes</span> <span class="pre">|</span> <span class="pre">bytearray</span></code>,
or <a class="reference internal" href="../library/collections.abc.html#collections.abc.Buffer" title="collections.abc.Buffer"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Buffer</span></code></a>.
(Contributed by Shantanu Jain in <a class="reference external" href="https://github.com/python/cpython/issues/91896">gh-91896</a>.)</p></li>
<li><p><a class="reference internal" href="../library/email.html#module-email" title="email: Package supporting the parsing, manipulating, and generating email messages."><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code></a>: Deprecated the <em>isdst</em> parameter in <a class="reference internal" href="../library/email.utils.html#email.utils.localtime" title="email.utils.localtime"><code class="xref py py-func docutils literal notranslate"><span class="pre">email.utils.localtime()</span></code></a>.
(Contributed by Alan Williams in <a class="reference external" href="https://github.com/python/cpython/issues/72346">gh-72346</a>.)</p></li>
<li><p><a class="reference internal" href="../library/importlib.html#module-importlib.abc" title="importlib.abc: Abstract base classes related to import"><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib.abc</span></code></a> deprecated classes:</p>
<ul class="simple">
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.abc.ResourceReader</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.abc.Traversable</span></code></p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.abc.TraversableResources</span></code></p></li>
</ul>
<p>Use <a class="reference internal" href="../library/importlib.resources.abc.html#module-importlib.resources.abc" title="importlib.resources.abc: Abstract base classes for resources"><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib.resources.abc</span></code></a> classes instead:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../library/importlib.resources.abc.html#importlib.resources.abc.Traversable" title="importlib.resources.abc.Traversable"><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.resources.abc.Traversable</span></code></a></p></li>
<li><p><a class="reference internal" href="../library/importlib.resources.abc.html#importlib.resources.abc.TraversableResources" title="importlib.resources.abc.TraversableResources"><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.resources.abc.TraversableResources</span></code></a></p></li>
</ul>
<p>(Contributed by Jason R. Coombs and Hugo van Kemenade in <a class="reference external" href="https://github.com/python/cpython/issues/93963">gh-93963</a>.)</p>
</li>
<li><p><a class="reference internal" href="../library/itertools.html#module-itertools" title="itertools: Functions creating iterators for efficient looping."><code class="xref py py-mod docutils literal notranslate"><span class="pre">itertools</span></code></a> 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 <a class="reference external" href="https://github.com/python/cpython/issues/101588">gh-101588</a>.)</p></li>
<li><p><a class="reference internal" href="../library/multiprocessing.html#module-multiprocessing" title="multiprocessing: Process-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">multiprocessing</span></code></a>: The default start method will change to a safer one on
Linux, BSDs, and other non-macOS POSIX platforms where <code class="docutils literal notranslate"><span class="pre">'fork'</span></code> is currently
the default (<a class="reference external" href="https://github.com/python/cpython/issues/84559">gh-84559</a>). Adding a runtime warning about this was deemed too
disruptive as the majority of code is not expected to care. Use the
<a class="reference internal" href="../library/multiprocessing.html#multiprocessing.get_context" title="multiprocessing.get_context"><code class="xref py py-func docutils literal notranslate"><span class="pre">get_context()</span></code></a> or
<a class="reference internal" href="../library/multiprocessing.html#multiprocessing.set_start_method" title="multiprocessing.set_start_method"><code class="xref py py-func docutils literal notranslate"><span class="pre">set_start_method()</span></code></a> APIs to explicitly specify when
your code <em>requires</em> <code class="docutils literal notranslate"><span class="pre">'fork'</span></code>. See <a class="reference internal" href="../library/multiprocessing.html#multiprocessing-start-methods"><span class="std std-ref">Contexts and start methods</span></a>.</p></li>
<li><p><a class="reference internal" href="../library/pathlib.html#module-pathlib" title="pathlib: Object-oriented filesystem paths"><code class="xref py py-mod docutils literal notranslate"><span class="pre">pathlib</span></code></a>: <a class="reference internal" href="../library/pathlib.html#pathlib.PurePath.is_relative_to" title="pathlib.PurePath.is_relative_to"><code class="xref py py-meth docutils literal notranslate"><span class="pre">is_relative_to()</span></code></a> and
<a class="reference internal" href="../library/pathlib.html#pathlib.PurePath.relative_to" title="pathlib.PurePath.relative_to"><code class="xref py py-meth docutils literal notranslate"><span class="pre">relative_to()</span></code></a>: passing additional arguments is
deprecated.</p></li>
<li><p><a class="reference internal" href="../library/pkgutil.html#module-pkgutil" title="pkgutil: Utilities for the import system."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pkgutil</span></code></a>: <a class="reference internal" href="../library/pkgutil.html#pkgutil.find_loader" title="pkgutil.find_loader"><code class="xref py py-func docutils literal notranslate"><span class="pre">find_loader()</span></code></a> and <a class="reference internal" href="../library/pkgutil.html#pkgutil.get_loader" title="pkgutil.get_loader"><code class="xref py py-func docutils literal notranslate"><span class="pre">get_loader()</span></code></a>
now raise <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a>;
use <a class="reference internal" href="../library/importlib.html#importlib.util.find_spec" title="importlib.util.find_spec"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.util.find_spec()</span></code></a> instead.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/97850">gh-97850</a>.)</p></li>
<li><p><a class="reference internal" href="../library/pty.html#module-pty" title="pty: Pseudo-Terminal Handling for Unix. (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">pty</span></code></a>:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">master_open()</span></code>: use <a class="reference internal" href="../library/pty.html#pty.openpty" title="pty.openpty"><code class="xref py py-func docutils literal notranslate"><span class="pre">pty.openpty()</span></code></a>.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">slave_open()</span></code>: use <a class="reference internal" href="../library/pty.html#pty.openpty" title="pty.openpty"><code class="xref py py-func docutils literal notranslate"><span class="pre">pty.openpty()</span></code></a>.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/sqlite3.html#module-sqlite3" title="sqlite3: A DB-API 2.0 implementation using SQLite 3.x."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sqlite3</span></code></a>:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../library/sqlite3.html#sqlite3.version" title="sqlite3.version"><code class="xref py py-data docutils literal notranslate"><span class="pre">version</span></code></a> and <a class="reference internal" href="../library/sqlite3.html#sqlite3.version_info" title="sqlite3.version_info"><code class="xref py py-data docutils literal notranslate"><span class="pre">version_info</span></code></a>.</p></li>
<li><p><a class="reference internal" href="../library/sqlite3.html#sqlite3.Cursor.execute" title="sqlite3.Cursor.execute"><code class="xref py py-meth docutils literal notranslate"><span class="pre">execute()</span></code></a> and <a class="reference internal" href="../library/sqlite3.html#sqlite3.Cursor.executemany" title="sqlite3.Cursor.executemany"><code class="xref py py-meth docutils literal notranslate"><span class="pre">executemany()</span></code></a>
if <a class="reference internal" href="../library/sqlite3.html#sqlite3-placeholders"><span class="std std-ref">named placeholders</span></a> are used and
<em>parameters</em> is a sequence instead of a <a class="reference internal" href="../library/stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal notranslate"><span class="pre">dict</span></code></a>.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/typing.html#module-typing" title="typing: Support for type hints (see :pep:`484`)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">typing</span></code></a>: <a class="reference internal" href="../library/typing.html#typing.ByteString" title="typing.ByteString"><code class="xref py py-class docutils literal notranslate"><span class="pre">ByteString</span></code></a>, deprecated since Python 3.9,
now causes a <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> to be emitted when it is used.</p></li>
<li><p><a class="reference internal" href="../library/urllib.html#module-urllib" title="urllib"><code class="xref py py-mod docutils literal notranslate"><span class="pre">urllib</span></code></a>:
<code class="xref py py-class docutils literal notranslate"><span class="pre">urllib.parse.Quoter</span></code> is deprecated: it was not intended to be a
public API.
(Contributed by Gregory P. Smith in <a class="reference external" href="https://github.com/python/cpython/issues/88168">gh-88168</a>.)</p></li>
</ul>
</section>
<section id="pending-removal-in-python-3-15">
<h3>Pending Removal in Python 3.15<a class="headerlink" href="#pending-removal-in-python-3-15" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>The import system:</p>
<ul>
<li><p>Setting <a class="reference internal" href="../reference/datamodel.html#module.__cached__" title="module.__cached__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__cached__</span></code></a> on a module while
failing to set <a class="reference internal" href="../library/importlib.html#importlib.machinery.ModuleSpec.cached" title="importlib.machinery.ModuleSpec.cached"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__spec__.cached</span></code></a>
is deprecated. In Python 3.15, <code class="xref py py-attr docutils literal notranslate"><span class="pre">__cached__</span></code> will cease to be set or
take into consideration by the import system or standard library. (<a class="reference external" href="https://github.com/python/cpython/issues/97879">gh-97879</a>)</p></li>
<li><p>Setting <a class="reference internal" href="../reference/datamodel.html#module.__package__" title="module.__package__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__package__</span></code></a> on a module while
failing to set <a class="reference internal" href="../library/importlib.html#importlib.machinery.ModuleSpec.parent" title="importlib.machinery.ModuleSpec.parent"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__spec__.parent</span></code></a>
is deprecated. In Python 3.15, <code class="xref py py-attr docutils literal notranslate"><span class="pre">__package__</span></code> will cease to be set or
take into consideration by the import system or standard library. (<a class="reference external" href="https://github.com/python/cpython/issues/97879">gh-97879</a>)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a>:</p>
<ul>
<li><p>The undocumented <code class="xref py py-func docutils literal notranslate"><span class="pre">ctypes.SetPointerType()</span></code> function
has been deprecated since Python 3.13.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/http.server.html#module-http.server" title="http.server: HTTP server and request handlers."><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.server</span></code></a>:</p>
<ul>
<li><p>The obsolete and rarely used <a class="reference internal" href="../library/http.server.html#http.server.CGIHTTPRequestHandler" title="http.server.CGIHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">CGIHTTPRequestHandler</span></code></a>
has been deprecated since Python 3.13.
No direct replacement exists.
<em>Anything</em> is better than CGI to interface
a web server with a request handler.</p></li>
<li><p>The <code class="xref std std-option docutils literal notranslate"><span class="pre">--cgi</span></code> flag to the <strong class="program">python -m http.server</strong>
command-line interface has been deprecated since Python 3.13.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/importlib.html#module-importlib" title="importlib: The implementation of the import machinery."><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib</span></code></a>:</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">load_module()</span></code> method: use <code class="docutils literal notranslate"><span class="pre">exec_module()</span></code> instead.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/locale.html#module-locale" title="locale: Internationalization services."><code class="xref py py-class docutils literal notranslate"><span class="pre">locale</span></code></a>:</p>
<ul>
<li><p>The <a class="reference internal" href="../library/locale.html#locale.getdefaultlocale" title="locale.getdefaultlocale"><code class="xref py py-func docutils literal notranslate"><span class="pre">getdefaultlocale()</span></code></a> function
has been deprecated since Python 3.11.
Its removal was originally planned for Python 3.13 (<a class="reference external" href="https://github.com/python/cpython/issues/90817">gh-90817</a>),
but has been postponed to Python 3.15.
Use <a class="reference internal" href="../library/locale.html#locale.getlocale" title="locale.getlocale"><code class="xref py py-func docutils literal notranslate"><span class="pre">getlocale()</span></code></a>, <a class="reference internal" href="../library/locale.html#locale.setlocale" title="locale.setlocale"><code class="xref py py-func docutils literal notranslate"><span class="pre">setlocale()</span></code></a>,
and <a class="reference internal" href="../library/locale.html#locale.getencoding" title="locale.getencoding"><code class="xref py py-func docutils literal notranslate"><span class="pre">getencoding()</span></code></a> instead.
(Contributed by Hugo van Kemenade in <a class="reference external" href="https://github.com/python/cpython/issues/111187">gh-111187</a>.)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/pathlib.html#module-pathlib" title="pathlib: Object-oriented filesystem paths"><code class="xref py py-mod docutils literal notranslate"><span class="pre">pathlib</span></code></a>:</p>
<ul>
<li><p><a class="reference internal" href="../library/pathlib.html#pathlib.PurePath.is_reserved" title="pathlib.PurePath.is_reserved"><code class="xref py py-meth docutils literal notranslate"><span class="pre">PurePath.is_reserved()</span></code></a>
has been deprecated since Python 3.13.
Use <a class="reference internal" href="../library/os.path.html#os.path.isreserved" title="os.path.isreserved"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.path.isreserved()</span></code></a> to detect reserved paths on Windows.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/platform.html#module-platform" title="platform: Retrieves as much platform identifying data as possible."><code class="xref py py-mod docutils literal notranslate"><span class="pre">platform</span></code></a>:</p>
<ul>
<li><p><a class="reference internal" href="../library/platform.html#platform.java_ver" title="platform.java_ver"><code class="xref py py-func docutils literal notranslate"><span class="pre">java_ver()</span></code></a> has been deprecated since Python 3.13.
This function is only useful for Jython support, has a confusing API,
and is largely untested.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/sysconfig.html#module-sysconfig" title="sysconfig: Python's configuration information"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sysconfig</span></code></a>:</p>
<ul>
<li><p>The <em>check_home</em> argument of <a class="reference internal" href="../library/sysconfig.html#sysconfig.is_python_build" title="sysconfig.is_python_build"><code class="xref py py-func docutils literal notranslate"><span class="pre">sysconfig.is_python_build()</span></code></a> has been
deprecated since Python 3.12.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/threading.html#module-threading" title="threading: Thread-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code></a>:</p>
<ul>
<li><p><a class="reference internal" href="../library/threading.html#threading.RLock" title="threading.RLock"><code class="xref py py-func docutils literal notranslate"><span class="pre">RLock()</span></code></a> will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/types.html#module-types" title="types: Names for built-in types."><code class="xref py py-mod docutils literal notranslate"><span class="pre">types</span></code></a>:</p>
<ul>
<li><p><a class="reference internal" href="../library/types.html#types.CodeType" title="types.CodeType"><code class="xref py py-class docutils literal notranslate"><span class="pre">types.CodeType</span></code></a>: Accessing <a class="reference internal" href="../reference/datamodel.html#codeobject.co_lnotab" title="codeobject.co_lnotab"><code class="xref py py-attr docutils literal notranslate"><span class="pre">co_lnotab</span></code></a> was
deprecated in <span class="target" id="index-33"></span><a class="pep reference external" href="https://peps.python.org/pep-0626/"><strong>PEP 626</strong></a>
since 3.10 and was planned to be removed in 3.12,
but it only got a proper <a class="reference internal" href="../library/exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DeprecationWarning</span></code></a> in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/101866">gh-101866</a>.)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/typing.html#module-typing" title="typing: Support for type hints (see :pep:`484`)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">typing</span></code></a>:</p>
<ul>
<li><p>The undocumented keyword argument syntax for creating
<a class="reference internal" href="../library/typing.html#typing.NamedTuple" title="typing.NamedTuple"><code class="xref py py-class docutils literal notranslate"><span class="pre">NamedTuple</span></code></a> classes
(e.g. <code class="docutils literal notranslate"><span class="pre">Point</span> <span class="pre">=</span> <span class="pre">NamedTuple(&quot;Point&quot;,</span> <span class="pre">x=int,</span> <span class="pre">y=int)</span></code>)
has been deprecated since Python 3.13.
Use the class-based syntax or the functional syntax instead.</p></li>
<li><p>The <a class="reference internal" href="../library/typing.html#typing.no_type_check_decorator" title="typing.no_type_check_decorator"><code class="xref py py-func docutils literal notranslate"><span class="pre">typing.no_type_check_decorator()</span></code></a> decorator function
has been deprecated since Python 3.13.
After eight years in the <a class="reference internal" href="../library/typing.html#module-typing" title="typing: Support for type hints (see :pep:`484`)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">typing</span></code></a> module,
it has yet to be supported by any major type checker.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/wave.html#module-wave" title="wave: Provide an interface to the WAV sound format."><code class="xref py py-mod docutils literal notranslate"><span class="pre">wave</span></code></a>:</p>
<ul>
<li><p>The <a class="reference internal" href="../library/wave.html#wave.Wave_read.getmark" title="wave.Wave_read.getmark"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getmark()</span></code></a>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">setmark()</span></code>,
and <a class="reference internal" href="../library/wave.html#wave.Wave_read.getmarkers" title="wave.Wave_read.getmarkers"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getmarkers()</span></code></a> methods of
the <a class="reference internal" href="../library/wave.html#wave.Wave_read" title="wave.Wave_read"><code class="xref py py-class docutils literal notranslate"><span class="pre">Wave_read</span></code></a> and <a class="reference internal" href="../library/wave.html#wave.Wave_write" title="wave.Wave_write"><code class="xref py py-class docutils literal notranslate"><span class="pre">Wave_write</span></code></a> classes
have been deprecated since Python 3.13.</p></li>
</ul>
</li>
</ul>
</section>
<section id="pending-removal-in-python-3-16">
<h3>Pending removal in Python 3.16<a class="headerlink" href="#pending-removal-in-python-3-16" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>The import system:</p>
<ul>
<li><p>Setting <a class="reference internal" href="../reference/datamodel.html#module.__loader__" title="module.__loader__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__loader__</span></code></a> on a module while
failing to set <a class="reference internal" href="../library/importlib.html#importlib.machinery.ModuleSpec.loader" title="importlib.machinery.ModuleSpec.loader"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__spec__.loader</span></code></a>
is deprecated. In Python 3.16, <code class="xref py py-attr docutils literal notranslate"><span class="pre">__loader__</span></code> will cease to be set or
taken into consideration by the import system or the standard library.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/array.html#module-array" title="array: Space efficient arrays of uniformly typed numeric values."><code class="xref py py-mod docutils literal notranslate"><span class="pre">array</span></code></a>:</p>
<ul>
<li><p>The <code class="docutils literal notranslate"><span class="pre">'u'</span></code> format code (<code class="xref c c-type docutils literal notranslate"><span class="pre">wchar_t</span></code>)
has been deprecated in documentation since Python 3.3
and at runtime since Python 3.13.
Use the <code class="docutils literal notranslate"><span class="pre">'w'</span></code> format code (<a class="reference internal" href="../c-api/unicode.html#c.Py_UCS4" title="Py_UCS4"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_UCS4</span></code></a>)
for Unicode characters instead.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a>:</p>
<ul>
<li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.iscoroutinefunction()</span></code> is deprecated
and will be removed in Python 3.16,
use <a class="reference internal" href="../library/inspect.html#inspect.iscoroutinefunction" title="inspect.iscoroutinefunction"><code class="xref py py-func docutils literal notranslate"><span class="pre">inspect.iscoroutinefunction()</span></code></a> instead.
(Contributed by Jiahao Li and Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/122875">gh-122875</a>.)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/builtins.html#module-builtins" title="builtins: The module that provides the built-in namespace."><code class="xref py py-mod docutils literal notranslate"><span class="pre">builtins</span></code></a>:</p>
<ul>
<li><p>Bitwise inversion on boolean types, <code class="docutils literal notranslate"><span class="pre">~True</span></code> or <code class="docutils literal notranslate"><span class="pre">~False</span></code>
has been deprecated since Python 3.12,
as it produces surprising and unintuitive results (<code class="docutils literal notranslate"><span class="pre">-2</span></code> and <code class="docutils literal notranslate"><span class="pre">-1</span></code>).
Use <code class="docutils literal notranslate"><span class="pre">not</span> <span class="pre">x</span></code> instead for the logical negation of a Boolean.
In the rare case that you need the bitwise inversion of
the underlying integer, convert to <code class="docutils literal notranslate"><span class="pre">int</span></code> explicitly (<code class="docutils literal notranslate"><span class="pre">~int(x)</span></code>).</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/shutil.html#module-shutil" title="shutil: High-level file operations, including copying."><code class="xref py py-mod docutils literal notranslate"><span class="pre">shutil</span></code></a>:</p>
<ul>
<li><p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">ExecError</span></code> exception
has been deprecated since Python 3.14.
It has not been used by any function in <code class="xref py py-mod docutils literal notranslate"><span class="pre">shutil</span></code> since Python 3.4,
and is now an alias of <a class="reference internal" href="../library/exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">RuntimeError</span></code></a>.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/symtable.html#module-symtable" title="symtable: Interface to the compiler's internal symbol tables."><code class="xref py py-mod docutils literal notranslate"><span class="pre">symtable</span></code></a>:</p>
<ul>
<li><p>The <a class="reference internal" href="../library/symtable.html#symtable.Class.get_methods" title="symtable.Class.get_methods"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Class.get_methods</span></code></a> method
has been deprecated since Python 3.14.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/sys.html#module-sys" title="sys: Access system-specific parameters and functions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sys</span></code></a>:</p>
<ul>
<li><p>The <a class="reference internal" href="../library/sys.html#sys._enablelegacywindowsfsencoding" title="sys._enablelegacywindowsfsencoding"><code class="xref py py-func docutils literal notranslate"><span class="pre">_enablelegacywindowsfsencoding()</span></code></a> function
has been deprecated since Python 3.13.
Use the <span class="target" id="index-34"></span><a class="reference internal" href="../using/cmdline.html#envvar-PYTHONLEGACYWINDOWSFSENCODING"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONLEGACYWINDOWSFSENCODING</span></code></a> environment variable instead.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/tarfile.html#module-tarfile" title="tarfile: Read and write tar-format archive files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tarfile</span></code></a>:</p>
<ul>
<li><p>The undocumented and unused <code class="xref py py-attr docutils literal notranslate"><span class="pre">TarFile.tarfile</span></code> attribute
has been deprecated since Python 3.13.</p></li>
</ul>
</li>
</ul>
</section>
<section id="pending-removal-in-future-versions">
<h3>Pending Removal in Future Versions<a class="headerlink" href="#pending-removal-in-future-versions" title="Link to this heading"></a></h3>
<p>The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.</p>
<ul class="simple">
<li><p><a class="reference internal" href="../library/argparse.html#module-argparse" title="argparse: Command-line option and argument parsing library."><code class="xref py py-mod docutils literal notranslate"><span class="pre">argparse</span></code></a>: Nesting argument groups and nesting mutually exclusive
groups are deprecated.</p></li>
<li><p><a class="reference internal" href="../library/array.html#module-array" title="array: Space efficient arrays of uniformly typed numeric values."><code class="xref py py-mod docutils literal notranslate"><span class="pre">array</span></code></a>s <code class="docutils literal notranslate"><span class="pre">'u'</span></code> format code (<a class="reference external" href="https://github.com/python/cpython/issues/57281">gh-57281</a>)</p></li>
<li><p><a class="reference internal" href="../library/builtins.html#module-builtins" title="builtins: The module that provides the built-in namespace."><code class="xref py py-mod docutils literal notranslate"><span class="pre">builtins</span></code></a>:</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">bool(NotImplemented)</span></code>.</p></li>
<li><p>Generators: <code class="docutils literal notranslate"><span class="pre">throw(type,</span> <span class="pre">exc,</span> <span class="pre">tb)</span></code> and <code class="docutils literal notranslate"><span class="pre">athrow(type,</span> <span class="pre">exc,</span> <span class="pre">tb)</span></code>
signature is deprecated: use <code class="docutils literal notranslate"><span class="pre">throw(exc)</span></code> and <code class="docutils literal notranslate"><span class="pre">athrow(exc)</span></code> instead,
the single argument signature.</p></li>
<li><p>Currently Python accepts numeric literals immediately followed by keywords,
for example <code class="docutils literal notranslate"><span class="pre">0in</span> <span class="pre">x</span></code>, <code class="docutils literal notranslate"><span class="pre">1or</span> <span class="pre">x</span></code>, <code class="docutils literal notranslate"><span class="pre">0if</span> <span class="pre">1else</span> <span class="pre">2</span></code>. It allows confusing and
ambiguous expressions like <code class="docutils literal notranslate"><span class="pre">[0x1for</span> <span class="pre">x</span> <span class="pre">in</span> <span class="pre">y]</span></code> (which can be interpreted as
<code class="docutils literal notranslate"><span class="pre">[0x1</span> <span class="pre">for</span> <span class="pre">x</span> <span class="pre">in</span> <span class="pre">y]</span></code> or <code class="docutils literal notranslate"><span class="pre">[0x1f</span> <span class="pre">or</span> <span class="pre">x</span> <span class="pre">in</span> <span class="pre">y]</span></code>). A syntax warning is raised
if the numeric literal is immediately followed by one of keywords
<a class="reference internal" href="../reference/expressions.html#and"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">and</span></code></a>, <a class="reference internal" href="../reference/compound_stmts.html#else"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">else</span></code></a>, <a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a>, <a class="reference internal" href="../reference/compound_stmts.html#if"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code></a>,
<a class="reference internal" href="../reference/expressions.html#in"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">in</span></code></a>, <a class="reference internal" href="../reference/expressions.html#is"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">is</span></code></a> and <a class="reference internal" href="../reference/expressions.html#or"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">or</span></code></a>. In a future release it
will be changed to a syntax error. (<a class="reference external" href="https://github.com/python/cpython/issues/87999">gh-87999</a>)</p></li>
<li><p>Support for <code class="docutils literal notranslate"><span class="pre">__index__()</span></code> and <code class="docutils literal notranslate"><span class="pre">__int__()</span></code> method returning non-int type:
these methods will be required to return an instance of a strict subclass of
<a class="reference internal" href="../library/functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a>.</p></li>
<li><p>Support for <code class="docutils literal notranslate"><span class="pre">__float__()</span></code> method returning a strict subclass of
<a class="reference internal" href="../library/functions.html#float" title="float"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>: these methods will be required to return an instance of
<a class="reference internal" href="../library/functions.html#float" title="float"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>.</p></li>
<li><p>Support for <code class="docutils literal notranslate"><span class="pre">__complex__()</span></code> method returning a strict subclass of
<a class="reference internal" href="../library/functions.html#complex" title="complex"><code class="xref py py-class docutils literal notranslate"><span class="pre">complex</span></code></a>: these methods will be required to return an instance of
<a class="reference internal" href="../library/functions.html#complex" title="complex"><code class="xref py py-class docutils literal notranslate"><span class="pre">complex</span></code></a>.</p></li>
<li><p>Delegation of <code class="docutils literal notranslate"><span class="pre">int()</span></code> to <code class="docutils literal notranslate"><span class="pre">__trunc__()</span></code> method.</p></li>
<li><p>Passing a complex number as the <em>real</em> or <em>imag</em> argument in the
<a class="reference internal" href="../library/functions.html#complex" title="complex"><code class="xref py py-func docutils literal notranslate"><span class="pre">complex()</span></code></a> constructor is now deprecated; it should only be passed
as a single positional argument.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/109218">gh-109218</a>.)</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/calendar.html#module-calendar" title="calendar: Functions for working with calendars, including some emulation of the Unix cal program."><code class="xref py py-mod docutils literal notranslate"><span class="pre">calendar</span></code></a>: <code class="docutils literal notranslate"><span class="pre">calendar.January</span></code> and <code class="docutils literal notranslate"><span class="pre">calendar.February</span></code> constants are
deprecated and replaced by <a class="reference internal" href="../library/calendar.html#calendar.JANUARY" title="calendar.JANUARY"><code class="xref py py-data docutils literal notranslate"><span class="pre">calendar.JANUARY</span></code></a> and
<a class="reference internal" href="../library/calendar.html#calendar.FEBRUARY" title="calendar.FEBRUARY"><code class="xref py py-data docutils literal notranslate"><span class="pre">calendar.FEBRUARY</span></code></a>.
(Contributed by Prince Roshan in <a class="reference external" href="https://github.com/python/cpython/issues/103636">gh-103636</a>.)</p></li>
<li><p><a class="reference internal" href="../reference/datamodel.html#codeobject.co_lnotab" title="codeobject.co_lnotab"><code class="xref py py-attr docutils literal notranslate"><span class="pre">codeobject.co_lnotab</span></code></a>: use the <a class="reference internal" href="../reference/datamodel.html#codeobject.co_lines" title="codeobject.co_lines"><code class="xref py py-meth docutils literal notranslate"><span class="pre">codeobject.co_lines()</span></code></a> method
instead.</p></li>
<li><p><a class="reference internal" href="../library/datetime.html#module-datetime" title="datetime: Basic date and time types."><code class="xref py py-mod docutils literal notranslate"><span class="pre">datetime</span></code></a>:</p>
<ul>
<li><p><a class="reference internal" href="../library/datetime.html#datetime.datetime.utcnow" title="datetime.datetime.utcnow"><code class="xref py py-meth docutils literal notranslate"><span class="pre">utcnow()</span></code></a>:
use <code class="docutils literal notranslate"><span class="pre">datetime.datetime.now(tz=datetime.UTC)</span></code>.</p></li>
<li><p><a class="reference internal" href="../library/datetime.html#datetime.datetime.utcfromtimestamp" title="datetime.datetime.utcfromtimestamp"><code class="xref py py-meth docutils literal notranslate"><span class="pre">utcfromtimestamp()</span></code></a>:
use <code class="docutils literal notranslate"><span class="pre">datetime.datetime.fromtimestamp(timestamp,</span> <span class="pre">tz=datetime.UTC)</span></code>.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/gettext.html#module-gettext" title="gettext: Multilingual internationalization services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">gettext</span></code></a>: Plural value must be an integer.</p></li>
<li><p><a class="reference internal" href="../library/importlib.html#module-importlib" title="importlib: The implementation of the import machinery."><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib</span></code></a>:</p>
<ul>
<li><p><a class="reference internal" href="../library/importlib.html#importlib.util.cache_from_source" title="importlib.util.cache_from_source"><code class="xref py py-func docutils literal notranslate"><span class="pre">cache_from_source()</span></code></a> <em>debug_override</em> parameter is
deprecated: use the <em>optimization</em> parameter instead.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/importlib.metadata.html#module-importlib.metadata" title="importlib.metadata: Accessing package metadata"><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib.metadata</span></code></a>:</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">EntryPoints</span></code> tuple interface.</p></li>
<li><p>Implicit <code class="docutils literal notranslate"><span class="pre">None</span></code> on return values.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/logging.html#module-logging" title="logging: Flexible event logging system for applications."><code class="xref py py-mod docutils literal notranslate"><span class="pre">logging</span></code></a>: the <code class="docutils literal notranslate"><span class="pre">warn()</span></code> method has been deprecated
since Python 3.3, use <a class="reference internal" href="../library/logging.html#logging.warning" title="logging.warning"><code class="xref py py-meth docutils literal notranslate"><span class="pre">warning()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../library/mailbox.html#module-mailbox" title="mailbox: Manipulate mailboxes in various formats"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mailbox</span></code></a>: Use of StringIO input and text mode is deprecated, use
BytesIO and binary mode instead.</p></li>
<li><p><a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a>: Calling <a class="reference internal" href="../library/os.html#os.register_at_fork" title="os.register_at_fork"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.register_at_fork()</span></code></a> in multi-threaded process.</p></li>
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">pydoc.ErrorDuringImport</span></code>: A tuple value for <em>exc_info</em> parameter is
deprecated, use an exception instance.</p></li>
<li><p><a class="reference internal" href="../library/re.html#module-re" title="re: Regular expression operations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">re</span></code></a>: 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 <a class="reference external" href="https://github.com/python/cpython/issues/91760">gh-91760</a>.)</p></li>
<li><p><code class="xref py py-mod docutils literal notranslate"><span class="pre">sre_compile</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">sre_constants</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">sre_parse</span></code> modules.</p></li>
<li><p><a class="reference internal" href="../library/shutil.html#module-shutil" title="shutil: High-level file operations, including copying."><code class="xref py py-mod docutils literal notranslate"><span class="pre">shutil</span></code></a>: <a class="reference internal" href="../library/shutil.html#shutil.rmtree" title="shutil.rmtree"><code class="xref py py-func docutils literal notranslate"><span class="pre">rmtree()</span></code></a>s <em>onerror</em> parameter is deprecated in
Python 3.12; use the <em>onexc</em> parameter instead.</p></li>
<li><p><a class="reference internal" href="../library/ssl.html#module-ssl" title="ssl: TLS/SSL wrapper for socket objects"><code class="xref py py-mod docutils literal notranslate"><span class="pre">ssl</span></code></a> options and protocols:</p>
<ul>
<li><p><a class="reference internal" href="../library/ssl.html#ssl.SSLContext" title="ssl.SSLContext"><code class="xref py py-class docutils literal notranslate"><span class="pre">ssl.SSLContext</span></code></a> without protocol argument is deprecated.</p></li>
<li><p><a class="reference internal" href="../library/ssl.html#ssl.SSLContext" title="ssl.SSLContext"><code class="xref py py-class docutils literal notranslate"><span class="pre">ssl.SSLContext</span></code></a>: <a class="reference internal" href="../library/ssl.html#ssl.SSLContext.set_npn_protocols" title="ssl.SSLContext.set_npn_protocols"><code class="xref py py-meth docutils literal notranslate"><span class="pre">set_npn_protocols()</span></code></a> and
<code class="xref py py-meth docutils literal notranslate"><span class="pre">selected_npn_protocol()</span></code> are deprecated: use ALPN
instead.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.OP_NO_SSL*</span></code> options</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.OP_NO_TLS*</span></code> options</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.PROTOCOL_SSLv3</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.PROTOCOL_TLS</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.PROTOCOL_TLSv1</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.PROTOCOL_TLSv1_1</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.PROTOCOL_TLSv1_2</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.TLSVersion.SSLv3</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.TLSVersion.TLSv1</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssl.TLSVersion.TLSv1_1</span></code></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/threading.html#module-threading" title="threading: Thread-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code></a> methods:</p>
<ul>
<li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.Condition.notifyAll()</span></code>: use <a class="reference internal" href="../library/threading.html#threading.Condition.notify_all" title="threading.Condition.notify_all"><code class="xref py py-meth docutils literal notranslate"><span class="pre">notify_all()</span></code></a>.</p></li>
<li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.Event.isSet()</span></code>: use <a class="reference internal" href="../library/threading.html#threading.Event.is_set" title="threading.Event.is_set"><code class="xref py py-meth docutils literal notranslate"><span class="pre">is_set()</span></code></a>.</p></li>
<li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.Thread.isDaemon()</span></code>, <a class="reference internal" href="../library/threading.html#threading.Thread.setDaemon" title="threading.Thread.setDaemon"><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.Thread.setDaemon()</span></code></a>:
use <a class="reference internal" href="../library/threading.html#threading.Thread.daemon" title="threading.Thread.daemon"><code class="xref py py-attr docutils literal notranslate"><span class="pre">threading.Thread.daemon</span></code></a> attribute.</p></li>
<li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.Thread.getName()</span></code>, <a class="reference internal" href="../library/threading.html#threading.Thread.setName" title="threading.Thread.setName"><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.Thread.setName()</span></code></a>:
use <a class="reference internal" href="../library/threading.html#threading.Thread.name" title="threading.Thread.name"><code class="xref py py-attr docutils literal notranslate"><span class="pre">threading.Thread.name</span></code></a> attribute.</p></li>
<li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.currentThread()</span></code>: use <a class="reference internal" href="../library/threading.html#threading.current_thread" title="threading.current_thread"><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.current_thread()</span></code></a>.</p></li>
<li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.activeCount()</span></code>: use <a class="reference internal" href="../library/threading.html#threading.active_count" title="threading.active_count"><code class="xref py py-meth docutils literal notranslate"><span class="pre">threading.active_count()</span></code></a>.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/typing.html#typing.Text" title="typing.Text"><code class="xref py py-class docutils literal notranslate"><span class="pre">typing.Text</span></code></a> (<a class="reference external" href="https://github.com/python/cpython/issues/92332">gh-92332</a>).</p></li>
<li><p><a class="reference internal" href="../library/unittest.html#unittest.IsolatedAsyncioTestCase" title="unittest.IsolatedAsyncioTestCase"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.IsolatedAsyncioTestCase</span></code></a>: it is deprecated to return a value
that is not <code class="docutils literal notranslate"><span class="pre">None</span></code> from a test case.</p></li>
<li><p><a class="reference internal" href="../library/urllib.parse.html#module-urllib.parse" title="urllib.parse: Parse URLs into or assemble them from components."><code class="xref py py-mod docutils literal notranslate"><span class="pre">urllib.parse</span></code></a> deprecated functions: <a class="reference internal" href="../library/urllib.parse.html#urllib.parse.urlparse" title="urllib.parse.urlparse"><code class="xref py py-func docutils literal notranslate"><span class="pre">urlparse()</span></code></a> instead</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">splitattr()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splithost()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splitnport()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splitpasswd()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splitport()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splitquery()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splittag()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splittype()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splituser()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">splitvalue()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">to_bytes()</span></code></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../library/urllib.request.html#module-urllib.request" title="urllib.request: Extensible library for opening URLs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">urllib.request</span></code></a>: <a class="reference internal" href="../library/urllib.request.html#urllib.request.URLopener" title="urllib.request.URLopener"><code class="xref py py-class docutils literal notranslate"><span class="pre">URLopener</span></code></a> and
<a class="reference internal" href="../library/urllib.request.html#urllib.request.FancyURLopener" title="urllib.request.FancyURLopener"><code class="xref py py-class docutils literal notranslate"><span class="pre">FancyURLopener</span></code></a> style of invoking requests is
deprecated. Use newer <a class="reference internal" href="../library/urllib.request.html#urllib.request.urlopen" title="urllib.request.urlopen"><code class="xref py py-func docutils literal notranslate"><span class="pre">urlopen()</span></code></a> functions and methods.</p></li>
<li><p><a class="reference internal" href="../library/wsgiref.html#module-wsgiref" title="wsgiref: WSGI Utilities and Reference Implementation."><code class="xref py py-mod docutils literal notranslate"><span class="pre">wsgiref</span></code></a>: <code class="docutils literal notranslate"><span class="pre">SimpleHandler.stdout.write()</span></code> should not do partial
writes.</p></li>
<li><p><a class="reference internal" href="../library/xml.etree.elementtree.html#module-xml.etree.ElementTree" title="xml.etree.ElementTree: Implementation of the ElementTree API."><code class="xref py py-mod docutils literal notranslate"><span class="pre">xml.etree.ElementTree</span></code></a>: Testing the truth value of an
<a class="reference internal" href="../library/xml.etree.elementtree.html#xml.etree.ElementTree.Element" title="xml.etree.ElementTree.Element"><code class="xref py py-class docutils literal notranslate"><span class="pre">Element</span></code></a> is deprecated. In a future release it
will always return <code class="docutils literal notranslate"><span class="pre">True</span></code>. Prefer explicit <code class="docutils literal notranslate"><span class="pre">len(elem)</span></code> or
<code class="docutils literal notranslate"><span class="pre">elem</span> <span class="pre">is</span> <span class="pre">not</span> <span class="pre">None</span></code> tests instead.</p></li>
<li><p><a class="reference internal" href="../library/zipimport.html#zipimport.zipimporter.load_module" title="zipimport.zipimporter.load_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">zipimport.zipimporter.load_module()</span></code></a> is deprecated:
use <a class="reference internal" href="../library/zipimport.html#zipimport.zipimporter.exec_module" title="zipimport.zipimporter.exec_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">exec_module()</span></code></a> instead.</p></li>
</ul>
</section>
</section>
<section id="removed">
<span id="whatsnew312-removed"></span><h2>Removed<a class="headerlink" href="#removed" title="Link to this heading"></a></h2>
<section id="asynchat-and-asyncore">
<h3>asynchat and asyncore<a class="headerlink" href="#asynchat-and-asyncore" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>These two modules have been removed
according to the schedule in <span class="target" id="index-35"></span><a class="pep reference external" href="https://peps.python.org/pep-0594/"><strong>PEP 594</strong></a>,
having been deprecated in Python 3.6.
Use <a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a> instead.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/96580">gh-96580</a>.)</p></li>
</ul>
</section>
<section id="configparser">
<h3>configparser<a class="headerlink" href="#configparser" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Several names deprecated in the <a class="reference internal" href="../library/configparser.html#module-configparser" title="configparser: Configuration file parser."><code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code></a> way back in 3.2 have
been removed per <a class="reference external" href="https://github.com/python/cpython/issues/89336">gh-89336</a>:</p>
<ul>
<li><p><a class="reference internal" href="../library/configparser.html#configparser.ParsingError" title="configparser.ParsingError"><code class="xref py py-class docutils literal notranslate"><span class="pre">configparser.ParsingError</span></code></a> no longer has a <code class="docutils literal notranslate"><span class="pre">filename</span></code> attribute
or argument. Use the <code class="docutils literal notranslate"><span class="pre">source</span></code> attribute and argument instead.</p></li>
<li><p><a class="reference internal" href="../library/configparser.html#module-configparser" title="configparser: Configuration file parser."><code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code></a> no longer has a <code class="docutils literal notranslate"><span class="pre">SafeConfigParser</span></code> class. Use the
shorter <a class="reference internal" href="../library/configparser.html#configparser.ConfigParser" title="configparser.ConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConfigParser</span></code></a> name instead.</p></li>
<li><p><a class="reference internal" href="../library/configparser.html#configparser.ConfigParser" title="configparser.ConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">configparser.ConfigParser</span></code></a> no longer has a <code class="docutils literal notranslate"><span class="pre">readfp</span></code> method.
Use <a class="reference internal" href="../library/configparser.html#configparser.ConfigParser.read_file" title="configparser.ConfigParser.read_file"><code class="xref py py-meth docutils literal notranslate"><span class="pre">read_file()</span></code></a> instead.</p></li>
</ul>
</li>
</ul>
</section>
<section id="distutils">
<span id="whatsnew312-removed-distutils"></span><h3>distutils<a class="headerlink" href="#distutils" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove the <code class="xref py py-mod docutils literal notranslate"><span class="pre">distutils</span></code> package. It was deprecated in Python 3.10 by
<span class="target" id="index-36"></span><a class="pep reference external" href="https://peps.python.org/pep-0632/"><strong>PEP 632</strong></a> “Deprecate distutils module”. For projects still using
<code class="docutils literal notranslate"><span class="pre">distutils</span></code> and cannot be updated to something else, the <code class="docutils literal notranslate"><span class="pre">setuptools</span></code>
project can be installed: it still provides <code class="docutils literal notranslate"><span class="pre">distutils</span></code>.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/92584">gh-92584</a>.)</p></li>
</ul>
</section>
<section id="ensurepip">
<h3>ensurepip<a class="headerlink" href="#ensurepip" title="Link to this heading"></a></h3>
<ul>
<li><p>Remove the bundled setuptools wheel from <a class="reference internal" href="../library/ensurepip.html#module-ensurepip" title="ensurepip: Bootstrapping the &quot;pip&quot; installer into an existing Python installation or virtual environment."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ensurepip</span></code></a>,
and stop installing setuptools in environments created by <a class="reference internal" href="../library/venv.html#module-venv" title="venv: Creation of virtual environments."><code class="xref py py-mod docutils literal notranslate"><span class="pre">venv</span></code></a>.</p>
<p><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">(&gt;=</span> <span class="pre">22.1)</span></code> does not require setuptools to be installed in the
environment. <code class="docutils literal notranslate"><span class="pre">setuptools</span></code>-based (and <code class="docutils literal notranslate"><span class="pre">distutils</span></code>-based) packages
can still be used with <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code>, since pip will provide
<code class="docutils literal notranslate"><span class="pre">setuptools</span></code> in the build environment it uses for building a
package.</p>
<p><code class="docutils literal notranslate"><span class="pre">easy_install</span></code>, <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code>, <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> and <code class="docutils literal notranslate"><span class="pre">distutils</span></code>
are no longer provided by default in environments created with
<code class="docutils literal notranslate"><span class="pre">venv</span></code> or bootstrapped with <code class="docutils literal notranslate"><span class="pre">ensurepip</span></code>, since they are part of
the <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> package. For projects relying on these at runtime,
the <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> project should be declared as a dependency and
installed separately (typically, using pip).</p>
<p>(Contributed by Pradyun Gedam in <a class="reference external" href="https://github.com/python/cpython/issues/95299">gh-95299</a>.)</p>
</li>
</ul>
</section>
<section id="enum">
<h3>enum<a class="headerlink" href="#enum" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove <a class="reference internal" href="../library/enum.html#module-enum" title="enum: Implementation of an enumeration class."><code class="xref py py-mod docutils literal notranslate"><span class="pre">enum</span></code></a>s <code class="docutils literal notranslate"><span class="pre">EnumMeta.__getattr__</span></code>, which is no longer needed for
enum attribute access.
(Contributed by Ethan Furman in <a class="reference external" href="https://github.com/python/cpython/issues/95083">gh-95083</a>.)</p></li>
</ul>
</section>
<section id="ftplib">
<h3>ftplib<a class="headerlink" href="#ftplib" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove <a class="reference internal" href="../library/ftplib.html#module-ftplib" title="ftplib: FTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ftplib</span></code></a>s <code class="docutils literal notranslate"><span class="pre">FTP_TLS.ssl_version</span></code> class attribute: use the
<em>context</em> parameter instead.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94172">gh-94172</a>.)</p></li>
</ul>
</section>
<section id="gzip">
<h3>gzip<a class="headerlink" href="#gzip" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove the <code class="docutils literal notranslate"><span class="pre">filename</span></code> attribute of <a class="reference internal" href="../library/gzip.html#module-gzip" title="gzip: Interfaces for gzip compression and decompression using file objects."><code class="xref py py-mod docutils literal notranslate"><span class="pre">gzip</span></code></a>s <a class="reference internal" href="../library/gzip.html#gzip.GzipFile" title="gzip.GzipFile"><code class="xref py py-class docutils literal notranslate"><span class="pre">gzip.GzipFile</span></code></a>,
deprecated since Python 2.6, use the <a class="reference internal" href="../library/gzip.html#gzip.GzipFile.name" title="gzip.GzipFile.name"><code class="xref py py-attr docutils literal notranslate"><span class="pre">name</span></code></a> attribute
instead. In write mode, the <code class="docutils literal notranslate"><span class="pre">filename</span></code> attribute added <code class="docutils literal notranslate"><span class="pre">'.gz'</span></code> file
extension if it was not present.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94196">gh-94196</a>.)</p></li>
</ul>
</section>
<section id="hashlib">
<h3>hashlib<a class="headerlink" href="#hashlib" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove the pure Python implementation of <a class="reference internal" href="../library/hashlib.html#module-hashlib" title="hashlib: Secure hash and message digest algorithms."><code class="xref py py-mod docutils literal notranslate"><span class="pre">hashlib</span></code></a>s
<a class="reference internal" href="../library/hashlib.html#hashlib.pbkdf2_hmac" title="hashlib.pbkdf2_hmac"><code class="xref py py-func docutils literal notranslate"><span class="pre">hashlib.pbkdf2_hmac()</span></code></a>, deprecated in Python 3.10. Python 3.10 and
newer requires OpenSSL 1.1.1 (<span class="target" id="index-37"></span><a class="pep reference external" href="https://peps.python.org/pep-0644/"><strong>PEP 644</strong></a>): this OpenSSL version provides
a C implementation of <a class="reference internal" href="../library/hashlib.html#hashlib.pbkdf2_hmac" title="hashlib.pbkdf2_hmac"><code class="xref py py-func docutils literal notranslate"><span class="pre">pbkdf2_hmac()</span></code></a> which is faster.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94199">gh-94199</a>.)</p></li>
</ul>
</section>
<section id="importlib">
<h3>importlib<a class="headerlink" href="#importlib" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Many previously deprecated cleanups in <a class="reference internal" href="../library/importlib.html#module-importlib" title="importlib: The implementation of the import machinery."><code class="xref py py-mod docutils literal notranslate"><span class="pre">importlib</span></code></a> have now been
completed:</p>
<ul>
<li><p>References to, and support for <code class="xref py py-meth docutils literal notranslate"><span class="pre">module_repr()</span></code> has been removed.
(Contributed by Barry Warsaw in <a class="reference external" href="https://github.com/python/cpython/issues/97850">gh-97850</a>.)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">importlib.util.set_package</span></code>, <code class="docutils literal notranslate"><span class="pre">importlib.util.set_loader</span></code> and
<code class="docutils literal notranslate"><span class="pre">importlib.util.module_for_loader</span></code> have all been removed. (Contributed by
Brett Cannon and Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/65961">gh-65961</a> and <a class="reference external" href="https://github.com/python/cpython/issues/97850">gh-97850</a>.)</p></li>
<li><p>Support for <code class="docutils literal notranslate"><span class="pre">find_loader()</span></code> and <code class="docutils literal notranslate"><span class="pre">find_module()</span></code> APIs have been
removed. (Contributed by Barry Warsaw in <a class="reference external" href="https://github.com/python/cpython/issues/98040">gh-98040</a>.)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">importlib.abc.Finder</span></code>, <code class="docutils literal notranslate"><span class="pre">pkgutil.ImpImporter</span></code>, and <code class="docutils literal notranslate"><span class="pre">pkgutil.ImpLoader</span></code>
have been removed. (Contributed by Barry Warsaw in <a class="reference external" href="https://github.com/python/cpython/issues/98040">gh-98040</a>.)</p></li>
</ul>
</li>
</ul>
</section>
<section id="imp">
<span id="whatsnew312-removed-imp"></span><h3>imp<a class="headerlink" href="#imp" title="Link to this heading"></a></h3>
<ul>
<li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">imp</span></code> module has been removed. (Contributed by Barry Warsaw in
<a class="reference external" href="https://github.com/python/cpython/issues/98040">gh-98040</a>.)</p>
<p>To migrate, consult the following correspondence table:</p>
<blockquote>
<div><table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>imp</p></th>
<th class="head"><p>importlib</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">imp.NullImporter</span></code></p></td>
<td><p>Insert <code class="docutils literal notranslate"><span class="pre">None</span></code> into <code class="docutils literal notranslate"><span class="pre">sys.path_importer_cache</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">imp.cache_from_source()</span></code></p></td>
<td><p><a class="reference internal" href="../library/importlib.html#importlib.util.cache_from_source" title="importlib.util.cache_from_source"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.util.cache_from_source()</span></code></a></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">imp.find_module()</span></code></p></td>
<td><p><a class="reference internal" href="../library/importlib.html#importlib.util.find_spec" title="importlib.util.find_spec"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.util.find_spec()</span></code></a></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">imp.get_magic()</span></code></p></td>
<td><p><a class="reference internal" href="../library/importlib.html#importlib.util.MAGIC_NUMBER" title="importlib.util.MAGIC_NUMBER"><code class="xref py py-const docutils literal notranslate"><span class="pre">importlib.util.MAGIC_NUMBER</span></code></a></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">imp.get_suffixes()</span></code></p></td>
<td><p><a class="reference internal" href="../library/importlib.html#importlib.machinery.SOURCE_SUFFIXES" title="importlib.machinery.SOURCE_SUFFIXES"><code class="xref py py-const docutils literal notranslate"><span class="pre">importlib.machinery.SOURCE_SUFFIXES</span></code></a>, <a class="reference internal" href="../library/importlib.html#importlib.machinery.EXTENSION_SUFFIXES" title="importlib.machinery.EXTENSION_SUFFIXES"><code class="xref py py-const docutils literal notranslate"><span class="pre">importlib.machinery.EXTENSION_SUFFIXES</span></code></a>, and <a class="reference internal" href="../library/importlib.html#importlib.machinery.BYTECODE_SUFFIXES" title="importlib.machinery.BYTECODE_SUFFIXES"><code class="xref py py-const docutils literal notranslate"><span class="pre">importlib.machinery.BYTECODE_SUFFIXES</span></code></a></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">imp.get_tag()</span></code></p></td>
<td><p><a class="reference internal" href="../library/sys.html#sys.implementation" title="sys.implementation"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.implementation.cache_tag</span></code></a></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">imp.load_module()</span></code></p></td>
<td><p><a class="reference internal" href="../library/importlib.html#importlib.import_module" title="importlib.import_module"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.import_module()</span></code></a></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">imp.new_module(name)</span></code></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">types.ModuleType(name)</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">imp.reload()</span></code></p></td>
<td><p><a class="reference internal" href="../library/importlib.html#importlib.reload" title="importlib.reload"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.reload()</span></code></a></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">imp.source_from_cache()</span></code></p></td>
<td><p><a class="reference internal" href="../library/importlib.html#importlib.util.source_from_cache" title="importlib.util.source_from_cache"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.util.source_from_cache()</span></code></a></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">imp.load_source()</span></code></p></td>
<td><p><em>See below</em></p></td>
</tr>
</tbody>
</table>
</div></blockquote>
<p>Replace <code class="docutils literal notranslate"><span class="pre">imp.load_source()</span></code> with:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">importlib.util</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">importlib.machinery</span>
<span class="k">def</span><span class="w"> </span><span class="nf">load_source</span><span class="p">(</span><span class="n">modname</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
<span class="n">loader</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">machinery</span><span class="o">.</span><span class="n">SourceFileLoader</span><span class="p">(</span><span class="n">modname</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
<span class="n">spec</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">spec_from_file_location</span><span class="p">(</span><span class="n">modname</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">loader</span><span class="o">=</span><span class="n">loader</span><span class="p">)</span>
<span class="n">module</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">module_from_spec</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
<span class="c1"># The module is always executed and not cached in sys.modules.</span>
<span class="c1"># Uncomment the following line to cache the module.</span>
<span class="c1"># sys.modules[module.__name__] = module</span>
<span class="n">loader</span><span class="o">.</span><span class="n">exec_module</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
<span class="k">return</span> <span class="n">module</span>
</pre></div>
</div>
</li>
<li><p>Remove <code class="xref py py-mod docutils literal notranslate"><span class="pre">imp</span></code> functions and attributes with no replacements:</p>
<ul class="simple">
<li><p>Undocumented functions:</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">imp.init_builtin()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">imp.load_compiled()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">imp.load_dynamic()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">imp.load_package()</span></code></p></li>
</ul>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">imp.lock_held()</span></code>, <code class="docutils literal notranslate"><span class="pre">imp.acquire_lock()</span></code>, <code class="docutils literal notranslate"><span class="pre">imp.release_lock()</span></code>:
the locking scheme has changed in Python 3.3 to per-module locks.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">imp.find_module()</span></code> constants: <code class="docutils literal notranslate"><span class="pre">SEARCH_ERROR</span></code>, <code class="docutils literal notranslate"><span class="pre">PY_SOURCE</span></code>,
<code class="docutils literal notranslate"><span class="pre">PY_COMPILED</span></code>, <code class="docutils literal notranslate"><span class="pre">C_EXTENSION</span></code>, <code class="docutils literal notranslate"><span class="pre">PY_RESOURCE</span></code>, <code class="docutils literal notranslate"><span class="pre">PKG_DIRECTORY</span></code>,
<code class="docutils literal notranslate"><span class="pre">C_BUILTIN</span></code>, <code class="docutils literal notranslate"><span class="pre">PY_FROZEN</span></code>, <code class="docutils literal notranslate"><span class="pre">PY_CODERESOURCE</span></code>, <code class="docutils literal notranslate"><span class="pre">IMP_HOOK</span></code>.</p></li>
</ul>
</li>
</ul>
</section>
<section id="io">
<h3>io<a class="headerlink" href="#io" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove <a class="reference internal" href="../library/io.html#module-io" title="io: Core tools for working with streams."><code class="xref py py-mod docutils literal notranslate"><span class="pre">io</span></code></a>s <code class="docutils literal notranslate"><span class="pre">io.OpenWrapper</span></code> and <code class="docutils literal notranslate"><span class="pre">_pyio.OpenWrapper</span></code>, deprecated in Python
3.10: just use <a class="reference internal" href="../library/functions.html#open" title="open"><code class="xref py py-func docutils literal notranslate"><span class="pre">open()</span></code></a> instead. The <a class="reference internal" href="../library/functions.html#open" title="open"><code class="xref py py-func docutils literal notranslate"><span class="pre">open()</span></code></a> (<a class="reference internal" href="../library/io.html#io.open" title="io.open"><code class="xref py py-func docutils literal notranslate"><span class="pre">io.open()</span></code></a>)
function is a built-in function. Since Python 3.10, <code class="xref py py-func docutils literal notranslate"><span class="pre">_pyio.open()</span></code> is
also a static method.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94169">gh-94169</a>.)</p></li>
</ul>
</section>
<section id="locale">
<h3>locale<a class="headerlink" href="#locale" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove <a class="reference internal" href="../library/locale.html#module-locale" title="locale: Internationalization services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">locale</span></code></a>s <code class="xref py py-func docutils literal notranslate"><span class="pre">locale.format()</span></code> function, deprecated in Python 3.7:
use <a class="reference internal" href="../library/locale.html#locale.format_string" title="locale.format_string"><code class="xref py py-func docutils literal notranslate"><span class="pre">locale.format_string()</span></code></a> instead.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94226">gh-94226</a>.)</p></li>
</ul>
</section>
<section id="smtpd">
<h3>smtpd<a class="headerlink" href="#smtpd" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>The <code class="docutils literal notranslate"><span class="pre">smtpd</span></code> module has been removed according to the schedule in <span class="target" id="index-38"></span><a class="pep reference external" href="https://peps.python.org/pep-0594/"><strong>PEP 594</strong></a>,
having been deprecated in Python 3.4.7 and 3.5.4.
Use the <a class="extlink-pypi reference external" href="https://pypi.org/project/aiosmtpd/">aiosmtpd</a> PyPI module or any other
<a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a>-based server instead.
(Contributed by Oleg Iarygin in <a class="reference external" href="https://github.com/python/cpython/issues/93243">gh-93243</a>.)</p></li>
</ul>
</section>
<section id="id2">
<h3>sqlite3<a class="headerlink" href="#id2" title="Link to this heading"></a></h3>
<ul>
<li><p>The following undocumented <a class="reference internal" href="../library/sqlite3.html#module-sqlite3" title="sqlite3: A DB-API 2.0 implementation using SQLite 3.x."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sqlite3</span></code></a> features, deprecated in Python
3.10, are now removed:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">sqlite3.enable_shared_cache()</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">sqlite3.OptimizedUnicode</span></code></p></li>
</ul>
<p>If a shared cache must be used, open the database in URI mode using the
<code class="docutils literal notranslate"><span class="pre">cache=shared</span></code> query parameter.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">sqlite3.OptimizedUnicode</span></code> text factory has been an alias for
<a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a> since Python 3.3. Code that previously set the text factory to
<code class="docutils literal notranslate"><span class="pre">OptimizedUnicode</span></code> can either use <code class="docutils literal notranslate"><span class="pre">str</span></code> explicitly, or rely on the
default value which is also <code class="docutils literal notranslate"><span class="pre">str</span></code>.</p>
<p>(Contributed by Erlend E. Aasland in <a class="reference external" href="https://github.com/python/cpython/issues/92548">gh-92548</a>.)</p>
</li>
</ul>
</section>
<section id="ssl">
<h3>ssl<a class="headerlink" href="#ssl" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove <a class="reference internal" href="../library/ssl.html#module-ssl" title="ssl: TLS/SSL wrapper for socket objects"><code class="xref py py-mod docutils literal notranslate"><span class="pre">ssl</span></code></a>s <code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.RAND_pseudo_bytes()</span></code> function, deprecated in Python 3.6:
use <a class="reference internal" href="../library/os.html#os.urandom" title="os.urandom"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.urandom()</span></code></a> or <a class="reference internal" href="../library/ssl.html#ssl.RAND_bytes" title="ssl.RAND_bytes"><code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.RAND_bytes()</span></code></a> instead.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94199">gh-94199</a>.)</p></li>
<li><p>Remove the <code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.match_hostname()</span></code> function.
It was deprecated in Python 3.7. OpenSSL performs
hostname matching since Python 3.7, Python no longer uses the
<code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.match_hostname()</span></code> function.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94199">gh-94199</a>.)</p></li>
<li><p>Remove the <code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.wrap_socket()</span></code> function, deprecated in Python 3.7:
instead, create a <a class="reference internal" href="../library/ssl.html#ssl.SSLContext" title="ssl.SSLContext"><code class="xref py py-class docutils literal notranslate"><span class="pre">ssl.SSLContext</span></code></a> object and call its
<a class="reference internal" href="../library/ssl.html#ssl.SSLContext.wrap_socket" title="ssl.SSLContext.wrap_socket"><code class="xref py py-class docutils literal notranslate"><span class="pre">ssl.SSLContext.wrap_socket</span></code></a> method. Any package that still uses
<code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.wrap_socket()</span></code> is broken and insecure. The function neither sends a
SNI TLS extension nor validates the server hostname. Code is subject to <span class="target" id="index-39"></span><a class="cwe reference external" href="https://cwe.mitre.org/data/definitions/295.html"><strong>CWE 295</strong></a>
(Improper Certificate Validation).
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94199">gh-94199</a>.)</p></li>
</ul>
</section>
<section id="id3">
<h3>unittest<a class="headerlink" href="#id3" title="Link to this heading"></a></h3>
<ul>
<li><p>Remove many long-deprecated <a class="reference internal" href="../library/unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> features:</p>
<ul id="unittest-testcase-removed-aliases">
<li><p>A number of <a class="reference internal" href="../library/unittest.html#unittest.TestCase" title="unittest.TestCase"><code class="xref py py-class docutils literal notranslate"><span class="pre">TestCase</span></code></a> method aliases:</p>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>Deprecated alias</p></th>
<th class="head"><p>Method Name</p></th>
<th class="head"><p>Deprecated in</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">failUnless</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertTrue" title="unittest.TestCase.assertTrue"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertTrue()</span></code></a></p></td>
<td><p>3.1</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">failIf</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertFalse" title="unittest.TestCase.assertFalse"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertFalse()</span></code></a></p></td>
<td><p>3.1</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">failUnlessEqual</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertEqual" title="unittest.TestCase.assertEqual"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertEqual()</span></code></a></p></td>
<td><p>3.1</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">failIfEqual</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertNotEqual" title="unittest.TestCase.assertNotEqual"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertNotEqual()</span></code></a></p></td>
<td><p>3.1</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">failUnlessAlmostEqual</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertAlmostEqual" title="unittest.TestCase.assertAlmostEqual"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertAlmostEqual()</span></code></a></p></td>
<td><p>3.1</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">failIfAlmostEqual</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertNotAlmostEqual" title="unittest.TestCase.assertNotAlmostEqual"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertNotAlmostEqual()</span></code></a></p></td>
<td><p>3.1</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">failUnlessRaises</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertRaises" title="unittest.TestCase.assertRaises"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertRaises()</span></code></a></p></td>
<td><p>3.1</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">assert_</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertTrue" title="unittest.TestCase.assertTrue"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertTrue()</span></code></a></p></td>
<td><p>3.2</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">assertEquals</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertEqual" title="unittest.TestCase.assertEqual"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertEqual()</span></code></a></p></td>
<td><p>3.2</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">assertNotEquals</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertNotEqual" title="unittest.TestCase.assertNotEqual"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertNotEqual()</span></code></a></p></td>
<td><p>3.2</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">assertAlmostEquals</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertAlmostEqual" title="unittest.TestCase.assertAlmostEqual"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertAlmostEqual()</span></code></a></p></td>
<td><p>3.2</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">assertNotAlmostEquals</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertNotAlmostEqual" title="unittest.TestCase.assertNotAlmostEqual"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertNotAlmostEqual()</span></code></a></p></td>
<td><p>3.2</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">assertRegexpMatches</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertRegex" title="unittest.TestCase.assertRegex"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertRegex()</span></code></a></p></td>
<td><p>3.2</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">assertRaisesRegexp</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertRaisesRegex" title="unittest.TestCase.assertRaisesRegex"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertRaisesRegex()</span></code></a></p></td>
<td><p>3.2</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">assertNotRegexpMatches</span></code></p></td>
<td><p><a class="reference internal" href="../library/unittest.html#unittest.TestCase.assertNotRegex" title="unittest.TestCase.assertNotRegex"><code class="xref py py-meth docutils literal notranslate"><span class="pre">assertNotRegex()</span></code></a></p></td>
<td><p>3.5</p></td>
</tr>
</tbody>
</table>
<p>You can use <a class="reference external" href="https://github.com/isidentical/teyit">https://github.com/isidentical/teyit</a> to automatically modernise
your unit tests.</p>
</li>
<li><p>Undocumented and broken <a class="reference internal" href="../library/unittest.html#unittest.TestCase" title="unittest.TestCase"><code class="xref py py-class docutils literal notranslate"><span class="pre">TestCase</span></code></a> method
<code class="docutils literal notranslate"><span class="pre">assertDictContainsSubset</span></code> (deprecated in Python 3.2).</p></li>
<li><p>Undocumented <a class="reference internal" href="../library/unittest.html#unittest.TestLoader.loadTestsFromModule" title="unittest.TestLoader.loadTestsFromModule"><code class="xref py py-meth docutils literal notranslate"><span class="pre">TestLoader.loadTestsFromModule</span></code></a> parameter <em>use_load_tests</em>
(deprecated and ignored since Python 3.5).</p></li>
<li><p>An alias of the <a class="reference internal" href="../library/unittest.html#unittest.TextTestResult" title="unittest.TextTestResult"><code class="xref py py-class docutils literal notranslate"><span class="pre">TextTestResult</span></code></a> class:
<code class="docutils literal notranslate"><span class="pre">_TextTestResult</span></code> (deprecated in Python 3.2).</p></li>
</ul>
<p>(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/89325">gh-89325</a>.)</p>
</li>
</ul>
</section>
<section id="webbrowser">
<h3>webbrowser<a class="headerlink" href="#webbrowser" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove support for obsolete browsers from <a class="reference internal" href="../library/webbrowser.html#module-webbrowser" title="webbrowser: Easy-to-use controller for web browsers."><code class="xref py py-mod docutils literal notranslate"><span class="pre">webbrowser</span></code></a>.
The removed browsers include: Grail, Mosaic, Netscape, Galeon, Skipstone,
Iceape, Firebird, and Firefox versions 35 and below (<a class="reference external" href="https://github.com/python/cpython/issues/102871">gh-102871</a>).</p></li>
</ul>
</section>
<section id="xml-etree-elementtree">
<h3>xml.etree.ElementTree<a class="headerlink" href="#xml-etree-elementtree" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove the <code class="docutils literal notranslate"><span class="pre">ElementTree.Element.copy()</span></code> method of the
pure Python implementation, deprecated in Python 3.10, use the
<a class="reference internal" href="../library/copy.html#copy.copy" title="copy.copy"><code class="xref py py-func docutils literal notranslate"><span class="pre">copy.copy()</span></code></a> function instead. The C implementation of <a class="reference internal" href="../library/xml.etree.elementtree.html#module-xml.etree.ElementTree" title="xml.etree.ElementTree: Implementation of the ElementTree API."><code class="xref py py-mod docutils literal notranslate"><span class="pre">xml.etree.ElementTree</span></code></a>
has no <code class="docutils literal notranslate"><span class="pre">copy()</span></code> method, only a <code class="docutils literal notranslate"><span class="pre">__copy__()</span></code> method.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94383">gh-94383</a>.)</p></li>
</ul>
</section>
<section id="zipimport">
<h3>zipimport<a class="headerlink" href="#zipimport" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove <a class="reference internal" href="../library/zipimport.html#module-zipimport" title="zipimport: Support for importing Python modules from ZIP archives."><code class="xref py py-mod docutils literal notranslate"><span class="pre">zipimport</span></code></a>s <code class="docutils literal notranslate"><span class="pre">find_loader()</span></code> and <code class="docutils literal notranslate"><span class="pre">find_module()</span></code> methods,
deprecated in Python 3.10: use the <code class="docutils literal notranslate"><span class="pre">find_spec()</span></code> method instead. See
<span class="target" id="index-40"></span><a class="pep reference external" href="https://peps.python.org/pep-0451/"><strong>PEP 451</strong></a> for the rationale.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94379">gh-94379</a>.)</p></li>
</ul>
</section>
<section id="others">
<h3>Others<a class="headerlink" href="#others" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove the <code class="docutils literal notranslate"><span class="pre">suspicious</span></code> rule from the documentation <code class="file docutils literal notranslate"><span class="pre">Makefile</span></code> and
<code class="file docutils literal notranslate"><span class="pre">Doc/tools/rstlint.py</span></code>, both in favor of <a class="reference external" href="https://github.com/sphinx-contrib/sphinx-lint">sphinx-lint</a>.
(Contributed by Julien Palard in <a class="reference external" href="https://github.com/python/cpython/issues/98179">gh-98179</a>.)</p></li>
<li><p>Remove the <em>keyfile</em> and <em>certfile</em> parameters from the
<a class="reference internal" href="../library/ftplib.html#module-ftplib" title="ftplib: FTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ftplib</span></code></a>, <a class="reference internal" href="../library/imaplib.html#module-imaplib" title="imaplib: IMAP4 protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">imaplib</span></code></a>, <a class="reference internal" href="../library/poplib.html#module-poplib" title="poplib: POP3 protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">poplib</span></code></a> and <a class="reference internal" href="../library/smtplib.html#module-smtplib" title="smtplib: SMTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code></a> modules,
and the <em>key_file</em>, <em>cert_file</em> and <em>check_hostname</em> parameters from the
<a class="reference internal" href="../library/http.client.html#module-http.client" title="http.client: HTTP and HTTPS protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.client</span></code></a> module,
all deprecated since Python 3.6. Use the <em>context</em> parameter
(<em>ssl_context</em> in <a class="reference internal" href="../library/imaplib.html#module-imaplib" title="imaplib: IMAP4 protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">imaplib</span></code></a>) instead.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94172">gh-94172</a>.)</p></li>
<li><p>Remove <code class="docutils literal notranslate"><span class="pre">Jython</span></code> compatibility hacks from several stdlib modules and tests.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/99482">gh-99482</a>.)</p></li>
<li><p>Remove <code class="docutils literal notranslate"><span class="pre">_use_broken_old_ctypes_structure_semantics_</span></code> flag
from <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> module.
(Contributed by Nikita Sobolev in <a class="reference external" href="https://github.com/python/cpython/issues/99285">gh-99285</a>.)</p></li>
</ul>
</section>
</section>
<section id="porting-to-python-3-12">
<span id="whatsnew312-porting-to-python312"></span><h2>Porting to Python 3.12<a class="headerlink" href="#porting-to-python-3-12" title="Link to this heading"></a></h2>
<p>This section lists previously described changes and other bugfixes
that may require changes to your code.</p>
<section id="changes-in-the-python-api">
<h3>Changes in the Python API<a class="headerlink" href="#changes-in-the-python-api" title="Link to this heading"></a></h3>
<ul>
<li><p>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 <a class="reference external" href="https://github.com/python/cpython/issues/91760">gh-91760</a>.)</p></li>
<li><p>Remove <code class="docutils literal notranslate"><span class="pre">randrange()</span></code> functionality deprecated since Python 3.10. Formerly,
<code class="docutils literal notranslate"><span class="pre">randrange(10.0)</span></code> losslessly converted to <code class="docutils literal notranslate"><span class="pre">randrange(10)</span></code>. Now, it raises a
<a class="reference internal" href="../library/exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a>. Also, the exception raised for non-integer values such as
<code class="docutils literal notranslate"><span class="pre">randrange(10.5)</span></code> or <code class="docutils literal notranslate"><span class="pre">randrange('10')</span></code> has been changed from <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> to
<a class="reference internal" href="../library/exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a>. This also prevents bugs where <code class="docutils literal notranslate"><span class="pre">randrange(1e25)</span></code> would silently
select from a larger range than <code class="docutils literal notranslate"><span class="pre">randrange(10**25)</span></code>.
(Originally suggested by Serhiy Storchaka <a class="reference external" href="https://github.com/python/cpython/issues/86388">gh-86388</a>.)</p></li>
<li><p><a class="reference internal" href="../library/argparse.html#argparse.ArgumentParser" title="argparse.ArgumentParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">argparse.ArgumentParser</span></code></a> changed encoding and error handler
for reading arguments from file (e.g. <code class="docutils literal notranslate"><span class="pre">fromfile_prefix_chars</span></code> option)
from default text encoding (e.g. <a class="reference internal" href="../library/locale.html#locale.getpreferredencoding" title="locale.getpreferredencoding"><code class="xref py py-func docutils literal notranslate"><span class="pre">locale.getpreferredencoding(False)</span></code></a>)
to <a class="reference internal" href="../glossary.html#term-filesystem-encoding-and-error-handler"><span class="xref std std-term">filesystem encoding and error handler</span></a>.
Argument files should be encoded in UTF-8 instead of ANSI Codepage on Windows.</p></li>
<li><p>Remove the <code class="docutils literal notranslate"><span class="pre">asyncore</span></code>-based <code class="docutils literal notranslate"><span class="pre">smtpd</span></code> module deprecated in Python 3.4.7
and 3.5.4. A recommended replacement is the
<a class="reference internal" href="../library/asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a>-based <a class="extlink-pypi reference external" href="https://pypi.org/project/aiosmtpd/">aiosmtpd</a> PyPI module.</p></li>
<li><p><a class="reference internal" href="../library/shlex.html#shlex.split" title="shlex.split"><code class="xref py py-func docutils literal notranslate"><span class="pre">shlex.split()</span></code></a>: Passing <code class="docutils literal notranslate"><span class="pre">None</span></code> for <em>s</em> argument now raises an
exception, rather than reading <a class="reference internal" href="../library/sys.html#sys.stdin" title="sys.stdin"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.stdin</span></code></a>. The feature was deprecated
in Python 3.9.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/94352">gh-94352</a>.)</p></li>
<li><p>The <a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a> module no longer accepts bytes-like paths, like
<a class="reference internal" href="../library/stdtypes.html#bytearray" title="bytearray"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytearray</span></code></a> and <a class="reference internal" href="../library/stdtypes.html#memoryview" title="memoryview"><code class="xref py py-class docutils literal notranslate"><span class="pre">memoryview</span></code></a> types: only the exact
<a class="reference internal" href="../library/stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a> type is accepted for bytes strings.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/98393">gh-98393</a>.)</p></li>
<li><p><a class="reference internal" href="../library/syslog.html#syslog.openlog" title="syslog.openlog"><code class="xref py py-func docutils literal notranslate"><span class="pre">syslog.openlog()</span></code></a> and <a class="reference internal" href="../library/syslog.html#syslog.closelog" title="syslog.closelog"><code class="xref py py-func docutils literal notranslate"><span class="pre">syslog.closelog()</span></code></a> now fail if used in subinterpreters.
<a class="reference internal" href="../library/syslog.html#syslog.syslog" title="syslog.syslog"><code class="xref py py-func docutils literal notranslate"><span class="pre">syslog.syslog()</span></code></a> may still be used in subinterpreters,
but now only if <a class="reference internal" href="../library/syslog.html#syslog.openlog" title="syslog.openlog"><code class="xref py py-func docutils literal notranslate"><span class="pre">syslog.openlog()</span></code></a> has already been called in the main interpreter.
These new restrictions do not apply to the main interpreter,
so only a very small set of users might be affected.
This change helps with interpreter isolation. Furthermore, <a class="reference internal" href="../library/syslog.html#module-syslog" title="syslog: An interface to the Unix syslog library routines. (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">syslog</span></code></a> is a wrapper
around process-global resources, which are best managed from the main interpreter.
(Contributed by Donghee Na in <a class="reference external" href="https://github.com/python/cpython/issues/99127">gh-99127</a>.)</p></li>
<li><p>The undocumented locking behavior of <a class="reference internal" href="../library/functools.html#functools.cached_property" title="functools.cached_property"><code class="xref py py-func docutils literal notranslate"><span class="pre">cached_property()</span></code></a>
is removed, because it locked across all instances of the class, leading to high
lock contention. This means that a cached property getter function could now run
more than once for a single instance, if two threads race. For most simple
cached properties (e.g. those that are idempotent and simply calculate a value
based on other attributes of the instance) this will be fine. If
synchronization is needed, implement locking within the cached property getter
function or around multi-threaded access points.</p></li>
<li><p><a class="reference internal" href="../library/sys.html#sys._current_exceptions" title="sys._current_exceptions"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys._current_exceptions()</span></code></a> now returns a mapping from thread-id to an
exception instance, rather than to a <code class="docutils literal notranslate"><span class="pre">(typ,</span> <span class="pre">exc,</span> <span class="pre">tb)</span></code> tuple.
(Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/103176">gh-103176</a>.)</p></li>
<li><p>When extracting tar files using <a class="reference internal" href="../library/tarfile.html#module-tarfile" title="tarfile: Read and write tar-format archive files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tarfile</span></code></a> or
<a class="reference internal" href="../library/shutil.html#shutil.unpack_archive" title="shutil.unpack_archive"><code class="xref py py-func docutils literal notranslate"><span class="pre">shutil.unpack_archive()</span></code></a>, pass the <em>filter</em> argument to limit features
that may be surprising or dangerous.
See <a class="reference internal" href="../library/tarfile.html#tarfile-extraction-filter"><span class="std std-ref">Extraction filters</span></a> for details.</p></li>
<li><p>The output of the <a class="reference internal" href="../library/tokenize.html#tokenize.tokenize" title="tokenize.tokenize"><code class="xref py py-func docutils literal notranslate"><span class="pre">tokenize.tokenize()</span></code></a> and <a class="reference internal" href="../library/tokenize.html#tokenize.generate_tokens" title="tokenize.generate_tokens"><code class="xref py py-func docutils literal notranslate"><span class="pre">tokenize.generate_tokens()</span></code></a>
functions is now changed due to the changes introduced in <span class="target" id="index-41"></span><a class="pep reference external" href="https://peps.python.org/pep-0701/"><strong>PEP 701</strong></a>. This
means that <code class="docutils literal notranslate"><span class="pre">STRING</span></code> tokens are not emitted any more for f-strings and the
tokens described in <span class="target" id="index-42"></span><a class="pep reference external" href="https://peps.python.org/pep-0701/"><strong>PEP 701</strong></a> are now produced instead: <code class="docutils literal notranslate"><span class="pre">FSTRING_START</span></code>,
<code class="docutils literal notranslate"><span class="pre">FSTRING_MIDDLE</span></code> and <code class="docutils literal notranslate"><span class="pre">FSTRING_END</span></code> are now emitted for f-string “string”
parts in addition to the appropriate tokens for the tokenization in the
expression components. For example for the f-string <code class="docutils literal notranslate"><span class="pre">f&quot;start</span> <span class="pre">{1+1}</span> <span class="pre">end&quot;</span></code>
the old version of the tokenizer emitted:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">18</span><span class="p">:</span> <span class="n">STRING</span> <span class="s1">&#39;f&quot;start {1+1} end&quot;&#39;</span>
</pre></div>
</div>
<p>while the new version emits:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">:</span> <span class="n">FSTRING_START</span> <span class="s1">&#39;f&quot;&#39;</span>
<span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">8</span><span class="p">:</span> <span class="n">FSTRING_MIDDLE</span> <span class="s1">&#39;start &#39;</span>
<span class="mi">1</span><span class="p">,</span><span class="mi">8</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">9</span><span class="p">:</span> <span class="n">OP</span> <span class="s1">&#39;{&#39;</span>
<span class="mi">1</span><span class="p">,</span><span class="mi">9</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">10</span><span class="p">:</span> <span class="n">NUMBER</span> <span class="s1">&#39;1&#39;</span>
<span class="mi">1</span><span class="p">,</span><span class="mi">10</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">11</span><span class="p">:</span> <span class="n">OP</span> <span class="s1">&#39;+&#39;</span>
<span class="mi">1</span><span class="p">,</span><span class="mi">11</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">12</span><span class="p">:</span> <span class="n">NUMBER</span> <span class="s1">&#39;1&#39;</span>
<span class="mi">1</span><span class="p">,</span><span class="mi">12</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">13</span><span class="p">:</span> <span class="n">OP</span> <span class="s1">&#39;}&#39;</span>
<span class="mi">1</span><span class="p">,</span><span class="mi">13</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">17</span><span class="p">:</span> <span class="n">FSTRING_MIDDLE</span> <span class="s1">&#39; end&#39;</span>
<span class="mi">1</span><span class="p">,</span><span class="mi">17</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">18</span><span class="p">:</span> <span class="n">FSTRING_END</span> <span class="s1">&#39;&quot;&#39;</span>
</pre></div>
</div>
<p>Additionally, there may be some minor behavioral changes as a consequence of the
changes required to support <span class="target" id="index-43"></span><a class="pep reference external" href="https://peps.python.org/pep-0701/"><strong>PEP 701</strong></a>. Some of these changes include:</p>
<ul class="simple">
<li><p>The <code class="docutils literal notranslate"><span class="pre">type</span></code> attribute of the tokens emitted when tokenizing some invalid Python
characters such as <code class="docutils literal notranslate"><span class="pre">!</span></code> has changed from <code class="docutils literal notranslate"><span class="pre">ERRORTOKEN</span></code> to <code class="docutils literal notranslate"><span class="pre">OP</span></code>.</p></li>
<li><p>Incomplete single-line strings now also raise <a class="reference internal" href="../library/tokenize.html#tokenize.TokenError" title="tokenize.TokenError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">tokenize.TokenError</span></code></a> as incomplete
multiline strings do.</p></li>
<li><p>Some incomplete or invalid Python code now raises <a class="reference internal" href="../library/tokenize.html#tokenize.TokenError" title="tokenize.TokenError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">tokenize.TokenError</span></code></a> instead of
returning arbitrary <code class="docutils literal notranslate"><span class="pre">ERRORTOKEN</span></code> tokens when tokenizing it.</p></li>
<li><p>Mixing tabs and spaces as indentation in the same file is not supported anymore and will
raise a <a class="reference internal" href="../library/exceptions.html#TabError" title="TabError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TabError</span></code></a>.</p></li>
</ul>
</li>
<li><p>The <a class="reference internal" href="../library/threading.html#module-threading" title="threading: Thread-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code></a> module now expects the <code class="xref py py-mod docutils literal notranslate"><span class="pre">_thread</span></code> module to have
an <code class="docutils literal notranslate"><span class="pre">_is_main_interpreter</span></code> attribute. It is a function with no
arguments that returns <code class="docutils literal notranslate"><span class="pre">True</span></code> if the current interpreter is the
main interpreter.</p>
<p>Any library or application that provides a custom <code class="docutils literal notranslate"><span class="pre">_thread</span></code> module
should provide <code class="docutils literal notranslate"><span class="pre">_is_main_interpreter()</span></code>.
(See <a class="reference external" href="https://github.com/python/cpython/issues/112826">gh-112826</a>.)</p>
</li>
</ul>
</section>
</section>
<section id="build-changes">
<h2>Build Changes<a class="headerlink" href="#build-changes" title="Link to this heading"></a></h2>
<ul>
<li><p>Python no longer uses <code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> to build shared C extension modules.
Build parameters like headers and libraries are detected in <code class="docutils literal notranslate"><span class="pre">configure</span></code>
script. Extensions are built by <code class="file docutils literal notranslate"><span class="pre">Makefile</span></code>. Most extensions use
<code class="docutils literal notranslate"><span class="pre">pkg-config</span></code> and fall back to manual detection.
(Contributed by Christian Heimes in <a class="reference external" href="https://github.com/python/cpython/issues/93939">gh-93939</a>.)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">va_start()</span></code> with two parameters, like <code class="docutils literal notranslate"><span class="pre">va_start(args,</span> <span class="pre">format),</span></code>
is now required to build Python.
<code class="docutils literal notranslate"><span class="pre">va_start()</span></code> is no longer called with a single parameter.
(Contributed by Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/93207">gh-93207</a>.)</p></li>
<li><p>CPython now uses the ThinLTO option as the default link time optimization policy
if the Clang compiler accepts the flag.
(Contributed by Donghee Na in <a class="reference external" href="https://github.com/python/cpython/issues/89536">gh-89536</a>.)</p></li>
<li><p>Add <code class="docutils literal notranslate"><span class="pre">COMPILEALL_OPTS</span></code> variable in <code class="file docutils literal notranslate"><span class="pre">Makefile</span></code> to override <a class="reference internal" href="../library/compileall.html#module-compileall" title="compileall: Tools for byte-compiling all Python source files in a directory tree."><code class="xref py py-mod docutils literal notranslate"><span class="pre">compileall</span></code></a>
options (default: <code class="docutils literal notranslate"><span class="pre">-j0</span></code>) in <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">install</span></code>. Also merged the 3
<code class="docutils literal notranslate"><span class="pre">compileall</span></code> commands into a single command to build .pyc files for all
optimization levels (0, 1, 2) at once.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/99289">gh-99289</a>.)</p></li>
<li><p>Add platform triplets for 64-bit LoongArch:</p>
<ul class="simple">
<li><p>loongarch64-linux-gnusf</p></li>
<li><p>loongarch64-linux-gnuf32</p></li>
<li><p>loongarch64-linux-gnu</p></li>
</ul>
<p>(Contributed by Zhang Na in <a class="reference external" href="https://github.com/python/cpython/issues/90656">gh-90656</a>.)</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">PYTHON_FOR_REGEN</span></code> now require Python 3.10 or newer.</p></li>
<li><p>Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate
<code class="file docutils literal notranslate"><span class="pre">!configure</span></code>.
(Contributed by Christian Heimes in <a class="reference external" href="https://github.com/python/cpython/issues/89886">gh-89886</a>.)</p></li>
<li><p>Windows builds and macOS installers from python.org now use OpenSSL 3.0.</p></li>
</ul>
</section>
<section id="c-api-changes">
<h2>C API Changes<a class="headerlink" href="#c-api-changes" title="Link to this heading"></a></h2>
<section id="id4">
<h3>New Features<a class="headerlink" href="#id4" title="Link to this heading"></a></h3>
<ul id="whatsnew312-pep697">
<li><p><span class="target" id="index-44"></span><a class="pep reference external" href="https://peps.python.org/pep-0697/"><strong>PEP 697</strong></a>: Introduce the <a class="reference internal" href="../c-api/stable.html#unstable-c-api"><span class="std std-ref">Unstable C API tier</span></a>,
intended for low-level tools like debuggers and JIT compilers.
This API may change in each minor release of CPython without deprecation
warnings.
Its contents are marked by the <code class="docutils literal notranslate"><span class="pre">PyUnstable_</span></code> prefix in names.</p>
<p>Code object constructors:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">PyUnstable_Code_New()</span></code> (renamed from <code class="docutils literal notranslate"><span class="pre">PyCode_New</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">PyUnstable_Code_NewWithPosOnlyArgs()</span></code> (renamed from <code class="docutils literal notranslate"><span class="pre">PyCode_NewWithPosOnlyArgs</span></code>)</p></li>
</ul>
<p>Extra storage for code objects (<span class="target" id="index-45"></span><a class="pep reference external" href="https://peps.python.org/pep-0523/"><strong>PEP 523</strong></a>):</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">PyUnstable_Eval_RequestCodeExtraIndex()</span></code> (renamed from <code class="docutils literal notranslate"><span class="pre">_PyEval_RequestCodeExtraIndex</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">PyUnstable_Code_GetExtra()</span></code> (renamed from <code class="docutils literal notranslate"><span class="pre">_PyCode_GetExtra</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">PyUnstable_Code_SetExtra()</span></code> (renamed from <code class="docutils literal notranslate"><span class="pre">_PyCode_SetExtra</span></code>)</p></li>
</ul>
<p>The original names will continue to be available until the respective
API changes.</p>
<p>(Contributed by Petr Viktorin in <a class="reference external" href="https://github.com/python/cpython/issues/101101">gh-101101</a>.)</p>
</li>
<li><p><span class="target" id="index-46"></span><a class="pep reference external" href="https://peps.python.org/pep-0697/"><strong>PEP 697</strong></a>: Add an API for extending types whose instance memory layout is
opaque:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/type.html#c.PyType_Spec.basicsize" title="PyType_Spec.basicsize"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyType_Spec.basicsize</span></code></a> can be zero or negative to specify
inheriting or extending the base class size.</p></li>
<li><p><a class="reference internal" href="../c-api/object.html#c.PyObject_GetTypeData" title="PyObject_GetTypeData"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GetTypeData()</span></code></a> and <a class="reference internal" href="../c-api/object.html#c.PyType_GetTypeDataSize" title="PyType_GetTypeDataSize"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_GetTypeDataSize()</span></code></a>
added to allow access to subclass-specific instance data.</p></li>
<li><p><a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_ITEMS_AT_END" title="Py_TPFLAGS_ITEMS_AT_END"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_ITEMS_AT_END</span></code></a> and <a class="reference internal" href="../c-api/object.html#c.PyObject_GetItemData" title="PyObject_GetItemData"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GetItemData()</span></code></a>
added to allow safely extending certain variable-sized types, including
<a class="reference internal" href="../c-api/type.html#c.PyType_Type" title="PyType_Type"><code class="xref c c-var docutils literal notranslate"><span class="pre">PyType_Type</span></code></a>.</p></li>
<li><p><a class="reference internal" href="../c-api/structures.html#c.Py_RELATIVE_OFFSET" title="Py_RELATIVE_OFFSET"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_RELATIVE_OFFSET</span></code></a> added to allow defining
<a class="reference internal" href="../c-api/structures.html#c.PyMemberDef" title="PyMemberDef"><code class="xref c c-type docutils literal notranslate"><span class="pre">members</span></code></a> in terms of a subclass-specific struct.</p></li>
</ul>
<p>(Contributed by Petr Viktorin in <a class="reference external" href="https://github.com/python/cpython/issues/103509">gh-103509</a>.)</p>
</li>
<li><p>Add the new <a class="reference internal" href="../c-api/stable.html#limited-c-api"><span class="std std-ref">limited C API</span></a> function <a class="reference internal" href="../c-api/type.html#c.PyType_FromMetaclass" title="PyType_FromMetaclass"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromMetaclass()</span></code></a>,
which generalizes the existing <a class="reference internal" href="../c-api/type.html#c.PyType_FromModuleAndSpec" title="PyType_FromModuleAndSpec"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromModuleAndSpec()</span></code></a> using
an additional metaclass argument.
(Contributed by Wenzel Jakob in <a class="reference external" href="https://github.com/python/cpython/issues/93012">gh-93012</a>.)</p></li>
<li><p>API for creating objects that can be called using
<a class="reference internal" href="../c-api/call.html#vectorcall"><span class="std std-ref">the vectorcall protocol</span></a> was added to the
<a class="reference internal" href="../c-api/stable.html#stable"><span class="std std-ref">Limited API</span></a>:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL" title="Py_TPFLAGS_HAVE_VECTORCALL"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_HAVE_VECTORCALL</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/call.html#c.PyVectorcall_NARGS" title="PyVectorcall_NARGS"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyVectorcall_NARGS()</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/call.html#c.PyVectorcall_Call" title="PyVectorcall_Call"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyVectorcall_Call()</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/call.html#c.vectorcallfunc" title="vectorcallfunc"><code class="xref c c-type docutils literal notranslate"><span class="pre">vectorcallfunc</span></code></a></p></li>
</ul>
<p>The <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL" title="Py_TPFLAGS_HAVE_VECTORCALL"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_HAVE_VECTORCALL</span></code></a> flag is now removed from a class
when the classs <a class="reference internal" href="../reference/datamodel.html#object.__call__" title="object.__call__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__call__()</span></code></a> method is reassigned.
This makes vectorcall safe to use with mutable types (i.e. heap types
without the immutable flag, <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE" title="Py_TPFLAGS_IMMUTABLETYPE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_IMMUTABLETYPE</span></code></a>).
Mutable types that do not override <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_call" title="PyTypeObject.tp_call"><code class="xref c c-member docutils literal notranslate"><span class="pre">tp_call</span></code></a> now
inherit the <code class="docutils literal notranslate"><span class="pre">Py_TPFLAGS_HAVE_VECTORCALL</span></code> flag.
(Contributed by Petr Viktorin in <a class="reference external" href="https://github.com/python/cpython/issues/93274">gh-93274</a>.)</p>
<p>The <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT" title="Py_TPFLAGS_MANAGED_DICT"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_MANAGED_DICT</span></code></a> and <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF" title="Py_TPFLAGS_MANAGED_WEAKREF"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_MANAGED_WEAKREF</span></code></a>
flags have been added. This allows extensions classes to support object
<a class="reference internal" href="../reference/datamodel.html#object.__dict__" title="object.__dict__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__dict__</span></code></a> and weakrefs with less bookkeeping,
using less memory and with faster access.</p>
</li>
<li><p>API for performing calls using
<a class="reference internal" href="../c-api/call.html#vectorcall"><span class="std std-ref">the vectorcall protocol</span></a> was added to the
<a class="reference internal" href="../c-api/stable.html#stable"><span class="std std-ref">Limited API</span></a>:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/call.html#c.PyObject_Vectorcall" title="PyObject_Vectorcall"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_Vectorcall()</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/call.html#c.PyObject_VectorcallMethod" title="PyObject_VectorcallMethod"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_VectorcallMethod()</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/call.html#c.PY_VECTORCALL_ARGUMENTS_OFFSET" title="PY_VECTORCALL_ARGUMENTS_OFFSET"><code class="xref c c-macro docutils literal notranslate"><span class="pre">PY_VECTORCALL_ARGUMENTS_OFFSET</span></code></a></p></li>
</ul>
<p>This means that both the incoming and outgoing ends of the vector call
protocol are now available in the <a class="reference internal" href="../c-api/stable.html#stable"><span class="std std-ref">Limited API</span></a>. (Contributed
by Wenzel Jakob in <a class="reference external" href="https://github.com/python/cpython/issues/98586">gh-98586</a>.)</p>
</li>
<li><p>Add two new public functions,
<a class="reference internal" href="../c-api/init.html#c.PyEval_SetProfileAllThreads" title="PyEval_SetProfileAllThreads"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyEval_SetProfileAllThreads()</span></code></a> and
<a class="reference internal" href="../c-api/init.html#c.PyEval_SetTraceAllThreads" title="PyEval_SetTraceAllThreads"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyEval_SetTraceAllThreads()</span></code></a>, that allow to set tracing and profiling
functions in all running threads in addition to the calling one. (Contributed
by Pablo Galindo in <a class="reference external" href="https://github.com/python/cpython/issues/93503">gh-93503</a>.)</p></li>
<li><p>Add new function <a class="reference internal" href="../c-api/function.html#c.PyFunction_SetVectorcall" title="PyFunction_SetVectorcall"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyFunction_SetVectorcall()</span></code></a> to the C API
which sets the vectorcall field of a given <a class="reference internal" href="../c-api/function.html#c.PyFunctionObject" title="PyFunctionObject"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyFunctionObject</span></code></a>.
(Contributed by Andrew Frost in <a class="reference external" href="https://github.com/python/cpython/issues/92257">gh-92257</a>.)</p></li>
<li><p>The C API now permits registering callbacks via <a class="reference internal" href="../c-api/dict.html#c.PyDict_AddWatcher" title="PyDict_AddWatcher"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyDict_AddWatcher()</span></code></a>,
<a class="reference internal" href="../c-api/dict.html#c.PyDict_Watch" title="PyDict_Watch"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyDict_Watch()</span></code></a> and related APIs to be called whenever a dictionary
is modified. This is intended for use by optimizing interpreters, JIT
compilers, or debuggers.
(Contributed by Carl Meyer in <a class="reference external" href="https://github.com/python/cpython/issues/91052">gh-91052</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../c-api/type.html#c.PyType_AddWatcher" title="PyType_AddWatcher"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_AddWatcher()</span></code></a> and <a class="reference internal" href="../c-api/type.html#c.PyType_Watch" title="PyType_Watch"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_Watch()</span></code></a> API to register
callbacks to receive notification on changes to a type.
(Contributed by Carl Meyer in <a class="reference external" href="https://github.com/python/cpython/issues/91051">gh-91051</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../c-api/code.html#c.PyCode_AddWatcher" title="PyCode_AddWatcher"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyCode_AddWatcher()</span></code></a> and <a class="reference internal" href="../c-api/code.html#c.PyCode_ClearWatcher" title="PyCode_ClearWatcher"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyCode_ClearWatcher()</span></code></a>
APIs to register callbacks to receive notification on creation and
destruction of code objects.
(Contributed by Itamar Oren in <a class="reference external" href="https://github.com/python/cpython/issues/91054">gh-91054</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../c-api/frame.html#c.PyFrame_GetVar" title="PyFrame_GetVar"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyFrame_GetVar()</span></code></a> and <a class="reference internal" href="../c-api/frame.html#c.PyFrame_GetVarString" title="PyFrame_GetVarString"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyFrame_GetVarString()</span></code></a> functions to
get a frame variable by its name.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/91248">gh-91248</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_GetRaisedException" title="PyErr_GetRaisedException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_GetRaisedException()</span></code></a> and <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_SetRaisedException" title="PyErr_SetRaisedException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_SetRaisedException()</span></code></a>
for saving and restoring the current exception.
These functions return and accept a single exception object,
rather than the triple arguments of the now-deprecated
<a class="reference internal" href="../c-api/exceptions.html#c.PyErr_Fetch" title="PyErr_Fetch"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Fetch()</span></code></a> and <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_Restore" title="PyErr_Restore"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Restore()</span></code></a>.
This is less error prone and a bit more efficient.
(Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/101578">gh-101578</a>.)</p></li>
<li><p>Add <code class="docutils literal notranslate"><span class="pre">_PyErr_ChainExceptions1</span></code>, which takes an exception instance,
to replace the legacy-API <code class="docutils literal notranslate"><span class="pre">_PyErr_ChainExceptions</span></code>, which is now
deprecated. (Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/101578">gh-101578</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../c-api/exceptions.html#c.PyException_GetArgs" title="PyException_GetArgs"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyException_GetArgs()</span></code></a> and <a class="reference internal" href="../c-api/exceptions.html#c.PyException_SetArgs" title="PyException_SetArgs"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyException_SetArgs()</span></code></a>
as convenience functions for retrieving and modifying
the <a class="reference internal" href="../library/exceptions.html#BaseException.args" title="BaseException.args"><code class="xref py py-attr docutils literal notranslate"><span class="pre">args</span></code></a> passed to the exceptions constructor.
(Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/101578">gh-101578</a>.)</p></li>
<li><p>Add <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_DisplayException" title="PyErr_DisplayException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_DisplayException()</span></code></a>, which takes an exception instance,
to replace the legacy-api <code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Display()</span></code>. (Contributed by
Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/102755">gh-102755</a>).</p></li>
</ul>
<ul id="whatsnew312-pep683">
<li><p><span class="target" id="index-47"></span><a class="pep reference external" href="https://peps.python.org/pep-0683/"><strong>PEP 683</strong></a>: Introduce <em>Immortal Objects</em>, which allows objects
to bypass reference counts, and related changes to the C-API:</p>
<ul class="simple">
<li><dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">_Py_IMMORTAL_REFCNT</span></code>: The reference count that defines an object</dt><dd><p>as immortal.</p>
</dd>
</dl>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_IsImmortal</span></code> Checks if an object has the immortal reference count.</p></li>
<li><dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">PyObject_HEAD_INIT</span></code> This will now initialize reference count to</dt><dd><p><code class="docutils literal notranslate"><span class="pre">_Py_IMMORTAL_REFCNT</span></code> when used with <code class="docutils literal notranslate"><span class="pre">Py_BUILD_CORE</span></code>.</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">SSTATE_INTERNED_IMMORTAL</span></code> An identifier for interned unicode objects</dt><dd><p>that are immortal.</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">SSTATE_INTERNED_IMMORTAL_STATIC</span></code> An identifier for interned unicode</dt><dd><p>objects that are immortal and static</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">sys.getunicodeinternedsize</span></code> This returns the total number of unicode</dt><dd><p>objects that have been interned. This is now needed for <code class="file docutils literal notranslate"><span class="pre">refleak.py</span></code> to
correctly track reference counts and allocated blocks</p>
</dd>
</dl>
</li>
</ul>
<p>(Contributed by Eddie Elizondo in <a class="reference external" href="https://github.com/python/cpython/issues/84436">gh-84436</a>.)</p>
</li>
<li><p><span class="target" id="index-48"></span><a class="pep reference external" href="https://peps.python.org/pep-0684/"><strong>PEP 684</strong></a>: Add the new <a class="reference internal" href="../c-api/init.html#c.Py_NewInterpreterFromConfig" title="Py_NewInterpreterFromConfig"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_NewInterpreterFromConfig()</span></code></a>
function and <a class="reference internal" href="../c-api/init.html#c.PyInterpreterConfig" title="PyInterpreterConfig"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyInterpreterConfig</span></code></a>, which may be used
to create sub-interpreters with their own GILs.
(See <a class="reference internal" href="#whatsnew312-pep684"><span class="std std-ref">PEP 684: A Per-Interpreter GIL</span></a> for more info.)
(Contributed by Eric Snow in <a class="reference external" href="https://github.com/python/cpython/issues/104110">gh-104110</a>.)</p></li>
<li><p>In the limited C API version 3.12, <a class="reference internal" href="../c-api/refcounting.html#c.Py_INCREF" title="Py_INCREF"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_INCREF()</span></code></a> and
<a class="reference internal" href="../c-api/refcounting.html#c.Py_DECREF" title="Py_DECREF"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_DECREF()</span></code></a> functions are now implemented as opaque function calls to
hide implementation details.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/105387">gh-105387</a>.)</p></li>
</ul>
</section>
<section id="id5">
<h3>Porting to Python 3.12<a class="headerlink" href="#id5" title="Link to this heading"></a></h3>
<ul>
<li><p>Legacy Unicode APIs based on <code class="docutils literal notranslate"><span class="pre">Py_UNICODE*</span></code> representation has been removed.
Please migrate to APIs based on UTF-8 or <code class="docutils literal notranslate"><span class="pre">wchar_t*</span></code>.</p></li>
<li><p>Argument parsing functions like <a class="reference internal" href="../c-api/arg.html#c.PyArg_ParseTuple" title="PyArg_ParseTuple"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyArg_ParseTuple()</span></code></a> doesnt support
<code class="docutils literal notranslate"><span class="pre">Py_UNICODE*</span></code> based format (e.g. <code class="docutils literal notranslate"><span class="pre">u</span></code>, <code class="docutils literal notranslate"><span class="pre">Z</span></code>) anymore. Please migrate
to other formats for Unicode like <code class="docutils literal notranslate"><span class="pre">s</span></code>, <code class="docutils literal notranslate"><span class="pre">z</span></code>, <code class="docutils literal notranslate"><span class="pre">es</span></code>, and <code class="docutils literal notranslate"><span class="pre">U</span></code>.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">tp_weaklist</span></code> for all static builtin types is always <code class="docutils literal notranslate"><span class="pre">NULL</span></code>.
This is an internal-only field on <code class="docutils literal notranslate"><span class="pre">PyTypeObject</span></code>
but were pointing out the change in case someone happens to be
accessing the field directly anyway. To avoid breakage, consider
using the existing public C-API instead, or, if necessary, the
(internal-only) <code class="docutils literal notranslate"><span class="pre">_PyObject_GET_WEAKREFS_LISTPTR()</span></code> macro.</p></li>
<li><p>This internal-only <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_subclasses" title="PyTypeObject.tp_subclasses"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyTypeObject.tp_subclasses</span></code></a> may now not be
a valid object pointer. Its type was changed to <span class="c-expr sig sig-inline c"><span class="kt">void</span><span class="p">*</span></span> to
reflect this. We mention this in case someone happens to be accessing the
internal-only field directly.</p>
<p>To get a list of subclasses, call the Python method
<a class="reference internal" href="../reference/datamodel.html#type.__subclasses__" title="type.__subclasses__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__subclasses__()</span></code></a> (using <a class="reference internal" href="../c-api/call.html#c.PyObject_CallMethod" title="PyObject_CallMethod"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_CallMethod()</span></code></a>,
for example).</p>
</li>
<li><p>Add support of more formatting options (left aligning, octals, uppercase
hexadecimals, <code class="xref c c-type docutils literal notranslate"><span class="pre">intmax_t</span></code>, <code class="xref c c-type docutils literal notranslate"><span class="pre">ptrdiff_t</span></code>, <code class="xref c c-type docutils literal notranslate"><span class="pre">wchar_t</span></code> C
strings, variable width and precision) in <a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_FromFormat" title="PyUnicode_FromFormat"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FromFormat()</span></code></a> and
<a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_FromFormatV" title="PyUnicode_FromFormatV"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FromFormatV()</span></code></a>.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/98836">gh-98836</a>.)</p></li>
<li><p>An unrecognized format character in <a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_FromFormat" title="PyUnicode_FromFormat"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FromFormat()</span></code></a> and
<a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_FromFormatV" title="PyUnicode_FromFormatV"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FromFormatV()</span></code></a> now sets a <a class="reference internal" href="../library/exceptions.html#SystemError" title="SystemError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SystemError</span></code></a>.
In previous versions it caused all the rest of the format string to be
copied as-is to the result string, and any extra arguments discarded.
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://github.com/python/cpython/issues/95781">gh-95781</a>.)</p></li>
<li><p>Fix wrong sign placement in <a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_FromFormat" title="PyUnicode_FromFormat"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FromFormat()</span></code></a> and
<a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_FromFormatV" title="PyUnicode_FromFormatV"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FromFormatV()</span></code></a>.
(Contributed by Philip Georgi in <a class="reference external" href="https://github.com/python/cpython/issues/95504">gh-95504</a>.)</p></li>
<li><p>Extension classes wanting to add a <a class="reference internal" href="../reference/datamodel.html#object.__dict__" title="object.__dict__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__dict__</span></code></a> or weak reference slot
should use <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT" title="Py_TPFLAGS_MANAGED_DICT"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_MANAGED_DICT</span></code></a> and
<a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF" title="Py_TPFLAGS_MANAGED_WEAKREF"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_MANAGED_WEAKREF</span></code></a> instead of <code class="docutils literal notranslate"><span class="pre">tp_dictoffset</span></code> and
<code class="docutils literal notranslate"><span class="pre">tp_weaklistoffset</span></code>, respectively.
The use of <code class="docutils literal notranslate"><span class="pre">tp_dictoffset</span></code> and <code class="docutils literal notranslate"><span class="pre">tp_weaklistoffset</span></code> is still
supported, but does not fully support multiple inheritance
(<a class="reference external" href="https://github.com/python/cpython/issues/95589">gh-95589</a>), and performance may be worse.
Classes declaring <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT" title="Py_TPFLAGS_MANAGED_DICT"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_MANAGED_DICT</span></code></a> must call
<code class="xref c c-func docutils literal notranslate"><span class="pre">_PyObject_VisitManagedDict()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">_PyObject_ClearManagedDict()</span></code>
to traverse and clear their instances dictionaries.
To clear weakrefs, call <a class="reference internal" href="../c-api/weakref.html#c.PyObject_ClearWeakRefs" title="PyObject_ClearWeakRefs"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_ClearWeakRefs()</span></code></a>, as before.</p></li>
<li><p>The <a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_FSDecoder" title="PyUnicode_FSDecoder"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FSDecoder()</span></code></a> function no longer accepts bytes-like
paths, like <a class="reference internal" href="../library/stdtypes.html#bytearray" title="bytearray"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytearray</span></code></a> and <a class="reference internal" href="../library/stdtypes.html#memoryview" title="memoryview"><code class="xref py py-class docutils literal notranslate"><span class="pre">memoryview</span></code></a> types: only the exact
<a class="reference internal" href="../library/stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a> type is accepted for bytes strings.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/98393">gh-98393</a>.)</p></li>
<li><p>The <a class="reference internal" href="../c-api/refcounting.html#c.Py_CLEAR" title="Py_CLEAR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_CLEAR</span></code></a>, <a class="reference internal" href="../c-api/refcounting.html#c.Py_SETREF" title="Py_SETREF"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_SETREF</span></code></a> and <a class="reference internal" href="../c-api/refcounting.html#c.Py_XSETREF" title="Py_XSETREF"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_XSETREF</span></code></a>
macros now only evaluate their arguments once. If an argument has side
effects, these side effects are no longer duplicated.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/98724">gh-98724</a>.)</p></li>
<li><p>The interpreters error indicator is now always normalized. This means
that <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_SetObject" title="PyErr_SetObject"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_SetObject()</span></code></a>, <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_SetString" title="PyErr_SetString"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_SetString()</span></code></a> and the other
functions that set the error indicator now normalize the exception
before storing it. (Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/101578">gh-101578</a>.)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_RefTotal</span></code> is no longer authoritative and only kept around
for ABI compatibility. Note that it is an internal global and only
available on debug builds. If you happen to be using it then youll
need to start using <code class="docutils literal notranslate"><span class="pre">_Py_GetGlobalRefTotal()</span></code>.</p></li>
<li><p>The following functions now select an appropriate metaclass for the newly
created type:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/type.html#c.PyType_FromSpec" title="PyType_FromSpec"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromSpec()</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/type.html#c.PyType_FromSpecWithBases" title="PyType_FromSpecWithBases"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromSpecWithBases()</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/type.html#c.PyType_FromModuleAndSpec" title="PyType_FromModuleAndSpec"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromModuleAndSpec()</span></code></a></p></li>
</ul>
<p>Creating classes whose metaclass overrides <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_new" title="PyTypeObject.tp_new"><code class="xref c c-member docutils literal notranslate"><span class="pre">tp_new</span></code></a>
is deprecated, and in Python 3.14+ it will be disallowed.
Note that these functions ignore <code class="docutils literal notranslate"><span class="pre">tp_new</span></code> of the metaclass, possibly
allowing incomplete initialization.</p>
<p>Note that <a class="reference internal" href="../c-api/type.html#c.PyType_FromMetaclass" title="PyType_FromMetaclass"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromMetaclass()</span></code></a> (added in Python 3.12)
already disallows creating classes whose metaclass overrides <code class="docutils literal notranslate"><span class="pre">tp_new</span></code>
(<a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> in Python).</p>
<p>Since <code class="docutils literal notranslate"><span class="pre">tp_new</span></code> overrides almost everything <code class="docutils literal notranslate"><span class="pre">PyType_From*</span></code> functions do,
the two are incompatible with each other.
The existing behavior ignoring the metaclass for several steps
of type creation is unsafe in general, since (meta)classes assume that
<code class="docutils literal notranslate"><span class="pre">tp_new</span></code> was called.
There is no simple general workaround. One of the following may work for you:</p>
<ul class="simple">
<li><p>If you control the metaclass, avoid using <code class="docutils literal notranslate"><span class="pre">tp_new</span></code> in it:</p>
<ul>
<li><p>If initialization can be skipped, it can be done in
<a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_init" title="PyTypeObject.tp_init"><code class="xref c c-member docutils literal notranslate"><span class="pre">tp_init</span></code></a> instead.</p></li>
<li><p>If the metaclass doesnt need to be instantiated from Python,
set its <code class="docutils literal notranslate"><span class="pre">tp_new</span></code> to <code class="docutils literal notranslate"><span class="pre">NULL</span></code> using
the <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION" title="Py_TPFLAGS_DISALLOW_INSTANTIATION"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_DISALLOW_INSTANTIATION</span></code></a> flag.
This makes it acceptable for <code class="docutils literal notranslate"><span class="pre">PyType_From*</span></code> functions.</p></li>
</ul>
</li>
<li><p>Avoid <code class="docutils literal notranslate"><span class="pre">PyType_From*</span></code> functions: if you dont need C-specific features
(slots or setting the instance size), create types by <a class="reference internal" href="../c-api/call.html#call"><span class="std std-ref">calling</span></a>
the metaclass.</p></li>
<li><p>If you <em>know</em> the <code class="docutils literal notranslate"><span class="pre">tp_new</span></code> can be skipped safely, filter the deprecation
warning out using <a class="reference internal" href="../library/warnings.html#warnings.catch_warnings" title="warnings.catch_warnings"><code class="xref py py-func docutils literal notranslate"><span class="pre">warnings.catch_warnings()</span></code></a> from Python.</p></li>
</ul>
</li>
<li><p><a class="reference internal" href="../c-api/veryhigh.html#c.PyOS_InputHook" title="PyOS_InputHook"><code class="xref c c-var docutils literal notranslate"><span class="pre">PyOS_InputHook</span></code></a> and <a class="reference internal" href="../c-api/veryhigh.html#c.PyOS_ReadlineFunctionPointer" title="PyOS_ReadlineFunctionPointer"><code class="xref c c-var docutils literal notranslate"><span class="pre">PyOS_ReadlineFunctionPointer</span></code></a> are no
longer called in <a class="reference internal" href="../c-api/init.html#sub-interpreter-support"><span class="std std-ref">subinterpreters</span></a>. This is
because clients generally rely on process-wide global state (since these
callbacks have no way of recovering extension module state).</p>
<p>This also avoids situations where extensions may find themselves running in a
subinterpreter that they dont support (or havent yet been loaded in). See
<a class="reference external" href="https://github.com/python/cpython/issues/104668">gh-104668</a> for more info.</p>
</li>
<li><p><a class="reference internal" href="../c-api/long.html#c.PyLongObject" title="PyLongObject"><code class="xref c c-struct docutils literal notranslate"><span class="pre">PyLongObject</span></code></a> has had its internals changed for better performance.
Although the internals of <a class="reference internal" href="../c-api/long.html#c.PyLongObject" title="PyLongObject"><code class="xref c c-struct docutils literal notranslate"><span class="pre">PyLongObject</span></code></a> are private, they are used
by some extension modules.
The internal fields should no longer be accessed directly, instead the API
functions beginning <code class="docutils literal notranslate"><span class="pre">PyLong_...</span></code> should be used instead.
Two new <em>unstable</em> API functions are provided for efficient access to the
value of <a class="reference internal" href="../c-api/long.html#c.PyLongObject" title="PyLongObject"><code class="xref c c-struct docutils literal notranslate"><span class="pre">PyLongObject</span></code></a>s which fit into a single machine word:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/long.html#c.PyUnstable_Long_IsCompact" title="PyUnstable_Long_IsCompact"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnstable_Long_IsCompact()</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/long.html#c.PyUnstable_Long_CompactValue" title="PyUnstable_Long_CompactValue"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnstable_Long_CompactValue()</span></code></a></p></li>
</ul>
</li>
<li><p>Custom allocators, set via <a class="reference internal" href="../c-api/memory.html#c.PyMem_SetAllocator" title="PyMem_SetAllocator"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyMem_SetAllocator()</span></code></a>, are now
required to be thread-safe, regardless of memory domain. Allocators
that dont have their own state, including “hooks”, are not affected.
If your custom allocator is not already thread-safe and you need
guidance then please create a new GitHub issue
and CC <code class="docutils literal notranslate"><span class="pre">&#64;ericsnowcurrently</span></code>.</p></li>
</ul>
</section>
<section id="id6">
<h3>Deprecated<a class="headerlink" href="#id6" title="Link to this heading"></a></h3>
<ul>
<li><p>In accordance with <span class="target" id="index-49"></span><a class="pep reference external" href="https://peps.python.org/pep-0699/"><strong>PEP 699</strong></a>, the <code class="docutils literal notranslate"><span class="pre">ma_version_tag</span></code> field in <a class="reference internal" href="../c-api/dict.html#c.PyDictObject" title="PyDictObject"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyDictObject</span></code></a>
is deprecated for extension modules. Accessing this field will generate a compiler
warning at compile time. This field will be removed in Python 3.14.
(Contributed by Ramvikrams and Kumar Aditya in <a class="reference external" href="https://github.com/python/cpython/issues/101193">gh-101193</a>. PEP by Ken Jin.)</p></li>
<li><p>Deprecate global configuration variable:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_DebugFlag" title="Py_DebugFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_DebugFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.parser_debug" title="PyConfig.parser_debug"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.parser_debug</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_VerboseFlag" title="Py_VerboseFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_VerboseFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.verbose" title="PyConfig.verbose"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.verbose</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_QuietFlag" title="Py_QuietFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_QuietFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.quiet" title="PyConfig.quiet"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.quiet</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_InteractiveFlag" title="Py_InteractiveFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_InteractiveFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.interactive" title="PyConfig.interactive"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.interactive</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_InspectFlag" title="Py_InspectFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_InspectFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.inspect" title="PyConfig.inspect"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.inspect</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_OptimizeFlag" title="Py_OptimizeFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_OptimizeFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.optimization_level" title="PyConfig.optimization_level"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.optimization_level</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_NoSiteFlag" title="Py_NoSiteFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_NoSiteFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.site_import" title="PyConfig.site_import"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.site_import</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_BytesWarningFlag" title="Py_BytesWarningFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_BytesWarningFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.bytes_warning" title="PyConfig.bytes_warning"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.bytes_warning</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_FrozenFlag" title="Py_FrozenFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_FrozenFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.pathconfig_warnings" title="PyConfig.pathconfig_warnings"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.pathconfig_warnings</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_IgnoreEnvironmentFlag" title="Py_IgnoreEnvironmentFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_IgnoreEnvironmentFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.use_environment" title="PyConfig.use_environment"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.use_environment</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_DontWriteBytecodeFlag" title="Py_DontWriteBytecodeFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_DontWriteBytecodeFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.write_bytecode" title="PyConfig.write_bytecode"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.write_bytecode</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_NoUserSiteDirectory" title="Py_NoUserSiteDirectory"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_NoUserSiteDirectory</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.user_site_directory" title="PyConfig.user_site_directory"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.user_site_directory</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_UnbufferedStdioFlag" title="Py_UnbufferedStdioFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_UnbufferedStdioFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.buffered_stdio" title="PyConfig.buffered_stdio"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.buffered_stdio</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_HashRandomizationFlag" title="Py_HashRandomizationFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_HashRandomizationFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.use_hash_seed" title="PyConfig.use_hash_seed"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.use_hash_seed</span></code></a>
and <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.hash_seed" title="PyConfig.hash_seed"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.hash_seed</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_IsolatedFlag" title="Py_IsolatedFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_IsolatedFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.isolated" title="PyConfig.isolated"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.isolated</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_LegacyWindowsFSEncodingFlag" title="Py_LegacyWindowsFSEncodingFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_LegacyWindowsFSEncodingFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyPreConfig.legacy_windows_fs_encoding" title="PyPreConfig.legacy_windows_fs_encoding"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyPreConfig.legacy_windows_fs_encoding</span></code></a></p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_LegacyWindowsStdioFlag" title="Py_LegacyWindowsStdioFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_LegacyWindowsStdioFlag</span></code></a>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.legacy_windows_stdio" title="PyConfig.legacy_windows_stdio"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.legacy_windows_stdio</span></code></a></p></li>
<li><p><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_FileSystemDefaultEncoding</span></code>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.filesystem_encoding" title="PyConfig.filesystem_encoding"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.filesystem_encoding</span></code></a></p></li>
<li><p><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_HasFileSystemDefaultEncoding</span></code>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.filesystem_encoding" title="PyConfig.filesystem_encoding"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.filesystem_encoding</span></code></a></p></li>
<li><p><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_FileSystemDefaultEncodeErrors</span></code>: use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.filesystem_errors" title="PyConfig.filesystem_errors"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.filesystem_errors</span></code></a></p></li>
<li><p><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_UTF8Mode</span></code>: use <a class="reference internal" href="../c-api/init_config.html#c.PyPreConfig.utf8_mode" title="PyPreConfig.utf8_mode"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyPreConfig.utf8_mode</span></code></a> (see <a class="reference internal" href="../c-api/init_config.html#c.Py_PreInitialize" title="Py_PreInitialize"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_PreInitialize()</span></code></a>)</p></li>
</ul>
<p>The <a class="reference internal" href="../c-api/init.html#c.Py_InitializeFromConfig" title="Py_InitializeFromConfig"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_InitializeFromConfig()</span></code></a> API should be used with
<a class="reference internal" href="../c-api/init_config.html#c.PyConfig" title="PyConfig"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyConfig</span></code></a> instead.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/77782">gh-77782</a>.)</p>
</li>
<li><p>Creating <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE" title="Py_TPFLAGS_IMMUTABLETYPE"><code class="xref c c-data docutils literal notranslate"><span class="pre">immutable</span> <span class="pre">types</span></code></a> with mutable
bases is deprecated and will be disabled in Python 3.14. (<a class="reference external" href="https://github.com/python/cpython/issues/95388">gh-95388</a>)</p></li>
<li><p>The <code class="file docutils literal notranslate"><span class="pre">structmember.h</span></code> header is deprecated, though it continues to be
available and there are no plans to remove it.</p>
<p>Its contents are now available just by including <code class="file docutils literal notranslate"><span class="pre">Python.h</span></code>,
with a <code class="docutils literal notranslate"><span class="pre">Py</span></code> prefix added if it was missing:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/structures.html#c.PyMemberDef" title="PyMemberDef"><code class="xref c c-struct docutils literal notranslate"><span class="pre">PyMemberDef</span></code></a>, <a class="reference internal" href="../c-api/structures.html#c.PyMember_GetOne" title="PyMember_GetOne"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyMember_GetOne()</span></code></a> and
<a class="reference internal" href="../c-api/structures.html#c.PyMember_SetOne" title="PyMember_SetOne"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyMember_SetOne()</span></code></a></p></li>
<li><p>Type macros like <a class="reference internal" href="../c-api/structures.html#c.Py_T_INT" title="Py_T_INT"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_T_INT</span></code></a>, <a class="reference internal" href="../c-api/structures.html#c.Py_T_DOUBLE" title="Py_T_DOUBLE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_T_DOUBLE</span></code></a>, etc.
(previously <code class="docutils literal notranslate"><span class="pre">T_INT</span></code>, <code class="docutils literal notranslate"><span class="pre">T_DOUBLE</span></code>, etc.)</p></li>
<li><p>The flags <a class="reference internal" href="../c-api/structures.html#c.Py_READONLY" title="Py_READONLY"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_READONLY</span></code></a> (previously <code class="docutils literal notranslate"><span class="pre">READONLY</span></code>) and
<a class="reference internal" href="../c-api/structures.html#c.Py_AUDIT_READ" title="Py_AUDIT_READ"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_AUDIT_READ</span></code></a> (previously all uppercase)</p></li>
</ul>
<p>Several items are not exposed from <code class="file docutils literal notranslate"><span class="pre">Python.h</span></code>:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/structures.html#c.T_OBJECT" title="T_OBJECT"><code class="xref c c-macro docutils literal notranslate"><span class="pre">T_OBJECT</span></code></a> (use <a class="reference internal" href="../c-api/structures.html#c.Py_T_OBJECT_EX" title="Py_T_OBJECT_EX"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_T_OBJECT_EX</span></code></a>)</p></li>
<li><p><a class="reference internal" href="../c-api/structures.html#c.T_NONE" title="T_NONE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">T_NONE</span></code></a> (previously undocumented, and pretty quirky)</p></li>
<li><p>The macro <code class="docutils literal notranslate"><span class="pre">WRITE_RESTRICTED</span></code> which does nothing.</p></li>
<li><p>The macros <code class="docutils literal notranslate"><span class="pre">RESTRICTED</span></code> and <code class="docutils literal notranslate"><span class="pre">READ_RESTRICTED</span></code>, equivalents of
<a class="reference internal" href="../c-api/structures.html#c.Py_AUDIT_READ" title="Py_AUDIT_READ"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_AUDIT_READ</span></code></a>.</p></li>
<li><p>In some configurations, <code class="docutils literal notranslate"><span class="pre">&lt;stddef.h&gt;</span></code> is not included from <code class="file docutils literal notranslate"><span class="pre">Python.h</span></code>.
It should be included manually when using <code class="docutils literal notranslate"><span class="pre">offsetof()</span></code>.</p></li>
</ul>
<p>The deprecated header continues to provide its original
contents under the original names.
Your old code can stay unchanged, unless the extra include and non-namespaced
macros bother you greatly.</p>
<p>(Contributed in <a class="reference external" href="https://github.com/python/cpython/issues/47146">gh-47146</a> by Petr Viktorin, based on
earlier work by Alexander Belopolsky and Matthias Braun.)</p>
</li>
<li><p><a class="reference internal" href="../c-api/exceptions.html#c.PyErr_Fetch" title="PyErr_Fetch"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Fetch()</span></code></a> and <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_Restore" title="PyErr_Restore"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Restore()</span></code></a> are deprecated.
Use <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_GetRaisedException" title="PyErr_GetRaisedException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_GetRaisedException()</span></code></a> and
<a class="reference internal" href="../c-api/exceptions.html#c.PyErr_SetRaisedException" title="PyErr_SetRaisedException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_SetRaisedException()</span></code></a> instead.
(Contributed by Mark Shannon in <a class="reference external" href="https://github.com/python/cpython/issues/101578">gh-101578</a>.)</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Display()</span></code> is deprecated. Use <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_DisplayException" title="PyErr_DisplayException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_DisplayException()</span></code></a>
instead. (Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/102755">gh-102755</a>).</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">_PyErr_ChainExceptions</span></code> is deprecated. Use <code class="docutils literal notranslate"><span class="pre">_PyErr_ChainExceptions1</span></code>
instead. (Contributed by Irit Katriel in <a class="reference external" href="https://github.com/python/cpython/issues/102192">gh-102192</a>.)</p></li>
<li><p>Using <a class="reference internal" href="../c-api/type.html#c.PyType_FromSpec" title="PyType_FromSpec"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromSpec()</span></code></a>, <a class="reference internal" href="../c-api/type.html#c.PyType_FromSpecWithBases" title="PyType_FromSpecWithBases"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromSpecWithBases()</span></code></a>
or <a class="reference internal" href="../c-api/type.html#c.PyType_FromModuleAndSpec" title="PyType_FromModuleAndSpec"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_FromModuleAndSpec()</span></code></a> to create a class whose metaclass
overrides <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_new" title="PyTypeObject.tp_new"><code class="xref c c-member docutils literal notranslate"><span class="pre">tp_new</span></code></a> is deprecated.
Call the metaclass instead.</p></li>
</ul>
<section id="id7">
<h4>Pending Removal in Python 3.14<a class="headerlink" href="#id7" title="Link to this heading"></a></h4>
<ul>
<li><p>The <code class="docutils literal notranslate"><span class="pre">ma_version_tag</span></code> field in <a class="reference internal" href="../c-api/dict.html#c.PyDictObject" title="PyDictObject"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyDictObject</span></code></a> for extension modules
(<span class="target" id="index-50"></span><a class="pep reference external" href="https://peps.python.org/pep-0699/"><strong>PEP 699</strong></a>; <a class="reference external" href="https://github.com/python/cpython/issues/101193">gh-101193</a>).</p></li>
<li><p>Creating <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE" title="Py_TPFLAGS_IMMUTABLETYPE"><code class="xref c c-data docutils literal notranslate"><span class="pre">immutable</span> <span class="pre">types</span></code></a> with mutable
bases (<a class="reference external" href="https://github.com/python/cpython/issues/95388">gh-95388</a>).</p></li>
<li><p>Functions to configure Pythons initialization, deprecated in Python 3.11:</p>
<ul class="simple">
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PySys_SetArgvEx()</span></code>:
Set <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.argv" title="PyConfig.argv"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.argv</span></code></a> instead.</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PySys_SetArgv()</span></code>:
Set <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.argv" title="PyConfig.argv"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.argv</span></code></a> instead.</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_SetProgramName()</span></code>:
Set <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.program_name" title="PyConfig.program_name"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.program_name</span></code></a> instead.</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_SetPythonHome()</span></code>:
Set <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.home" title="PyConfig.home"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.home</span></code></a> instead.</p></li>
</ul>
<p>The <a class="reference internal" href="../c-api/init.html#c.Py_InitializeFromConfig" title="Py_InitializeFromConfig"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_InitializeFromConfig()</span></code></a> API should be used with
<a class="reference internal" href="../c-api/init_config.html#c.PyConfig" title="PyConfig"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyConfig</span></code></a> instead.</p>
</li>
<li><p>Global configuration variables:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_DebugFlag" title="Py_DebugFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_DebugFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.parser_debug" title="PyConfig.parser_debug"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.parser_debug</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_VerboseFlag" title="Py_VerboseFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_VerboseFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.verbose" title="PyConfig.verbose"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.verbose</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_QuietFlag" title="Py_QuietFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_QuietFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.quiet" title="PyConfig.quiet"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.quiet</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_InteractiveFlag" title="Py_InteractiveFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_InteractiveFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.interactive" title="PyConfig.interactive"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.interactive</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_InspectFlag" title="Py_InspectFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_InspectFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.inspect" title="PyConfig.inspect"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.inspect</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_OptimizeFlag" title="Py_OptimizeFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_OptimizeFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.optimization_level" title="PyConfig.optimization_level"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.optimization_level</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_NoSiteFlag" title="Py_NoSiteFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_NoSiteFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.site_import" title="PyConfig.site_import"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.site_import</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_BytesWarningFlag" title="Py_BytesWarningFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_BytesWarningFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.bytes_warning" title="PyConfig.bytes_warning"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.bytes_warning</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_FrozenFlag" title="Py_FrozenFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_FrozenFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.pathconfig_warnings" title="PyConfig.pathconfig_warnings"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.pathconfig_warnings</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_IgnoreEnvironmentFlag" title="Py_IgnoreEnvironmentFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_IgnoreEnvironmentFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.use_environment" title="PyConfig.use_environment"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.use_environment</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_DontWriteBytecodeFlag" title="Py_DontWriteBytecodeFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_DontWriteBytecodeFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.write_bytecode" title="PyConfig.write_bytecode"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.write_bytecode</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_NoUserSiteDirectory" title="Py_NoUserSiteDirectory"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_NoUserSiteDirectory</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.user_site_directory" title="PyConfig.user_site_directory"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.user_site_directory</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_UnbufferedStdioFlag" title="Py_UnbufferedStdioFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_UnbufferedStdioFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.buffered_stdio" title="PyConfig.buffered_stdio"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.buffered_stdio</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_HashRandomizationFlag" title="Py_HashRandomizationFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_HashRandomizationFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.use_hash_seed" title="PyConfig.use_hash_seed"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.use_hash_seed</span></code></a>
and <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.hash_seed" title="PyConfig.hash_seed"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.hash_seed</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_IsolatedFlag" title="Py_IsolatedFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_IsolatedFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.isolated" title="PyConfig.isolated"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.isolated</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_LegacyWindowsFSEncodingFlag" title="Py_LegacyWindowsFSEncodingFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_LegacyWindowsFSEncodingFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyPreConfig.legacy_windows_fs_encoding" title="PyPreConfig.legacy_windows_fs_encoding"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyPreConfig.legacy_windows_fs_encoding</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_LegacyWindowsStdioFlag" title="Py_LegacyWindowsStdioFlag"><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_LegacyWindowsStdioFlag</span></code></a>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.legacy_windows_stdio" title="PyConfig.legacy_windows_stdio"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.legacy_windows_stdio</span></code></a> instead.</p></li>
<li><p><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_FileSystemDefaultEncoding</span></code>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.filesystem_encoding" title="PyConfig.filesystem_encoding"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.filesystem_encoding</span></code></a> instead.</p></li>
<li><p><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_HasFileSystemDefaultEncoding</span></code>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.filesystem_encoding" title="PyConfig.filesystem_encoding"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.filesystem_encoding</span></code></a> instead.</p></li>
<li><p><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_FileSystemDefaultEncodeErrors</span></code>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.filesystem_errors" title="PyConfig.filesystem_errors"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.filesystem_errors</span></code></a> instead.</p></li>
<li><p><code class="xref c c-var docutils literal notranslate"><span class="pre">Py_UTF8Mode</span></code>:
Use <a class="reference internal" href="../c-api/init_config.html#c.PyPreConfig.utf8_mode" title="PyPreConfig.utf8_mode"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyPreConfig.utf8_mode</span></code></a> instead.
(see <a class="reference internal" href="../c-api/init_config.html#c.Py_PreInitialize" title="Py_PreInitialize"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_PreInitialize()</span></code></a>)</p></li>
</ul>
<p>The <a class="reference internal" href="../c-api/init.html#c.Py_InitializeFromConfig" title="Py_InitializeFromConfig"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_InitializeFromConfig()</span></code></a> API should be used with
<a class="reference internal" href="../c-api/init_config.html#c.PyConfig" title="PyConfig"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyConfig</span></code></a> instead.</p>
</li>
</ul>
</section>
<section id="id8">
<h4>Pending Removal in Python 3.15<a class="headerlink" href="#id8" title="Link to this heading"></a></h4>
<ul class="simple">
<li><p>The bundled copy of <code class="docutils literal notranslate"><span class="pre">libmpdecimal</span></code>.</p></li>
<li><p>The <a class="reference internal" href="../c-api/import.html#c.PyImport_ImportModuleNoBlock" title="PyImport_ImportModuleNoBlock"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyImport_ImportModuleNoBlock()</span></code></a>:
Use <a class="reference internal" href="../c-api/import.html#c.PyImport_ImportModule" title="PyImport_ImportModule"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyImport_ImportModule()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/weakref.html#c.PyWeakref_GetObject" title="PyWeakref_GetObject"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyWeakref_GetObject()</span></code></a> and <a class="reference internal" href="../c-api/weakref.html#c.PyWeakref_GET_OBJECT" title="PyWeakref_GET_OBJECT"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyWeakref_GET_OBJECT()</span></code></a>:
Use <a class="reference internal" href="../c-api/weakref.html#c.PyWeakref_GetRef" title="PyWeakref_GetRef"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyWeakref_GetRef()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/unicode.html#c.Py_UNICODE" title="Py_UNICODE"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_UNICODE</span></code></a> type and the <code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_UNICODE_WIDE</span></code> macro:
Use <code class="xref c c-type docutils literal notranslate"><span class="pre">wchar_t</span></code> instead.</p></li>
<li><p>Python initialization functions:</p>
<ul>
<li><p><a class="reference internal" href="../c-api/sys.html#c.PySys_ResetWarnOptions" title="PySys_ResetWarnOptions"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySys_ResetWarnOptions()</span></code></a>:
Clear <a class="reference internal" href="../library/sys.html#sys.warnoptions" title="sys.warnoptions"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.warnoptions</span></code></a> and <code class="xref py py-data docutils literal notranslate"><span class="pre">warnings.filters</span></code> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_GetExecPrefix" title="Py_GetExecPrefix"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_GetExecPrefix()</span></code></a>:
Get <a class="reference internal" href="../library/sys.html#sys.base_exec_prefix" title="sys.base_exec_prefix"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.base_exec_prefix</span></code></a> and <a class="reference internal" href="../library/sys.html#sys.exec_prefix" title="sys.exec_prefix"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.exec_prefix</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_GetPath" title="Py_GetPath"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_GetPath()</span></code></a>:
Get <a class="reference internal" href="../library/sys.html#sys.path" title="sys.path"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.path</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_GetPrefix" title="Py_GetPrefix"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_GetPrefix()</span></code></a>:
Get <a class="reference internal" href="../library/sys.html#sys.base_prefix" title="sys.base_prefix"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.base_prefix</span></code></a> and <a class="reference internal" href="../library/sys.html#sys.prefix" title="sys.prefix"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.prefix</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_GetProgramFullPath" title="Py_GetProgramFullPath"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_GetProgramFullPath()</span></code></a>:
Get <a class="reference internal" href="../library/sys.html#sys.executable" title="sys.executable"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.executable</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_GetProgramName" title="Py_GetProgramName"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_GetProgramName()</span></code></a>:
Get <a class="reference internal" href="../library/sys.html#sys.executable" title="sys.executable"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.executable</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.Py_GetPythonHome" title="Py_GetPythonHome"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_GetPythonHome()</span></code></a>:
Get <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.home" title="PyConfig.home"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.home</span></code></a>
or the <span class="target" id="index-51"></span><a class="reference internal" href="../using/cmdline.html#envvar-PYTHONHOME"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONHOME</span></code></a> environment variable instead.</p></li>
</ul>
</li>
</ul>
</section>
<section id="id9">
<h4>Pending Removal in Future Versions<a class="headerlink" href="#id9" title="Link to this heading"></a></h4>
<p>The following APIs are deprecated and will be removed,
although there is currently no date scheduled for their removal.</p>
<ul class="simple">
<li><p><a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_HAVE_FINALIZE" title="Py_TPFLAGS_HAVE_FINALIZE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_HAVE_FINALIZE</span></code></a>:
Unneeded since Python 3.8.</p></li>
<li><p><a class="reference internal" href="../c-api/exceptions.html#c.PyErr_Fetch" title="PyErr_Fetch"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Fetch()</span></code></a>:
Use <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_GetRaisedException" title="PyErr_GetRaisedException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_GetRaisedException()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/exceptions.html#c.PyErr_NormalizeException" title="PyErr_NormalizeException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_NormalizeException()</span></code></a>:
Use <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_GetRaisedException" title="PyErr_GetRaisedException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_GetRaisedException()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/exceptions.html#c.PyErr_Restore" title="PyErr_Restore"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Restore()</span></code></a>:
Use <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_SetRaisedException" title="PyErr_SetRaisedException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_SetRaisedException()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/module.html#c.PyModule_GetFilename" title="PyModule_GetFilename"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyModule_GetFilename()</span></code></a>:
Use <a class="reference internal" href="../c-api/module.html#c.PyModule_GetFilenameObject" title="PyModule_GetFilenameObject"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyModule_GetFilenameObject()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/sys.html#c.PyOS_AfterFork" title="PyOS_AfterFork"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyOS_AfterFork()</span></code></a>:
Use <a class="reference internal" href="../c-api/sys.html#c.PyOS_AfterFork_Child" title="PyOS_AfterFork_Child"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyOS_AfterFork_Child()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/slice.html#c.PySlice_GetIndicesEx" title="PySlice_GetIndicesEx"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySlice_GetIndicesEx()</span></code></a>:
Use <a class="reference internal" href="../c-api/slice.html#c.PySlice_Unpack" title="PySlice_Unpack"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySlice_Unpack()</span></code></a> and <a class="reference internal" href="../c-api/slice.html#c.PySlice_AdjustIndices" title="PySlice_AdjustIndices"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySlice_AdjustIndices()</span></code></a> instead.</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AsDecodedObject()</span></code>:
Use <a class="reference internal" href="../c-api/codec.html#c.PyCodec_Decode" title="PyCodec_Decode"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyCodec_Decode()</span></code></a> instead.</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AsDecodedUnicode()</span></code>:
Use <a class="reference internal" href="../c-api/codec.html#c.PyCodec_Decode" title="PyCodec_Decode"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyCodec_Decode()</span></code></a> instead.</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AsEncodedObject()</span></code>:
Use <a class="reference internal" href="../c-api/codec.html#c.PyCodec_Encode" title="PyCodec_Encode"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyCodec_Encode()</span></code></a> instead.</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AsEncodedUnicode()</span></code>:
Use <a class="reference internal" href="../c-api/codec.html#c.PyCodec_Encode" title="PyCodec_Encode"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyCodec_Encode()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_READY" title="PyUnicode_READY"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_READY()</span></code></a>:
Unneeded since Python 3.12</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Display()</span></code>:
Use <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_DisplayException" title="PyErr_DisplayException"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_DisplayException()</span></code></a> instead.</p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">_PyErr_ChainExceptions()</span></code>:
Use <code class="xref c c-func docutils literal notranslate"><span class="pre">_PyErr_ChainExceptions1()</span></code> instead.</p></li>
<li><p><code class="xref c c-member docutils literal notranslate"><span class="pre">PyBytesObject.ob_shash</span></code> member:
call <a class="reference internal" href="../c-api/object.html#c.PyObject_Hash" title="PyObject_Hash"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_Hash()</span></code></a> instead.</p></li>
<li><p><code class="xref c c-member docutils literal notranslate"><span class="pre">PyDictObject.ma_version_tag</span></code> member.</p></li>
<li><p>Thread Local Storage (TLS) API:</p>
<ul>
<li><p><a class="reference internal" href="../c-api/init.html#c.PyThread_create_key" title="PyThread_create_key"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_create_key()</span></code></a>:
Use <a class="reference internal" href="../c-api/init.html#c.PyThread_tss_alloc" title="PyThread_tss_alloc"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_tss_alloc()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.PyThread_delete_key" title="PyThread_delete_key"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_delete_key()</span></code></a>:
Use <a class="reference internal" href="../c-api/init.html#c.PyThread_tss_free" title="PyThread_tss_free"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_tss_free()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.PyThread_set_key_value" title="PyThread_set_key_value"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_set_key_value()</span></code></a>:
Use <a class="reference internal" href="../c-api/init.html#c.PyThread_tss_set" title="PyThread_tss_set"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_tss_set()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.PyThread_get_key_value" title="PyThread_get_key_value"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_get_key_value()</span></code></a>:
Use <a class="reference internal" href="../c-api/init.html#c.PyThread_tss_get" title="PyThread_tss_get"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_tss_get()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.PyThread_delete_key_value" title="PyThread_delete_key_value"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_delete_key_value()</span></code></a>:
Use <a class="reference internal" href="../c-api/init.html#c.PyThread_tss_delete" title="PyThread_tss_delete"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_tss_delete()</span></code></a> instead.</p></li>
<li><p><a class="reference internal" href="../c-api/init.html#c.PyThread_ReInitTLS" title="PyThread_ReInitTLS"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThread_ReInitTLS()</span></code></a>:
Unneeded since Python 3.7.</p></li>
</ul>
</li>
</ul>
</section>
</section>
<section id="id10">
<h3>Removed<a class="headerlink" href="#id10" title="Link to this heading"></a></h3>
<ul class="simple">
<li><p>Remove the <code class="file docutils literal notranslate"><span class="pre">token.h</span></code> header file. There was never any public tokenizer C
API. The <code class="file docutils literal notranslate"><span class="pre">token.h</span></code> header file was only designed to be used by Python
internals.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/92651">gh-92651</a>.)</p></li>
<li><p>Legacy Unicode APIs have been removed. See <span class="target" id="index-52"></span><a class="pep reference external" href="https://peps.python.org/pep-0623/"><strong>PEP 623</strong></a> for detail.</p>
<ul>
<li><p><code class="xref c c-macro docutils literal notranslate"><span class="pre">PyUnicode_WCHAR_KIND</span></code></p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AS_UNICODE()</span></code></p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AsUnicode()</span></code></p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AsUnicodeAndSize()</span></code></p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AS_DATA()</span></code></p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FromUnicode()</span></code></p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_GET_SIZE()</span></code></p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_GetSize()</span></code></p></li>
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_GET_DATA_SIZE()</span></code></p></li>
</ul>
</li>
<li><p>Remove the <code class="docutils literal notranslate"><span class="pre">PyUnicode_InternImmortal()</span></code> function macro.
(Contributed by Victor Stinner in <a class="reference external" href="https://github.com/python/cpython/issues/85858">gh-85858</a>.)</p></li>
</ul>
</section>
</section>
</section>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<div>
<h3><a href="../contents.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Whats New In Python 3.12</a><ul>
<li><a class="reference internal" href="#summary-release-highlights">Summary Release highlights</a></li>
<li><a class="reference internal" href="#new-features">New Features</a><ul>
<li><a class="reference internal" href="#pep-695-type-parameter-syntax">PEP 695: Type Parameter Syntax</a></li>
<li><a class="reference internal" href="#pep-701-syntactic-formalization-of-f-strings">PEP 701: Syntactic formalization of f-strings</a></li>
<li><a class="reference internal" href="#pep-684-a-per-interpreter-gil">PEP 684: A Per-Interpreter GIL</a></li>
<li><a class="reference internal" href="#pep-669-low-impact-monitoring-for-cpython">PEP 669: Low impact monitoring for CPython</a></li>
<li><a class="reference internal" href="#pep-688-making-the-buffer-protocol-accessible-in-python">PEP 688: Making the buffer protocol accessible in Python</a></li>
<li><a class="reference internal" href="#pep-709-comprehension-inlining">PEP 709: Comprehension inlining</a></li>
<li><a class="reference internal" href="#improved-error-messages">Improved Error Messages</a></li>
</ul>
</li>
<li><a class="reference internal" href="#new-features-related-to-type-hints">New Features Related to Type Hints</a><ul>
<li><a class="reference internal" href="#pep-692-using-typeddict-for-more-precise-kwargs-typing">PEP 692: Using <code class="docutils literal notranslate"><span class="pre">TypedDict</span></code> for more precise <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code> typing</a></li>
<li><a class="reference internal" href="#pep-698-override-decorator-for-static-typing">PEP 698: Override Decorator for Static Typing</a></li>
</ul>
</li>
<li><a class="reference internal" href="#other-language-changes">Other Language Changes</a></li>
<li><a class="reference internal" href="#new-modules">New Modules</a></li>
<li><a class="reference internal" href="#improved-modules">Improved Modules</a><ul>
<li><a class="reference internal" href="#array">array</a></li>
<li><a class="reference internal" href="#asyncio">asyncio</a></li>
<li><a class="reference internal" href="#calendar">calendar</a></li>
<li><a class="reference internal" href="#csv">csv</a></li>
<li><a class="reference internal" href="#dis">dis</a></li>
<li><a class="reference internal" href="#fractions">fractions</a></li>
<li><a class="reference internal" href="#importlib-resources">importlib.resources</a></li>
<li><a class="reference internal" href="#inspect">inspect</a></li>
<li><a class="reference internal" href="#itertools">itertools</a></li>
<li><a class="reference internal" href="#math">math</a></li>
<li><a class="reference internal" href="#os">os</a></li>
<li><a class="reference internal" href="#os-path">os.path</a></li>
<li><a class="reference internal" href="#pathlib">pathlib</a></li>
<li><a class="reference internal" href="#platform">platform</a></li>
<li><a class="reference internal" href="#pdb">pdb</a></li>
<li><a class="reference internal" href="#random">random</a></li>
<li><a class="reference internal" href="#shutil">shutil</a></li>
<li><a class="reference internal" href="#sqlite3">sqlite3</a></li>
<li><a class="reference internal" href="#statistics">statistics</a></li>
<li><a class="reference internal" href="#sys">sys</a></li>
<li><a class="reference internal" href="#tempfile">tempfile</a></li>
<li><a class="reference internal" href="#threading">threading</a></li>
<li><a class="reference internal" href="#tkinter">tkinter</a></li>
<li><a class="reference internal" href="#tokenize">tokenize</a></li>
<li><a class="reference internal" href="#types">types</a></li>
<li><a class="reference internal" href="#typing">typing</a></li>
<li><a class="reference internal" href="#unicodedata">unicodedata</a></li>
<li><a class="reference internal" href="#unittest">unittest</a></li>
<li><a class="reference internal" href="#uuid">uuid</a></li>
</ul>
</li>
<li><a class="reference internal" href="#optimizations">Optimizations</a></li>
<li><a class="reference internal" href="#cpython-bytecode-changes">CPython bytecode changes</a></li>
<li><a class="reference internal" href="#demos-and-tools">Demos and Tools</a></li>
<li><a class="reference internal" href="#deprecated">Deprecated</a><ul>
<li><a class="reference internal" href="#pending-removal-in-python-3-13">Pending Removal in Python 3.13</a></li>
<li><a class="reference internal" href="#pending-removal-in-python-3-14">Pending Removal in Python 3.14</a></li>
<li><a class="reference internal" href="#pending-removal-in-python-3-15">Pending Removal in Python 3.15</a></li>
<li><a class="reference internal" href="#pending-removal-in-python-3-16">Pending removal in Python 3.16</a></li>
<li><a class="reference internal" href="#pending-removal-in-future-versions">Pending Removal in Future Versions</a></li>
</ul>
</li>
<li><a class="reference internal" href="#removed">Removed</a><ul>
<li><a class="reference internal" href="#asynchat-and-asyncore">asynchat and asyncore</a></li>
<li><a class="reference internal" href="#configparser">configparser</a></li>
<li><a class="reference internal" href="#distutils">distutils</a></li>
<li><a class="reference internal" href="#ensurepip">ensurepip</a></li>
<li><a class="reference internal" href="#enum">enum</a></li>
<li><a class="reference internal" href="#ftplib">ftplib</a></li>
<li><a class="reference internal" href="#gzip">gzip</a></li>
<li><a class="reference internal" href="#hashlib">hashlib</a></li>
<li><a class="reference internal" href="#importlib">importlib</a></li>
<li><a class="reference internal" href="#imp">imp</a></li>
<li><a class="reference internal" href="#io">io</a></li>
<li><a class="reference internal" href="#locale">locale</a></li>
<li><a class="reference internal" href="#smtpd">smtpd</a></li>
<li><a class="reference internal" href="#id2">sqlite3</a></li>
<li><a class="reference internal" href="#ssl">ssl</a></li>
<li><a class="reference internal" href="#id3">unittest</a></li>
<li><a class="reference internal" href="#webbrowser">webbrowser</a></li>
<li><a class="reference internal" href="#xml-etree-elementtree">xml.etree.ElementTree</a></li>
<li><a class="reference internal" href="#zipimport">zipimport</a></li>
<li><a class="reference internal" href="#others">Others</a></li>
</ul>
</li>
<li><a class="reference internal" href="#porting-to-python-3-12">Porting to Python 3.12</a><ul>
<li><a class="reference internal" href="#changes-in-the-python-api">Changes in the Python API</a></li>
</ul>
</li>
<li><a class="reference internal" href="#build-changes">Build Changes</a></li>
<li><a class="reference internal" href="#c-api-changes">C API Changes</a><ul>
<li><a class="reference internal" href="#id4">New Features</a></li>
<li><a class="reference internal" href="#id5">Porting to Python 3.12</a></li>
<li><a class="reference internal" href="#id6">Deprecated</a><ul>
<li><a class="reference internal" href="#id7">Pending Removal in Python 3.14</a></li>
<li><a class="reference internal" href="#id8">Pending Removal in Python 3.15</a></li>
<li><a class="reference internal" href="#id9">Pending Removal in Future Versions</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id10">Removed</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div>
<h4>Previous topic</h4>
<p class="topless"><a href="3.13.html"
title="previous chapter">Whats New In Python 3.13</a></p>
</div>
<div>
<h4>Next topic</h4>
<p class="topless"><a href="3.11.html"
title="next chapter">Whats New In Python 3.11</a></p>
</div>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">Report a Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/main/Doc/whatsnew/3.12.rst"
rel="nofollow">Show Source
</a>
</li>
</ul>
</div>
</div>
<div id="sidebarbutton" title="Collapse sidebar">
<span>«</span>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="Related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="3.11.html" title="Whats New In Python 3.11"
>next</a> |</li>
<li class="right" >
<a href="3.13.html" title="Whats New In Python 3.13"
>previous</a> |</li>
<li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.13.3 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Whats New in Python</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">Whats New In Python 3.12</a></li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
<input type="submit" value="Go" />
</form>
</div>
|
</li>
<li class="right">
<label class="theme-selector-label">
Theme
<select class="theme-selector" oninput="activateTheme(this.value)">
<option value="auto" selected>Auto</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label> |</li>
</ul>
</div>
<div class="footer">
&copy;
<a href="../copyright.html">
Copyright
</a>
2001-2025, Python Software Foundation.
<br />
This page is licensed under the Python Software Foundation License Version 2.
<br />
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
<br />
See <a href="/license.html">History and License</a> for more information.<br />
<br />
The Python Software Foundation is a non-profit corporation.
<a href="https://www.python.org/psf/donations/">Please donate.</a>
<br />
<br />
Last updated on Apr 08, 2025 (14:33 UTC).
<a href="/bugs.html">Found a bug</a>?
<br />
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>