1870 lines
216 KiB
HTML
1870 lines
216 KiB
HTML
<!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="What’s New In Python 3.9" />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:url" content="https://docs.python.org/3/whatsnew/3.9.html" />
|
||
<meta property="og:site_name" content="Python documentation" />
|
||
<meta property="og:description" content="Editor, Łukasz Langa,. This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog. Summary – Release high..." />
|
||
<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, Łukasz Langa,. This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog. Summary – Release high..." />
|
||
<meta property="og:image:width" content="200">
|
||
<meta property="og:image:height" content="200">
|
||
<meta name="theme-color" content="#3776ab">
|
||
|
||
<title>What’s New In Python 3.9 — 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="What’s New In Python 3.8" href="3.8.html" />
|
||
<link rel="prev" title="What’s New In Python 3.10" href="3.10.html" />
|
||
|
||
<link rel="canonical" href="https://docs.python.org/3/whatsnew/3.9.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="#">What’s New In Python 3.9</a><ul>
|
||
<li><a class="reference internal" href="#summary-release-highlights">Summary – Release highlights</a></li>
|
||
<li><a class="reference internal" href="#you-should-check-for-deprecationwarning-in-your-code">You should check for DeprecationWarning in your code</a></li>
|
||
<li><a class="reference internal" href="#new-features">New Features</a><ul>
|
||
<li><a class="reference internal" href="#dictionary-merge-update-operators">Dictionary Merge & Update Operators</a></li>
|
||
<li><a class="reference internal" href="#new-string-methods-to-remove-prefixes-and-suffixes">New String Methods to Remove Prefixes and Suffixes</a></li>
|
||
<li><a class="reference internal" href="#type-hinting-generics-in-standard-collections">Type Hinting Generics in Standard Collections</a></li>
|
||
<li><a class="reference internal" href="#new-parser">New Parser</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><ul>
|
||
<li><a class="reference internal" href="#zoneinfo">zoneinfo</a></li>
|
||
<li><a class="reference internal" href="#graphlib">graphlib</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#improved-modules">Improved Modules</a><ul>
|
||
<li><a class="reference internal" href="#ast">ast</a></li>
|
||
<li><a class="reference internal" href="#asyncio">asyncio</a></li>
|
||
<li><a class="reference internal" href="#compileall">compileall</a></li>
|
||
<li><a class="reference internal" href="#concurrent-futures">concurrent.futures</a></li>
|
||
<li><a class="reference internal" href="#curses">curses</a></li>
|
||
<li><a class="reference internal" href="#datetime">datetime</a></li>
|
||
<li><a class="reference internal" href="#distutils">distutils</a></li>
|
||
<li><a class="reference internal" href="#fcntl">fcntl</a></li>
|
||
<li><a class="reference internal" href="#ftplib">ftplib</a></li>
|
||
<li><a class="reference internal" href="#gc">gc</a></li>
|
||
<li><a class="reference internal" href="#hashlib">hashlib</a></li>
|
||
<li><a class="reference internal" href="#http">http</a></li>
|
||
<li><a class="reference internal" href="#idle-and-idlelib">IDLE and idlelib</a></li>
|
||
<li><a class="reference internal" href="#imaplib">imaplib</a></li>
|
||
<li><a class="reference internal" href="#importlib">importlib</a></li>
|
||
<li><a class="reference internal" href="#inspect">inspect</a></li>
|
||
<li><a class="reference internal" href="#ipaddress">ipaddress</a></li>
|
||
<li><a class="reference internal" href="#math">math</a></li>
|
||
<li><a class="reference internal" href="#multiprocessing">multiprocessing</a></li>
|
||
<li><a class="reference internal" href="#nntplib">nntplib</a></li>
|
||
<li><a class="reference internal" href="#os">os</a></li>
|
||
<li><a class="reference internal" href="#pathlib">pathlib</a></li>
|
||
<li><a class="reference internal" href="#pdb">pdb</a></li>
|
||
<li><a class="reference internal" href="#poplib">poplib</a></li>
|
||
<li><a class="reference internal" href="#pprint">pprint</a></li>
|
||
<li><a class="reference internal" href="#pydoc">pydoc</a></li>
|
||
<li><a class="reference internal" href="#random">random</a></li>
|
||
<li><a class="reference internal" href="#signal">signal</a></li>
|
||
<li><a class="reference internal" href="#smtplib">smtplib</a></li>
|
||
<li><a class="reference internal" href="#socket">socket</a></li>
|
||
<li><a class="reference internal" href="#time">time</a></li>
|
||
<li><a class="reference internal" href="#sys">sys</a></li>
|
||
<li><a class="reference internal" href="#tracemalloc">tracemalloc</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="#venv">venv</a></li>
|
||
<li><a class="reference internal" href="#xml">xml</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#optimizations">Optimizations</a></li>
|
||
<li><a class="reference internal" href="#deprecated">Deprecated</a></li>
|
||
<li><a class="reference internal" href="#removed">Removed</a></li>
|
||
<li><a class="reference internal" href="#porting-to-python-3-9">Porting to Python 3.9</a><ul>
|
||
<li><a class="reference internal" href="#changes-in-the-python-api">Changes in the Python API</a></li>
|
||
<li><a class="reference internal" href="#changes-in-the-c-api">Changes in the C API</a></li>
|
||
<li><a class="reference internal" href="#cpython-bytecode-changes">CPython bytecode changes</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="#id1">New Features</a></li>
|
||
<li><a class="reference internal" href="#id2">Porting to Python 3.9</a></li>
|
||
<li><a class="reference internal" href="#id3">Removed</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#notable-changes-in-python-3-9-1">Notable changes in Python 3.9.1</a><ul>
|
||
<li><a class="reference internal" href="#id4">typing</a></li>
|
||
<li><a class="reference internal" href="#macos-11-0-big-sur-and-apple-silicon-mac-support">macOS 11.0 (Big Sur) and Apple Silicon Mac support</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#notable-changes-in-python-3-9-2">Notable changes in Python 3.9.2</a><ul>
|
||
<li><a class="reference internal" href="#collections-abc">collections.abc</a></li>
|
||
<li><a class="reference internal" href="#urllib-parse">urllib.parse</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#notable-changes-in-python-3-9-3">Notable changes in Python 3.9.3</a></li>
|
||
<li><a class="reference internal" href="#notable-changes-in-python-3-9-5">Notable changes in Python 3.9.5</a><ul>
|
||
<li><a class="reference internal" href="#id5">urllib.parse</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#notable-security-feature-in-3-9-14">Notable security feature in 3.9.14</a></li>
|
||
<li><a class="reference internal" href="#notable-changes-in-3-9-17">Notable changes in 3.9.17</a><ul>
|
||
<li><a class="reference internal" href="#tarfile">tarfile</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
</div>
|
||
<div>
|
||
<h4>Previous topic</h4>
|
||
<p class="topless"><a href="3.10.html"
|
||
title="previous chapter">What’s New In Python 3.10</a></p>
|
||
</div>
|
||
<div>
|
||
<h4>Next topic</h4>
|
||
<p class="topless"><a href="3.8.html"
|
||
title="next chapter">What’s New In Python 3.8</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.9.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.8.html" title="What’s New In Python 3.8"
|
||
accesskey="N">next</a> |</li>
|
||
<li class="right" >
|
||
<a href="3.10.html" title="What’s New In Python 3.10"
|
||
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> »</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> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">What’s New in Python</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">What’s New In Python 3.9</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-9">
|
||
<h1>What’s New In Python 3.9<a class="headerlink" href="#what-s-new-in-python-3-9" 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>Łukasz Langa</p>
|
||
</dd>
|
||
</dl>
|
||
<p>This article explains the new features in Python 3.9, compared to 3.8.
|
||
Python 3.9 was released on October 5, 2020.
|
||
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-0596/"><strong>PEP 596</strong></a> - Python 3.9 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>New syntax features:</p>
|
||
<ul class="simple">
|
||
<li><p><span class="target" id="index-1"></span><a class="pep reference external" href="https://peps.python.org/pep-0584/"><strong>PEP 584</strong></a>, union operators added to <code class="docutils literal notranslate"><span class="pre">dict</span></code>;</p></li>
|
||
<li><p><span class="target" id="index-2"></span><a class="pep reference external" href="https://peps.python.org/pep-0585/"><strong>PEP 585</strong></a>, type hinting generics in standard collections;</p></li>
|
||
<li><p><span class="target" id="index-3"></span><a class="pep reference external" href="https://peps.python.org/pep-0614/"><strong>PEP 614</strong></a>, relaxed grammar restrictions on decorators.</p></li>
|
||
</ul>
|
||
<p>New built-in features:</p>
|
||
<ul class="simple">
|
||
<li><p><span class="target" id="index-4"></span><a class="pep reference external" href="https://peps.python.org/pep-0616/"><strong>PEP 616</strong></a>, string methods to remove prefixes and suffixes.</p></li>
|
||
</ul>
|
||
<p>New features in the standard library:</p>
|
||
<ul class="simple">
|
||
<li><p><span class="target" id="index-5"></span><a class="pep reference external" href="https://peps.python.org/pep-0593/"><strong>PEP 593</strong></a>, flexible function and variable annotations;</p></li>
|
||
<li><p><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> added that allows process management without races
|
||
and signals.</p></li>
|
||
</ul>
|
||
<p>Interpreter improvements:</p>
|
||
<ul class="simple">
|
||
<li><p><span class="target" id="index-6"></span><a class="pep reference external" href="https://peps.python.org/pep-0573/"><strong>PEP 573</strong></a>, fast access to module state from methods of C extension
|
||
types;</p></li>
|
||
<li><p><span class="target" id="index-7"></span><a class="pep reference external" href="https://peps.python.org/pep-0617/"><strong>PEP 617</strong></a>, CPython now uses a new parser based on PEG;</p></li>
|
||
<li><p>a number of Python builtins (range, tuple, set, frozenset, list, dict) are
|
||
now sped up using <span class="target" id="index-8"></span><a class="pep reference external" href="https://peps.python.org/pep-0590/"><strong>PEP 590</strong></a> vectorcall;</p></li>
|
||
<li><p>garbage collection does not block on resurrected objects;</p></li>
|
||
<li><p>a number of Python modules (<code class="xref py py-mod docutils literal notranslate"><span class="pre">_abc</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">audioop</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">_bz2</span></code>,
|
||
<code class="xref py py-mod docutils literal notranslate"><span class="pre">_codecs</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">_contextvars</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">_crypt</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">_functools</span></code>,
|
||
<code class="xref py py-mod docutils literal notranslate"><span class="pre">_json</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">_locale</span></code>, <a class="reference internal" href="../library/math.html#module-math" title="math: Mathematical functions (sin() etc.)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">math</span></code></a>, <a class="reference internal" href="../library/operator.html#module-operator" title="operator: Functions corresponding to the standard operators."><code class="xref py py-mod docutils literal notranslate"><span class="pre">operator</span></code></a>, <a class="reference internal" href="../library/resource.html#module-resource" title="resource: An interface to provide resource usage information on the current process. (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">resource</span></code></a>,
|
||
<a class="reference internal" href="../library/time.html#module-time" title="time: Time access and conversions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">time</span></code></a>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">_weakref</span></code>) now use multiphase initialization as defined
|
||
by PEP 489;</p></li>
|
||
<li><p>a number of standard library modules (<code class="xref py py-mod docutils literal notranslate"><span class="pre">audioop</span></code>, <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>, <a class="reference internal" href="../library/grp.html#module-grp" title="grp: The group database (getgrnam() and friends). (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">grp</span></code></a>,
|
||
<code class="xref py py-mod docutils literal notranslate"><span class="pre">_hashlib</span></code>, <a class="reference internal" href="../library/pwd.html#module-pwd" title="pwd: The password database (getpwnam() and friends). (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">pwd</span></code></a>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">_posixsubprocess</span></code>, <a class="reference internal" href="../library/random.html#module-random" title="random: Generate pseudo-random numbers with various common distributions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">random</span></code></a>,
|
||
<a class="reference internal" href="../library/select.html#module-select" title="select: Wait for I/O completion on multiple streams."><code class="xref py py-mod docutils literal notranslate"><span class="pre">select</span></code></a>, <a class="reference internal" href="../library/struct.html#module-struct" title="struct: Interpret bytes as packed binary data."><code class="xref py py-mod docutils literal notranslate"><span class="pre">struct</span></code></a>, <a class="reference internal" href="../library/termios.html#module-termios" title="termios: POSIX style tty control. (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">termios</span></code></a>, <a class="reference internal" href="../library/zlib.html#module-zlib" title="zlib: Low-level interface to compression and decompression routines compatible with gzip."><code class="xref py py-mod docutils literal notranslate"><span class="pre">zlib</span></code></a>) are now using
|
||
the stable ABI defined by PEP 384.</p></li>
|
||
</ul>
|
||
<p>New library modules:</p>
|
||
<ul class="simple">
|
||
<li><p><span class="target" id="index-9"></span><a class="pep reference external" href="https://peps.python.org/pep-0615/"><strong>PEP 615</strong></a>, the IANA Time Zone Database is now present in the standard
|
||
library in the <a class="reference internal" href="../library/zoneinfo.html#module-zoneinfo" title="zoneinfo: IANA time zone support"><code class="xref py py-mod docutils literal notranslate"><span class="pre">zoneinfo</span></code></a> module;</p></li>
|
||
<li><p>an implementation of a topological sort of a graph is now provided in
|
||
the new <a class="reference internal" href="../library/graphlib.html#module-graphlib" title="graphlib: Functionality to operate with graph-like structures"><code class="xref py py-mod docutils literal notranslate"><span class="pre">graphlib</span></code></a> module.</p></li>
|
||
</ul>
|
||
<p>Release process changes:</p>
|
||
<ul class="simple">
|
||
<li><p><span class="target" id="index-10"></span><a class="pep reference external" href="https://peps.python.org/pep-0602/"><strong>PEP 602</strong></a>, CPython adopts an annual release cycle.</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="you-should-check-for-deprecationwarning-in-your-code">
|
||
<h2>You should check for DeprecationWarning in your code<a class="headerlink" href="#you-should-check-for-deprecationwarning-in-your-code" title="Link to this heading">¶</a></h2>
|
||
<p>When Python 2.7 was still supported, a lot of functionality in Python 3
|
||
was kept for backward compatibility with Python 2.7. With the end of Python
|
||
2 support, these backward compatibility layers have been removed, or will
|
||
be removed soon. Most of them emitted 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> warning for
|
||
several years. For example, using <code class="docutils literal notranslate"><span class="pre">collections.Mapping</span></code> instead of
|
||
<code class="docutils literal notranslate"><span class="pre">collections.abc.Mapping</span></code> 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> since Python
|
||
3.3, released in 2012.</p>
|
||
<p>Test your application with the <a class="reference internal" href="../using/cmdline.html#cmdoption-W"><code class="xref std std-option docutils literal notranslate"><span class="pre">-W</span></code></a> <code class="docutils literal notranslate"><span class="pre">default</span></code> command-line option to see
|
||
<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> and <a class="reference internal" href="../library/exceptions.html#PendingDeprecationWarning" title="PendingDeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">PendingDeprecationWarning</span></code></a>, or even with
|
||
<a class="reference internal" href="../using/cmdline.html#cmdoption-W"><code class="xref std std-option docutils literal notranslate"><span class="pre">-W</span></code></a> <code class="docutils literal notranslate"><span class="pre">error</span></code> to treat them as errors. <a class="reference internal" href="../library/warnings.html#warning-filter"><span class="std std-ref">Warnings Filter</span></a> can be used to ignore warnings from third-party code.</p>
|
||
<p>Python 3.9 is the last version providing those Python 2 backward compatibility
|
||
layers, to give more time to Python projects maintainers to organize the
|
||
removal of the Python 2 support and add support for Python 3.9.</p>
|
||
<p>Aliases to <a class="reference internal" href="../library/collections.abc.html#collections-abstract-base-classes"><span class="std std-ref">Abstract Base Classes</span></a> in
|
||
the <a class="reference internal" href="../library/collections.html#module-collections" title="collections: Container datatypes"><code class="xref py py-mod docutils literal notranslate"><span class="pre">collections</span></code></a> module, like <code class="docutils literal notranslate"><span class="pre">collections.Mapping</span></code> alias to
|
||
<a class="reference internal" href="../library/collections.abc.html#collections.abc.Mapping" title="collections.abc.Mapping"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Mapping</span></code></a>, are kept for one last release for backward
|
||
compatibility. They will be removed from Python 3.10.</p>
|
||
<p>More generally, try to run your tests in the <a class="reference internal" href="../library/devmode.html#devmode"><span class="std std-ref">Python Development Mode</span></a> which helps to prepare your code to make it compatible with the
|
||
next Python version.</p>
|
||
<p>Note: a number of pre-existing deprecations were removed in this version of
|
||
Python as well. Consult the <a class="reference internal" href="#removed-in-python-39"><span class="std std-ref">Removed</span></a> section.</p>
|
||
</section>
|
||
<section id="new-features">
|
||
<h2>New Features<a class="headerlink" href="#new-features" title="Link to this heading">¶</a></h2>
|
||
<section id="dictionary-merge-update-operators">
|
||
<h3>Dictionary Merge & Update Operators<a class="headerlink" href="#dictionary-merge-update-operators" title="Link to this heading">¶</a></h3>
|
||
<p>Merge (<code class="docutils literal notranslate"><span class="pre">|</span></code>) and update (<code class="docutils literal notranslate"><span class="pre">|=</span></code>) operators have been added to the built-in
|
||
<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> class. Those complement the existing <code class="docutils literal notranslate"><span class="pre">dict.update</span></code> and
|
||
<code class="docutils literal notranslate"><span class="pre">{**d1,</span> <span class="pre">**d2}</span></code> methods of merging dictionaries.</p>
|
||
<p>Example:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">x</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"key1"</span><span class="p">:</span> <span class="s2">"value1 from x"</span><span class="p">,</span> <span class="s2">"key2"</span><span class="p">:</span> <span class="s2">"value2 from x"</span><span class="p">}</span>
|
||
<span class="gp">>>> </span><span class="n">y</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"key2"</span><span class="p">:</span> <span class="s2">"value2 from y"</span><span class="p">,</span> <span class="s2">"key3"</span><span class="p">:</span> <span class="s2">"value3 from y"</span><span class="p">}</span>
|
||
<span class="gp">>>> </span><span class="n">x</span> <span class="o">|</span> <span class="n">y</span>
|
||
<span class="go">{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}</span>
|
||
<span class="gp">>>> </span><span class="n">y</span> <span class="o">|</span> <span class="n">x</span>
|
||
<span class="go">{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>See <span class="target" id="index-11"></span><a class="pep reference external" href="https://peps.python.org/pep-0584/"><strong>PEP 584</strong></a> for a full description.
|
||
(Contributed by Brandt Bucher in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36144">bpo-36144</a>.)</p>
|
||
</section>
|
||
<section id="new-string-methods-to-remove-prefixes-and-suffixes">
|
||
<h3>New String Methods to Remove Prefixes and Suffixes<a class="headerlink" href="#new-string-methods-to-remove-prefixes-and-suffixes" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/stdtypes.html#str.removeprefix" title="str.removeprefix"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.removeprefix(prefix)</span></code></a> and
|
||
<a class="reference internal" href="../library/stdtypes.html#str.removesuffix" title="str.removesuffix"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.removesuffix(suffix)</span></code></a> have been added
|
||
to easily remove an unneeded prefix or a suffix from a string. Corresponding
|
||
<code class="docutils literal notranslate"><span class="pre">bytes</span></code>, <code class="docutils literal notranslate"><span class="pre">bytearray</span></code>, and <code class="docutils literal notranslate"><span class="pre">collections.UserString</span></code> methods have also been
|
||
added. See <span class="target" id="index-12"></span><a class="pep reference external" href="https://peps.python.org/pep-0616/"><strong>PEP 616</strong></a> for a full description. (Contributed by Dennis Sweeney in
|
||
<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39939">bpo-39939</a>.)</p>
|
||
</section>
|
||
<section id="type-hinting-generics-in-standard-collections">
|
||
<h3>Type Hinting Generics in Standard Collections<a class="headerlink" href="#type-hinting-generics-in-standard-collections" title="Link to this heading">¶</a></h3>
|
||
<p>In type annotations you can now use built-in collection types such as
|
||
<code class="docutils literal notranslate"><span class="pre">list</span></code> and <code class="docutils literal notranslate"><span class="pre">dict</span></code> as generic types instead of importing the
|
||
corresponding capitalized types (e.g. <code class="docutils literal notranslate"><span class="pre">List</span></code> or <code class="docutils literal notranslate"><span class="pre">Dict</span></code>) from
|
||
<code class="docutils literal notranslate"><span class="pre">typing</span></code>. Some other types in the standard library are also now generic,
|
||
for example <code class="docutils literal notranslate"><span class="pre">queue.Queue</span></code>.</p>
|
||
<p>Example:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">greet_all</span><span class="p">(</span><span class="n">names</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Hello"</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>See <span class="target" id="index-13"></span><a class="pep reference external" href="https://peps.python.org/pep-0585/"><strong>PEP 585</strong></a> for more details. (Contributed by Guido van Rossum,
|
||
Ethan Smith, and Batuhan Taşkaya in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39481">bpo-39481</a>.)</p>
|
||
</section>
|
||
<section id="new-parser">
|
||
<h3>New Parser<a class="headerlink" href="#new-parser" title="Link to this heading">¶</a></h3>
|
||
<p>Python 3.9 uses a new parser, based on <a class="reference external" href="https://en.wikipedia.org/wiki/Parsing_expression_grammar">PEG</a> instead
|
||
of <a class="reference external" href="https://en.wikipedia.org/wiki/LL_parser">LL(1)</a>. The new
|
||
parser’s performance is roughly comparable to that of the old parser,
|
||
but the PEG formalism is more flexible than LL(1) when it comes to
|
||
designing new language features. We’ll start using this flexibility
|
||
in Python 3.10 and later.</p>
|
||
<p>The <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> module uses the new parser and produces the same AST as
|
||
the old parser.</p>
|
||
<p>In Python 3.10, the old parser will be deleted and so will all
|
||
functionality that depends on it (primarily the <code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code> module,
|
||
which has long been deprecated). In Python 3.9 <em>only</em>, you can switch
|
||
back to the LL(1) parser using a command line switch (<code class="docutils literal notranslate"><span class="pre">-X</span>
|
||
<span class="pre">oldparser</span></code>) or an environment variable (<code class="docutils literal notranslate"><span class="pre">PYTHONOLDPARSER=1</span></code>).</p>
|
||
<p>See <span class="target" id="index-14"></span><a class="pep reference external" href="https://peps.python.org/pep-0617/"><strong>PEP 617</strong></a> for more details. (Contributed by Guido van Rossum,
|
||
Pablo Galindo and Lysandros Nikolaou in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40334">bpo-40334</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>
|
||
<li><p><a class="reference internal" href="../library/functions.html#import__" title="__import__"><code class="xref py py-func docutils literal notranslate"><span class="pre">__import__()</span></code></a> now raises <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> 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>, which used to occur when a relative import went past
|
||
its top-level package.
|
||
(Contributed by Ngalim Siregar in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37444">bpo-37444</a>.)</p></li>
|
||
<li><p>Python now gets the absolute path of the script filename specified on
|
||
the command line (ex: <code class="docutils literal notranslate"><span class="pre">python3</span> <span class="pre">script.py</span></code>): the <code class="docutils literal notranslate"><span class="pre">__file__</span></code> attribute of
|
||
the <a class="reference internal" href="../library/__main__.html#module-__main__" title="__main__: The environment where top-level code is run. Covers command-line interfaces, import-time behavior, and ``__name__ == '__main__'``."><code class="xref py py-mod docutils literal notranslate"><span class="pre">__main__</span></code></a> module became an absolute path, rather than a relative
|
||
path. These paths now remain valid after the current directory is changed
|
||
by <a class="reference internal" href="../library/os.html#os.chdir" title="os.chdir"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.chdir()</span></code></a>. As a side effect, the traceback also displays the
|
||
absolute path for <a class="reference internal" href="../library/__main__.html#module-__main__" title="__main__: The environment where top-level code is run. Covers command-line interfaces, import-time behavior, and ``__name__ == '__main__'``."><code class="xref py py-mod docutils literal notranslate"><span class="pre">__main__</span></code></a> module frames in this case.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=20443">bpo-20443</a>.)</p></li>
|
||
<li><p>In the <a class="reference internal" href="../library/devmode.html#devmode"><span class="std std-ref">Python Development Mode</span></a> and in <a class="reference internal" href="../using/configure.html#debug-build"><span class="std std-ref">debug build</span></a>, the
|
||
<em>encoding</em> and <em>errors</em> arguments are now checked for string encoding and
|
||
decoding operations. Examples: <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/stdtypes.html#str.encode" title="str.encode"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.encode()</span></code></a> and
|
||
<a class="reference internal" href="../library/stdtypes.html#bytes.decode" title="bytes.decode"><code class="xref py py-meth docutils literal notranslate"><span class="pre">bytes.decode()</span></code></a>.</p>
|
||
<p>By default, for best performance, the <em>errors</em> argument is only checked at
|
||
the first encoding/decoding error and the <em>encoding</em> argument is sometimes
|
||
ignored for empty strings.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37388">bpo-37388</a>.)</p>
|
||
</li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">"".replace("",</span> <span class="pre">s,</span> <span class="pre">n)</span></code> now returns <code class="docutils literal notranslate"><span class="pre">s</span></code> instead of an empty string for
|
||
all non-zero <code class="docutils literal notranslate"><span class="pre">n</span></code>. It is now consistent with <code class="docutils literal notranslate"><span class="pre">"".replace("",</span> <span class="pre">s)</span></code>.
|
||
There are similar changes for <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> and <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> objects.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=28029">bpo-28029</a>.)</p></li>
|
||
<li><p>Any valid expression can now be used as a <a class="reference internal" href="../glossary.html#term-decorator"><span class="xref std std-term">decorator</span></a>. Previously, the
|
||
grammar was much more restrictive. See <span class="target" id="index-15"></span><a class="pep reference external" href="https://peps.python.org/pep-0614/"><strong>PEP 614</strong></a> for details.
|
||
(Contributed by Brandt Bucher in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39702">bpo-39702</a>.)</p></li>
|
||
<li><p>Improved help for 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. Docstrings are now shown for
|
||
all special forms and special generic aliases (like <code class="docutils literal notranslate"><span class="pre">Union</span></code> and <code class="docutils literal notranslate"><span class="pre">List</span></code>).
|
||
Using <a class="reference internal" href="../library/functions.html#help" title="help"><code class="xref py py-func docutils literal notranslate"><span class="pre">help()</span></code></a> with generic alias like <code class="docutils literal notranslate"><span class="pre">List[int]</span></code> will show the help
|
||
for the correspondent concrete type (<code class="docutils literal notranslate"><span class="pre">list</span></code> in this case).
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40257">bpo-40257</a>.)</p></li>
|
||
<li><p>Parallel running of <a class="reference internal" href="../reference/expressions.html#agen.aclose" title="agen.aclose"><code class="xref py py-meth docutils literal notranslate"><span class="pre">aclose()</span></code></a> / <a class="reference internal" href="../reference/expressions.html#agen.asend" title="agen.asend"><code class="xref py py-meth docutils literal notranslate"><span class="pre">asend()</span></code></a> /
|
||
<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">athrow()</span></code></a> is now prohibited, and <code class="docutils literal notranslate"><span class="pre">ag_running</span></code> now reflects
|
||
the actual running status of the async generator.
|
||
(Contributed by Yury Selivanov in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=30773">bpo-30773</a>.)</p></li>
|
||
<li><p>Unexpected errors in calling the <code class="docutils literal notranslate"><span class="pre">__iter__</span></code> method are no longer masked by
|
||
<code class="docutils literal notranslate"><span class="pre">TypeError</span></code> in the <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> operator and functions
|
||
<a class="reference internal" href="../library/operator.html#operator.contains" title="operator.contains"><code class="xref py py-func docutils literal notranslate"><span class="pre">contains()</span></code></a>, <a class="reference internal" href="../library/operator.html#operator.indexOf" title="operator.indexOf"><code class="xref py py-func docutils literal notranslate"><span class="pre">indexOf()</span></code></a> and
|
||
<a class="reference internal" href="../library/operator.html#operator.countOf" title="operator.countOf"><code class="xref py py-func docutils literal notranslate"><span class="pre">countOf()</span></code></a> of the <a class="reference internal" href="../library/operator.html#module-operator" title="operator: Functions corresponding to the standard operators."><code class="xref py py-mod docutils literal notranslate"><span class="pre">operator</span></code></a> module.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40824">bpo-40824</a>.)</p></li>
|
||
<li><p>Unparenthesized lambda expressions can no longer be the expression part in an
|
||
<code class="docutils literal notranslate"><span class="pre">if</span></code> clause in comprehensions and generator expressions. See <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=41848">bpo-41848</a>
|
||
and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=43755">bpo-43755</a> for details.</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="new-modules">
|
||
<h2>New Modules<a class="headerlink" href="#new-modules" title="Link to this heading">¶</a></h2>
|
||
<section id="zoneinfo">
|
||
<h3>zoneinfo<a class="headerlink" href="#zoneinfo" title="Link to this heading">¶</a></h3>
|
||
<p>The <a class="reference internal" href="../library/zoneinfo.html#module-zoneinfo" title="zoneinfo: IANA time zone support"><code class="xref py py-mod docutils literal notranslate"><span class="pre">zoneinfo</span></code></a> module brings support for the IANA time zone database to
|
||
the standard library. It adds <a class="reference internal" href="../library/zoneinfo.html#zoneinfo.ZoneInfo" title="zoneinfo.ZoneInfo"><code class="xref py py-class docutils literal notranslate"><span class="pre">zoneinfo.ZoneInfo</span></code></a>, a concrete
|
||
<a class="reference internal" href="../library/datetime.html#datetime.tzinfo" title="datetime.tzinfo"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.tzinfo</span></code></a> implementation backed by the system’s time zone data.</p>
|
||
<p>Example:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span><span class="w"> </span><span class="nn">zoneinfo</span><span class="w"> </span><span class="kn">import</span> <span class="n">ZoneInfo</span>
|
||
<span class="gp">>>> </span><span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
|
||
|
||
<span class="gp">>>> </span><span class="c1"># Daylight saving time</span>
|
||
<span class="gp">>>> </span><span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2020</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="n">ZoneInfo</span><span class="p">(</span><span class="s2">"America/Los_Angeles"</span><span class="p">))</span>
|
||
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
|
||
<span class="go">2020-10-31 12:00:00-07:00</span>
|
||
<span class="gp">>>> </span><span class="n">dt</span><span class="o">.</span><span class="n">tzname</span><span class="p">()</span>
|
||
<span class="go">'PDT'</span>
|
||
|
||
<span class="gp">>>> </span><span class="c1"># Standard time</span>
|
||
<span class="gp">>>> </span><span class="n">dt</span> <span class="o">+=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">7</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
|
||
<span class="go">2020-11-07 12:00:00-08:00</span>
|
||
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">dt</span><span class="o">.</span><span class="n">tzname</span><span class="p">())</span>
|
||
<span class="go">PST</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>As a fall-back source of data for platforms that don’t ship the IANA database,
|
||
the <a class="extlink-pypi reference external" href="https://pypi.org/project/tzdata/">tzdata</a> module was released as a first-party package – distributed via
|
||
PyPI and maintained by the CPython core team.</p>
|
||
<div class="admonition seealso">
|
||
<p class="admonition-title">See also</p>
|
||
<dl class="simple">
|
||
<dt><span class="target" id="index-16"></span><a class="pep reference external" href="https://peps.python.org/pep-0615/"><strong>PEP 615</strong></a> – Support for the IANA Time Zone Database in the Standard Library</dt><dd><p>PEP written and implemented by Paul Ganssle</p>
|
||
</dd>
|
||
</dl>
|
||
</div>
|
||
</section>
|
||
<section id="graphlib">
|
||
<h3>graphlib<a class="headerlink" href="#graphlib" title="Link to this heading">¶</a></h3>
|
||
<p>A new module, <a class="reference internal" href="../library/graphlib.html#module-graphlib" title="graphlib: Functionality to operate with graph-like structures"><code class="xref py py-mod docutils literal notranslate"><span class="pre">graphlib</span></code></a>, was added that contains the
|
||
<a class="reference internal" href="../library/graphlib.html#graphlib.TopologicalSorter" title="graphlib.TopologicalSorter"><code class="xref py py-class docutils literal notranslate"><span class="pre">graphlib.TopologicalSorter</span></code></a> class to offer functionality to perform
|
||
topological sorting of graphs. (Contributed by Pablo Galindo, Tim Peters and
|
||
Larry Hastings in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=17005">bpo-17005</a>.)</p>
|
||
</section>
|
||
</section>
|
||
<section id="improved-modules">
|
||
<h2>Improved Modules<a class="headerlink" href="#improved-modules" title="Link to this heading">¶</a></h2>
|
||
<section id="ast">
|
||
<h3>ast<a class="headerlink" href="#ast" title="Link to this heading">¶</a></h3>
|
||
<p>Added the <em>indent</em> option to <a class="reference internal" href="../library/ast.html#ast.dump" title="ast.dump"><code class="xref py py-func docutils literal notranslate"><span class="pre">dump()</span></code></a> which allows it to produce a
|
||
multiline indented output.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37995">bpo-37995</a>.)</p>
|
||
<p>Added <a class="reference internal" href="../library/ast.html#ast.unparse" title="ast.unparse"><code class="xref py py-func docutils literal notranslate"><span class="pre">ast.unparse()</span></code></a> as a function in the <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> module that can
|
||
be used to unparse an <a class="reference internal" href="../library/ast.html#ast.AST" title="ast.AST"><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.AST</span></code></a> object and produce a string with code
|
||
that would produce an equivalent <a class="reference internal" href="../library/ast.html#ast.AST" title="ast.AST"><code class="xref py py-class docutils literal notranslate"><span class="pre">ast.AST</span></code></a> object when parsed.
|
||
(Contributed by Pablo Galindo and Batuhan Taskaya in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38870">bpo-38870</a>.)</p>
|
||
<p>Added docstrings to AST nodes that contains the ASDL signature used to
|
||
construct that node. (Contributed by Batuhan Taskaya in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39638">bpo-39638</a>.)</p>
|
||
</section>
|
||
<section id="asyncio">
|
||
<h3>asyncio<a class="headerlink" href="#asyncio" title="Link to this heading">¶</a></h3>
|
||
<p>Due to significant security concerns, the <em>reuse_address</em> parameter of
|
||
<a class="reference internal" href="../library/asyncio-eventloop.html#asyncio.loop.create_datagram_endpoint" title="asyncio.loop.create_datagram_endpoint"><code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.loop.create_datagram_endpoint()</span></code></a> is no longer supported. This is
|
||
because of the behavior of the socket option <code class="docutils literal notranslate"><span class="pre">SO_REUSEADDR</span></code> in UDP. For more
|
||
details, see the documentation for <code class="docutils literal notranslate"><span class="pre">loop.create_datagram_endpoint()</span></code>.
|
||
(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in
|
||
<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37228">bpo-37228</a>.)</p>
|
||
<p>Added a new <a class="reference internal" href="../glossary.html#term-coroutine"><span class="xref std std-term">coroutine</span></a> <a class="reference internal" href="../library/asyncio-eventloop.html#asyncio.loop.shutdown_default_executor" title="asyncio.loop.shutdown_default_executor"><code class="xref py py-meth docutils literal notranslate"><span class="pre">shutdown_default_executor()</span></code></a>
|
||
that schedules a shutdown for the default executor that waits on the
|
||
<a class="reference internal" href="../library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor" title="concurrent.futures.ThreadPoolExecutor"><code class="xref py py-class docutils literal notranslate"><span class="pre">ThreadPoolExecutor</span></code></a> to finish closing. Also,
|
||
<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> has been updated to use the new <a class="reference internal" href="../glossary.html#term-coroutine"><span class="xref std std-term">coroutine</span></a>.
|
||
(Contributed by Kyle Stanley in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34037">bpo-34037</a>.)</p>
|
||
<p>Added <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>, a Linux-specific child watcher
|
||
implementation that polls process file descriptors. (<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38692">bpo-38692</a>)</p>
|
||
<p>Added a new <a class="reference internal" href="../glossary.html#term-coroutine"><span class="xref std std-term">coroutine</span></a> <a class="reference internal" href="../library/asyncio-task.html#asyncio.to_thread" title="asyncio.to_thread"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.to_thread()</span></code></a>. It is mainly used for
|
||
running IO-bound functions in a separate thread to avoid blocking the event
|
||
loop, and essentially works as a high-level version of
|
||
<a class="reference internal" href="../library/asyncio-eventloop.html#asyncio.loop.run_in_executor" title="asyncio.loop.run_in_executor"><code class="xref py py-meth docutils literal notranslate"><span class="pre">run_in_executor()</span></code></a> that can directly take keyword arguments.
|
||
(Contributed by Kyle Stanley and Yury Selivanov in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=32309">bpo-32309</a>.)</p>
|
||
<p>When cancelling the task due to a timeout, <a class="reference internal" href="../library/asyncio-task.html#asyncio.wait_for" title="asyncio.wait_for"><code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.wait_for()</span></code></a> will now
|
||
wait until the cancellation is complete also in the case when <em>timeout</em> is
|
||
<= 0, like it does with positive timeouts.
|
||
(Contributed by Elvis Pranskevichus in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=32751">bpo-32751</a>.)</p>
|
||
<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> now raises <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> when calling incompatible
|
||
methods with an <a class="reference internal" href="../library/ssl.html#ssl.SSLSocket" title="ssl.SSLSocket"><code class="xref py py-class docutils literal notranslate"><span class="pre">ssl.SSLSocket</span></code></a> socket.
|
||
(Contributed by Ido Michael in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37404">bpo-37404</a>.)</p>
|
||
</section>
|
||
<section id="compileall">
|
||
<h3>compileall<a class="headerlink" href="#compileall" title="Link to this heading">¶</a></h3>
|
||
<p>Added new possibility to use hardlinks for duplicated <code class="docutils literal notranslate"><span class="pre">.pyc</span></code> files: <em>hardlink_dupes</em> parameter and –hardlink-dupes command line option.
|
||
(Contributed by Lumír ‘Frenzy’ Balhar in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40495">bpo-40495</a>.)</p>
|
||
<p>Added new options for path manipulation in resulting <code class="docutils literal notranslate"><span class="pre">.pyc</span></code> files: <em>stripdir</em>, <em>prependdir</em>, <em>limit_sl_dest</em> parameters and -s, -p, -e command line options.
|
||
Added the possibility to specify the option for an optimization level multiple times.
|
||
(Contributed by Lumír ‘Frenzy’ Balhar in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38112">bpo-38112</a>.)</p>
|
||
</section>
|
||
<section id="concurrent-futures">
|
||
<h3>concurrent.futures<a class="headerlink" href="#concurrent-futures" title="Link to this heading">¶</a></h3>
|
||
<p>Added a new <em>cancel_futures</em> parameter to
|
||
<a class="reference internal" href="../library/concurrent.futures.html#concurrent.futures.Executor.shutdown" title="concurrent.futures.Executor.shutdown"><code class="xref py py-meth docutils literal notranslate"><span class="pre">concurrent.futures.Executor.shutdown()</span></code></a> that cancels all pending futures
|
||
which have not started running, instead of waiting for them to complete before
|
||
shutting down the executor.
|
||
(Contributed by Kyle Stanley in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39349">bpo-39349</a>.)</p>
|
||
<p>Removed daemon threads from <a class="reference internal" href="../library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor" title="concurrent.futures.ThreadPoolExecutor"><code class="xref py py-class docutils literal notranslate"><span class="pre">ThreadPoolExecutor</span></code></a>
|
||
and <a class="reference internal" href="../library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor" title="concurrent.futures.ProcessPoolExecutor"><code class="xref py py-class docutils literal notranslate"><span class="pre">ProcessPoolExecutor</span></code></a>. This improves
|
||
compatibility with subinterpreters and predictability in their shutdown
|
||
processes. (Contributed by Kyle Stanley in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39812">bpo-39812</a>.)</p>
|
||
<p>Workers in <a class="reference internal" href="../library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor" title="concurrent.futures.ProcessPoolExecutor"><code class="xref py py-class docutils literal notranslate"><span class="pre">ProcessPoolExecutor</span></code></a> are now spawned on
|
||
demand, only when there are no available idle workers to reuse. This optimizes
|
||
startup overhead and reduces the amount of lost CPU time to idle workers.
|
||
(Contributed by Kyle Stanley in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39207">bpo-39207</a>.)</p>
|
||
</section>
|
||
<section id="curses">
|
||
<h3>curses<a class="headerlink" href="#curses" title="Link to this heading">¶</a></h3>
|
||
<p>Added <a class="reference internal" href="../library/curses.html#curses.get_escdelay" title="curses.get_escdelay"><code class="xref py py-func docutils literal notranslate"><span class="pre">curses.get_escdelay()</span></code></a>, <a class="reference internal" href="../library/curses.html#curses.set_escdelay" title="curses.set_escdelay"><code class="xref py py-func docutils literal notranslate"><span class="pre">curses.set_escdelay()</span></code></a>,
|
||
<a class="reference internal" href="../library/curses.html#curses.get_tabsize" title="curses.get_tabsize"><code class="xref py py-func docutils literal notranslate"><span class="pre">curses.get_tabsize()</span></code></a>, and <a class="reference internal" href="../library/curses.html#curses.set_tabsize" title="curses.set_tabsize"><code class="xref py py-func docutils literal notranslate"><span class="pre">curses.set_tabsize()</span></code></a> functions.
|
||
(Contributed by Anthony Sottile in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38312">bpo-38312</a>.)</p>
|
||
</section>
|
||
<section id="datetime">
|
||
<h3>datetime<a class="headerlink" href="#datetime" title="Link to this heading">¶</a></h3>
|
||
<p>The <a class="reference internal" href="../library/datetime.html#datetime.date.isocalendar" title="datetime.date.isocalendar"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isocalendar()</span></code></a> of <a class="reference internal" href="../library/datetime.html#datetime.date" title="datetime.date"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.date</span></code></a>
|
||
and <a class="reference internal" href="../library/datetime.html#datetime.datetime.isocalendar" title="datetime.datetime.isocalendar"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isocalendar()</span></code></a> of <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>
|
||
methods now returns a <a class="reference internal" href="../library/collections.html#collections.namedtuple" title="collections.namedtuple"><code class="xref py py-func docutils literal notranslate"><span class="pre">namedtuple()</span></code></a> instead of a <a class="reference internal" href="../library/stdtypes.html#tuple" title="tuple"><code class="xref py py-class docutils literal notranslate"><span class="pre">tuple</span></code></a>.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=24416">bpo-24416</a>.)</p>
|
||
</section>
|
||
<section id="distutils">
|
||
<h3>distutils<a class="headerlink" href="#distutils" title="Link to this heading">¶</a></h3>
|
||
<p>The <strong class="command">upload</strong> command now creates SHA2-256 and Blake2b-256 hash
|
||
digests. It skips MD5 on platforms that block MD5 digest.
|
||
(Contributed by Christian Heimes in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40698">bpo-40698</a>.)</p>
|
||
</section>
|
||
<section id="fcntl">
|
||
<h3>fcntl<a class="headerlink" href="#fcntl" title="Link to this heading">¶</a></h3>
|
||
<p>Added constants <code class="xref py py-const docutils literal notranslate"><span class="pre">F_OFD_GETLK</span></code>, <code class="xref py py-const docutils literal notranslate"><span class="pre">F_OFD_SETLK</span></code>
|
||
and <code class="xref py py-const docutils literal notranslate"><span class="pre">F_OFD_SETLKW</span></code>.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38602">bpo-38602</a>.)</p>
|
||
</section>
|
||
<section id="ftplib">
|
||
<h3>ftplib<a class="headerlink" href="#ftplib" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/ftplib.html#ftplib.FTP" title="ftplib.FTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">FTP</span></code></a> and <a class="reference internal" href="../library/ftplib.html#ftplib.FTP_TLS" title="ftplib.FTP_TLS"><code class="xref py py-class docutils literal notranslate"><span class="pre">FTP_TLS</span></code></a> now raise a <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-class docutils literal notranslate"><span class="pre">ValueError</span></code></a>
|
||
if the given timeout for their constructor is zero to prevent the creation of
|
||
a non-blocking socket. (Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39259">bpo-39259</a>.)</p>
|
||
</section>
|
||
<section id="gc">
|
||
<h3>gc<a class="headerlink" href="#gc" title="Link to this heading">¶</a></h3>
|
||
<p>When the garbage collector makes a collection in which some objects resurrect
|
||
(they are reachable from outside the isolated cycles after the finalizers have
|
||
been executed), do not block the collection of all objects that are still
|
||
unreachable. (Contributed by Pablo Galindo and Tim Peters in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38379">bpo-38379</a>.)</p>
|
||
<p>Added a new function <a class="reference internal" href="../library/gc.html#gc.is_finalized" title="gc.is_finalized"><code class="xref py py-func docutils literal notranslate"><span class="pre">gc.is_finalized()</span></code></a> to check if an object has been
|
||
finalized by the garbage collector. (Contributed by Pablo Galindo in
|
||
<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39322">bpo-39322</a>.)</p>
|
||
</section>
|
||
<section id="hashlib">
|
||
<h3>hashlib<a class="headerlink" href="#hashlib" title="Link to this heading">¶</a></h3>
|
||
<p>The <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> module can now use SHA3 hashes and SHAKE XOF from OpenSSL
|
||
when available.
|
||
(Contributed by Christian Heimes in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37630">bpo-37630</a>.)</p>
|
||
<p>Builtin hash modules can now be disabled with
|
||
<code class="docutils literal notranslate"><span class="pre">./configure</span> <span class="pre">--without-builtin-hashlib-hashes</span></code> or selectively enabled with
|
||
e.g. <code class="docutils literal notranslate"><span class="pre">./configure</span> <span class="pre">--with-builtin-hashlib-hashes=sha3,blake2</span></code> to force use
|
||
of OpenSSL based implementation.
|
||
(Contributed by Christian Heimes in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40479">bpo-40479</a>)</p>
|
||
</section>
|
||
<section id="http">
|
||
<h3>http<a class="headerlink" href="#http" title="Link to this heading">¶</a></h3>
|
||
<p>HTTP status codes <code class="docutils literal notranslate"><span class="pre">103</span> <span class="pre">EARLY_HINTS</span></code>, <code class="docutils literal notranslate"><span class="pre">418</span> <span class="pre">IM_A_TEAPOT</span></code> and <code class="docutils literal notranslate"><span class="pre">425</span> <span class="pre">TOO_EARLY</span></code> are added to
|
||
<a class="reference internal" href="../library/http.html#http.HTTPStatus" title="http.HTTPStatus"><code class="xref py py-class docutils literal notranslate"><span class="pre">http.HTTPStatus</span></code></a>. (Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39509">bpo-39509</a> and Ross Rhodes in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39507">bpo-39507</a>.)</p>
|
||
</section>
|
||
<section id="idle-and-idlelib">
|
||
<h3>IDLE and idlelib<a class="headerlink" href="#idle-and-idlelib" title="Link to this heading">¶</a></h3>
|
||
<p>Added option to toggle cursor blink off. (Contributed by Zackery Spytz
|
||
in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=4603">bpo-4603</a>.)</p>
|
||
<p>Escape key now closes IDLE completion windows. (Contributed by Johnny
|
||
Najera in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38944">bpo-38944</a>.)</p>
|
||
<p>Added keywords to module name completion list. (Contributed by Terry J.
|
||
Reedy in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37765">bpo-37765</a>.)</p>
|
||
<p>New in 3.9 maintenance releases</p>
|
||
<p>Make IDLE invoke <a class="reference internal" href="../library/sys.html#sys.excepthook" title="sys.excepthook"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.excepthook()</span></code></a> (when started without ‘-n’).
|
||
User hooks were previously ignored. (Contributed by Ken Hilton in
|
||
<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=43008">bpo-43008</a>.)</p>
|
||
<p>The changes above have been backported to 3.8 maintenance releases.</p>
|
||
<p>Rearrange the settings dialog. Split the General tab into Windows
|
||
and Shell/Ed tabs. Move help sources, which extend the Help menu, to the
|
||
Extensions tab. Make space for new options and shorten the dialog. The
|
||
latter makes the dialog better fit small screens. (Contributed by Terry Jan
|
||
Reedy in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40468">bpo-40468</a>.) Move the indent space setting from the Font tab to
|
||
the new Windows tab. (Contributed by Mark Roseman and Terry Jan Reedy in
|
||
<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=33962">bpo-33962</a>.)</p>
|
||
<p>Apply syntax highlighting to <code class="docutils literal notranslate"><span class="pre">.pyi</span></code> files. (Contributed by Alex
|
||
Waygood and Terry Jan Reedy in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=45447">bpo-45447</a>.)</p>
|
||
</section>
|
||
<section id="imaplib">
|
||
<h3>imaplib<a class="headerlink" href="#imaplib" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/imaplib.html#imaplib.IMAP4" title="imaplib.IMAP4"><code class="xref py py-class docutils literal notranslate"><span class="pre">IMAP4</span></code></a> and <a class="reference internal" href="../library/imaplib.html#imaplib.IMAP4_SSL" title="imaplib.IMAP4_SSL"><code class="xref py py-class docutils literal notranslate"><span class="pre">IMAP4_SSL</span></code></a> now have
|
||
an optional <em>timeout</em> parameter for their constructors.
|
||
Also, the <a class="reference internal" href="../library/imaplib.html#imaplib.IMAP4.open" title="imaplib.IMAP4.open"><code class="xref py py-meth docutils literal notranslate"><span class="pre">open()</span></code></a> method now has an optional <em>timeout</em> parameter
|
||
with this change. The overridden methods of <a class="reference internal" href="../library/imaplib.html#imaplib.IMAP4_SSL" title="imaplib.IMAP4_SSL"><code class="xref py py-class docutils literal notranslate"><span class="pre">IMAP4_SSL</span></code></a> and
|
||
<a class="reference internal" href="../library/imaplib.html#imaplib.IMAP4_stream" title="imaplib.IMAP4_stream"><code class="xref py py-class docutils literal notranslate"><span class="pre">IMAP4_stream</span></code></a> were applied to this change.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38615">bpo-38615</a>.)</p>
|
||
<p><a class="reference internal" href="../library/imaplib.html#imaplib.IMAP4.unselect" title="imaplib.IMAP4.unselect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">imaplib.IMAP4.unselect()</span></code></a> is added.
|
||
<a class="reference internal" href="../library/imaplib.html#imaplib.IMAP4.unselect" title="imaplib.IMAP4.unselect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">imaplib.IMAP4.unselect()</span></code></a> frees server’s resources associated with the
|
||
selected mailbox and returns the server to the authenticated
|
||
state. This command performs the same actions as <a class="reference internal" href="../library/imaplib.html#imaplib.IMAP4.close" title="imaplib.IMAP4.close"><code class="xref py py-meth docutils literal notranslate"><span class="pre">imaplib.IMAP4.close()</span></code></a>, except
|
||
that no messages are permanently removed from the currently
|
||
selected mailbox. (Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40375">bpo-40375</a>.)</p>
|
||
</section>
|
||
<section id="importlib">
|
||
<h3>importlib<a class="headerlink" href="#importlib" title="Link to this heading">¶</a></h3>
|
||
<p>To improve consistency with import statements, <a class="reference internal" href="../library/importlib.html#importlib.util.resolve_name" title="importlib.util.resolve_name"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.util.resolve_name()</span></code></a>
|
||
now raises <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> 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> for invalid relative
|
||
import attempts.
|
||
(Contributed by Ngalim Siregar in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37444">bpo-37444</a>.)</p>
|
||
<p>Import loaders which publish immutable module objects can now publish
|
||
immutable packages in addition to individual modules.
|
||
(Contributed by Dino Viehland in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39336">bpo-39336</a>.)</p>
|
||
<p>Added <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> function with support for
|
||
subdirectories in package data, matching backport in <code class="docutils literal notranslate"><span class="pre">importlib_resources</span></code>
|
||
version 1.5.
|
||
(Contributed by Jason R. Coombs in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39791">bpo-39791</a>.)</p>
|
||
<p>Refreshed <code class="docutils literal notranslate"><span class="pre">importlib.metadata</span></code> from <code class="docutils literal notranslate"><span class="pre">importlib_metadata</span></code> version 1.6.1.</p>
|
||
</section>
|
||
<section id="inspect">
|
||
<h3>inspect<a class="headerlink" href="#inspect" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/inspect.html#inspect.BoundArguments.arguments" title="inspect.BoundArguments.arguments"><code class="xref py py-attr docutils literal notranslate"><span class="pre">inspect.BoundArguments.arguments</span></code></a> is changed from <code class="docutils literal notranslate"><span class="pre">OrderedDict</span></code> to regular
|
||
dict. (Contributed by Inada Naoki in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36350">bpo-36350</a> and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39775">bpo-39775</a>.)</p>
|
||
</section>
|
||
<section id="ipaddress">
|
||
<h3>ipaddress<a class="headerlink" href="#ipaddress" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/ipaddress.html#module-ipaddress" title="ipaddress: IPv4/IPv6 manipulation library."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ipaddress</span></code></a> now supports IPv6 Scoped Addresses (IPv6 address with suffix <code class="docutils literal notranslate"><span class="pre">%<scope_id></span></code>).</p>
|
||
<p>Scoped IPv6 addresses can be parsed using <a class="reference internal" href="../library/ipaddress.html#ipaddress.IPv6Address" title="ipaddress.IPv6Address"><code class="xref py py-class docutils literal notranslate"><span class="pre">ipaddress.IPv6Address</span></code></a>.
|
||
If present, scope zone ID is available through the <a class="reference internal" href="../library/ipaddress.html#ipaddress.IPv6Address.scope_id" title="ipaddress.IPv6Address.scope_id"><code class="xref py py-attr docutils literal notranslate"><span class="pre">scope_id</span></code></a> attribute.
|
||
(Contributed by Oleksandr Pavliuk in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34788">bpo-34788</a>.)</p>
|
||
<p>Starting with Python 3.9.5 the <a class="reference internal" href="../library/ipaddress.html#module-ipaddress" title="ipaddress: IPv4/IPv6 manipulation library."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ipaddress</span></code></a> module no longer
|
||
accepts any leading zeros in IPv4 address strings.
|
||
(Contributed by Christian Heimes in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36384">bpo-36384</a>).</p>
|
||
</section>
|
||
<section id="math">
|
||
<h3>math<a class="headerlink" href="#math" title="Link to this heading">¶</a></h3>
|
||
<p>Expanded the <a class="reference internal" href="../library/math.html#math.gcd" title="math.gcd"><code class="xref py py-func docutils literal notranslate"><span class="pre">math.gcd()</span></code></a> function to handle multiple arguments.
|
||
Formerly, it only supported two arguments.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39648">bpo-39648</a>.)</p>
|
||
<p>Added <a class="reference internal" href="../library/math.html#math.lcm" title="math.lcm"><code class="xref py py-func docutils literal notranslate"><span class="pre">math.lcm()</span></code></a>: return the least common multiple of specified arguments.
|
||
(Contributed by Mark Dickinson, Ananthakrishnan and Serhiy Storchaka in
|
||
<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39479">bpo-39479</a> and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39648">bpo-39648</a>.)</p>
|
||
<p>Added <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>: return the next floating-point value after <em>x</em>
|
||
towards <em>y</em>.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39288">bpo-39288</a>.)</p>
|
||
<p>Added <a class="reference internal" href="../library/math.html#math.ulp" title="math.ulp"><code class="xref py py-func docutils literal notranslate"><span class="pre">math.ulp()</span></code></a>: return the value of the least significant bit
|
||
of a float.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39310">bpo-39310</a>.)</p>
|
||
</section>
|
||
<section id="multiprocessing">
|
||
<h3>multiprocessing<a class="headerlink" href="#multiprocessing" title="Link to this heading">¶</a></h3>
|
||
<p>The <a class="reference internal" href="../library/multiprocessing.html#multiprocessing.SimpleQueue" title="multiprocessing.SimpleQueue"><code class="xref py py-class docutils literal notranslate"><span class="pre">multiprocessing.SimpleQueue</span></code></a> class has a new
|
||
<a class="reference internal" href="../library/multiprocessing.html#multiprocessing.SimpleQueue.close" title="multiprocessing.SimpleQueue.close"><code class="xref py py-meth docutils literal notranslate"><span class="pre">close()</span></code></a> method to explicitly close the
|
||
queue.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=30966">bpo-30966</a>.)</p>
|
||
</section>
|
||
<section id="nntplib">
|
||
<h3>nntplib<a class="headerlink" href="#nntplib" title="Link to this heading">¶</a></h3>
|
||
<p><code class="xref py py-class docutils literal notranslate"><span class="pre">NNTP</span></code> and <code class="xref py py-class docutils literal notranslate"><span class="pre">NNTP_SSL</span></code> now raise a <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-class docutils literal notranslate"><span class="pre">ValueError</span></code></a>
|
||
if the given timeout for their constructor is zero to prevent the creation of
|
||
a non-blocking socket. (Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39259">bpo-39259</a>.)</p>
|
||
</section>
|
||
<section id="os">
|
||
<h3>os<a class="headerlink" href="#os" title="Link to this heading">¶</a></h3>
|
||
<p>Added <a class="reference internal" href="../library/os.html#os.CLD_KILLED" title="os.CLD_KILLED"><code class="xref py py-const docutils literal notranslate"><span class="pre">CLD_KILLED</span></code></a> and <a class="reference internal" href="../library/os.html#os.CLD_STOPPED" title="os.CLD_STOPPED"><code class="xref py py-const docutils literal notranslate"><span class="pre">CLD_STOPPED</span></code></a> for <code class="xref py py-attr docutils literal notranslate"><span class="pre">si_code</span></code>.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38493">bpo-38493</a>.)</p>
|
||
<p>Exposed the Linux-specific <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> (<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38692">bpo-38692</a>) and
|
||
<a class="reference internal" href="../library/os.html#os.P_PIDFD" title="os.P_PIDFD"><code class="xref py py-const docutils literal notranslate"><span class="pre">os.P_PIDFD</span></code></a> (<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38713">bpo-38713</a>) for process management with file
|
||
descriptors.</p>
|
||
<p>The <a class="reference internal" href="../library/os.html#os.unsetenv" title="os.unsetenv"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.unsetenv()</span></code></a> function is now also available on Windows.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39413">bpo-39413</a>.)</p>
|
||
<p>The <a class="reference internal" href="../library/os.html#os.putenv" title="os.putenv"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.putenv()</span></code></a> and <a class="reference internal" href="../library/os.html#os.unsetenv" title="os.unsetenv"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.unsetenv()</span></code></a> functions are now always
|
||
available.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39395">bpo-39395</a>.)</p>
|
||
<p>Added <a class="reference internal" href="../library/os.html#os.waitstatus_to_exitcode" title="os.waitstatus_to_exitcode"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.waitstatus_to_exitcode()</span></code></a> function:
|
||
convert a wait status to an exit code.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40094">bpo-40094</a>.)</p>
|
||
</section>
|
||
<section id="pathlib">
|
||
<h3>pathlib<a class="headerlink" href="#pathlib" title="Link to this heading">¶</a></h3>
|
||
<p>Added <a class="reference internal" href="../library/pathlib.html#pathlib.Path.readlink" title="pathlib.Path.readlink"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pathlib.Path.readlink()</span></code></a> which acts similarly to
|
||
<a class="reference internal" href="../library/os.html#os.readlink" title="os.readlink"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.readlink()</span></code></a>.
|
||
(Contributed by Girts Folkmanis in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=30618">bpo-30618</a>)</p>
|
||
</section>
|
||
<section id="pdb">
|
||
<h3>pdb<a class="headerlink" href="#pdb" title="Link to this heading">¶</a></h3>
|
||
<p>On Windows now <a class="reference internal" href="../library/pdb.html#pdb.Pdb" title="pdb.Pdb"><code class="xref py py-class docutils literal notranslate"><span class="pre">Pdb</span></code></a> supports <code class="docutils literal notranslate"><span class="pre">~/.pdbrc</span></code>.
|
||
(Contributed by Tim Hopper and Dan Lidral-Porter in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=20523">bpo-20523</a>.)</p>
|
||
</section>
|
||
<section id="poplib">
|
||
<h3>poplib<a class="headerlink" href="#poplib" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/poplib.html#poplib.POP3" title="poplib.POP3"><code class="xref py py-class docutils literal notranslate"><span class="pre">POP3</span></code></a> and <a class="reference internal" href="../library/poplib.html#poplib.POP3_SSL" title="poplib.POP3_SSL"><code class="xref py py-class docutils literal notranslate"><span class="pre">POP3_SSL</span></code></a> now raise a <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-class docutils literal notranslate"><span class="pre">ValueError</span></code></a>
|
||
if the given timeout for their constructor is zero to prevent the creation of
|
||
a non-blocking socket. (Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39259">bpo-39259</a>.)</p>
|
||
</section>
|
||
<section id="pprint">
|
||
<h3>pprint<a class="headerlink" href="#pprint" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/pprint.html#module-pprint" title="pprint: Data pretty printer."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pprint</span></code></a> can now pretty-print <a class="reference internal" href="../library/types.html#types.SimpleNamespace" title="types.SimpleNamespace"><code class="xref py py-class docutils literal notranslate"><span class="pre">types.SimpleNamespace</span></code></a>.
|
||
(Contributed by Carl Bordum Hansen in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37376">bpo-37376</a>.)</p>
|
||
</section>
|
||
<section id="pydoc">
|
||
<h3>pydoc<a class="headerlink" href="#pydoc" title="Link to this heading">¶</a></h3>
|
||
<p>The documentation string is now shown not only for class, function,
|
||
method etc, but for any object that has its own <a class="reference internal" href="../library/stdtypes.html#definition.__doc__" title="definition.__doc__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__doc__</span></code></a>
|
||
attribute.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40257">bpo-40257</a>.)</p>
|
||
</section>
|
||
<section id="random">
|
||
<h3>random<a class="headerlink" href="#random" title="Link to this heading">¶</a></h3>
|
||
<p>Added a new <code class="xref py py-attr docutils literal notranslate"><span class="pre">random.Random.randbytes</span></code> method: generate random bytes.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40286">bpo-40286</a>.)</p>
|
||
</section>
|
||
<section id="signal">
|
||
<h3>signal<a class="headerlink" href="#signal" title="Link to this heading">¶</a></h3>
|
||
<p>Exposed the Linux-specific <a class="reference internal" href="../library/signal.html#signal.pidfd_send_signal" title="signal.pidfd_send_signal"><code class="xref py py-func docutils literal notranslate"><span class="pre">signal.pidfd_send_signal()</span></code></a> for sending to
|
||
signals to a process using a file descriptor instead of a pid. (<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38712">bpo-38712</a>)</p>
|
||
</section>
|
||
<section id="smtplib">
|
||
<h3>smtplib<a class="headerlink" href="#smtplib" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/smtplib.html#smtplib.SMTP" title="smtplib.SMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP</span></code></a> and <a class="reference internal" href="../library/smtplib.html#smtplib.SMTP_SSL" title="smtplib.SMTP_SSL"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP_SSL</span></code></a> now raise a <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-class docutils literal notranslate"><span class="pre">ValueError</span></code></a>
|
||
if the given timeout for their constructor is zero to prevent the creation of
|
||
a non-blocking socket. (Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39259">bpo-39259</a>.)</p>
|
||
<p><a class="reference internal" href="../library/smtplib.html#smtplib.LMTP" title="smtplib.LMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">LMTP</span></code></a> constructor now has an optional <em>timeout</em> parameter.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39329">bpo-39329</a>.)</p>
|
||
</section>
|
||
<section id="socket">
|
||
<h3>socket<a class="headerlink" href="#socket" title="Link to this heading">¶</a></h3>
|
||
<p>The <a class="reference internal" href="../library/socket.html#module-socket" title="socket: Low-level networking interface."><code class="xref py py-mod docutils literal notranslate"><span class="pre">socket</span></code></a> module now exports the <a class="reference internal" href="../library/socket.html#socket.CAN_RAW_JOIN_FILTERS" title="socket.CAN_RAW_JOIN_FILTERS"><code class="xref py py-const docutils literal notranslate"><span class="pre">CAN_RAW_JOIN_FILTERS</span></code></a>
|
||
constant on Linux 4.1 and greater.
|
||
(Contributed by Stefan Tatschner and Zackery Spytz in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=25780">bpo-25780</a>.)</p>
|
||
<p>The socket module now supports the <a class="reference internal" href="../library/socket.html#socket.CAN_J1939" title="socket.CAN_J1939"><code class="xref py py-const docutils literal notranslate"><span class="pre">CAN_J1939</span></code></a> protocol on
|
||
platforms that support it. (Contributed by Karl Ding in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40291">bpo-40291</a>.)</p>
|
||
<p>The socket module now has the <a class="reference internal" href="../library/socket.html#socket.send_fds" title="socket.send_fds"><code class="xref py py-func docutils literal notranslate"><span class="pre">socket.send_fds()</span></code></a> and
|
||
<a class="reference internal" href="../library/socket.html#socket.recv_fds" title="socket.recv_fds"><code class="xref py py-func docutils literal notranslate"><span class="pre">socket.recv_fds()</span></code></a> functions. (Contributed by Joannah Nanjekye, Shinya
|
||
Okano and Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=28724">bpo-28724</a>.)</p>
|
||
</section>
|
||
<section id="time">
|
||
<h3>time<a class="headerlink" href="#time" title="Link to this heading">¶</a></h3>
|
||
<p>On AIX, <a class="reference internal" href="../library/time.html#time.thread_time" title="time.thread_time"><code class="xref py py-func docutils literal notranslate"><span class="pre">thread_time()</span></code></a> is now implemented with <code class="docutils literal notranslate"><span class="pre">thread_cputime()</span></code>
|
||
which has nanosecond resolution, rather than
|
||
<code class="docutils literal notranslate"><span class="pre">clock_gettime(CLOCK_THREAD_CPUTIME_ID)</span></code> which has a resolution of 10 milliseconds.
|
||
(Contributed by Batuhan Taskaya in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40192">bpo-40192</a>)</p>
|
||
</section>
|
||
<section id="sys">
|
||
<h3>sys<a class="headerlink" href="#sys" title="Link to this heading">¶</a></h3>
|
||
<p>Added a new <a class="reference internal" href="../library/sys.html#sys.platlibdir" title="sys.platlibdir"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.platlibdir</span></code></a> attribute: name of the platform-specific
|
||
library directory. It is used to build the path of standard library and the
|
||
paths of installed extension modules. It is equal to <code class="docutils literal notranslate"><span class="pre">"lib"</span></code> on most
|
||
platforms. On Fedora and SuSE, it is equal to <code class="docutils literal notranslate"><span class="pre">"lib64"</span></code> on 64-bit platforms.
|
||
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=1294959">bpo-1294959</a>.)</p>
|
||
<p>Previously, <a class="reference internal" href="../library/sys.html#sys.stderr" title="sys.stderr"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.stderr</span></code></a> was block-buffered when non-interactive. Now
|
||
<code class="docutils literal notranslate"><span class="pre">stderr</span></code> defaults to always being line-buffered.
|
||
(Contributed by Jendrik Seipp in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=13601">bpo-13601</a>.)</p>
|
||
</section>
|
||
<section id="tracemalloc">
|
||
<h3>tracemalloc<a class="headerlink" href="#tracemalloc" title="Link to this heading">¶</a></h3>
|
||
<p>Added <a class="reference internal" href="../library/tracemalloc.html#tracemalloc.reset_peak" title="tracemalloc.reset_peak"><code class="xref py py-func docutils literal notranslate"><span class="pre">tracemalloc.reset_peak()</span></code></a> to set the peak size of traced memory
|
||
blocks to the current size, to measure the peak of specific pieces of code.
|
||
(Contributed by Huon Wilson in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40630">bpo-40630</a>.)</p>
|
||
</section>
|
||
<section id="typing">
|
||
<h3>typing<a class="headerlink" href="#typing" title="Link to this heading">¶</a></h3>
|
||
<p><span class="target" id="index-17"></span><a class="pep reference external" href="https://peps.python.org/pep-0593/"><strong>PEP 593</strong></a> introduced an <a class="reference internal" href="../library/typing.html#typing.Annotated" title="typing.Annotated"><code class="xref py py-data docutils literal notranslate"><span class="pre">typing.Annotated</span></code></a> type to decorate existing
|
||
types with context-specific metadata and new <code class="docutils literal notranslate"><span class="pre">include_extras</span></code> parameter to
|
||
<a class="reference internal" href="../library/typing.html#typing.get_type_hints" title="typing.get_type_hints"><code class="xref py py-func docutils literal notranslate"><span class="pre">typing.get_type_hints()</span></code></a> to access the metadata at runtime. (Contributed
|
||
by Till Varoquaux and Konstantin Kashin.)</p>
|
||
</section>
|
||
<section id="unicodedata">
|
||
<h3>unicodedata<a class="headerlink" href="#unicodedata" title="Link to this heading">¶</a></h3>
|
||
<p>The Unicode database has been updated to version 13.0.0. (<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39926">bpo-39926</a>).</p>
|
||
</section>
|
||
<section id="venv">
|
||
<h3>venv<a class="headerlink" href="#venv" title="Link to this heading">¶</a></h3>
|
||
<p>The activation scripts provided 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> now all specify their prompt
|
||
customization consistently by always using the value specified by
|
||
<code class="docutils literal notranslate"><span class="pre">__VENV_PROMPT__</span></code>. Previously some scripts unconditionally used
|
||
<code class="docutils literal notranslate"><span class="pre">__VENV_PROMPT__</span></code>, others only if it happened to be set (which was the default
|
||
case), and one used <code class="docutils literal notranslate"><span class="pre">__VENV_NAME__</span></code> instead.
|
||
(Contributed by Brett Cannon in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37663">bpo-37663</a>.)</p>
|
||
</section>
|
||
<section id="xml">
|
||
<h3>xml<a class="headerlink" href="#xml" title="Link to this heading">¶</a></h3>
|
||
<p>White space characters within attributes are now preserved when serializing
|
||
<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> to XML file. EOLNs are no longer normalized
|
||
to “n”. This is the result of discussion about how to interpret
|
||
section 2.11 of XML spec.
|
||
(Contributed by Mefistotelis in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39011">bpo-39011</a>.)</p>
|
||
</section>
|
||
</section>
|
||
<section id="optimizations">
|
||
<h2>Optimizations<a class="headerlink" href="#optimizations" title="Link to this heading">¶</a></h2>
|
||
<ul>
|
||
<li><p>Optimized the idiom for assignment a temporary variable in comprehensions.
|
||
Now <code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">y</span> <span class="pre">in</span> <span class="pre">[expr]</span></code> in comprehensions is as fast as a simple assignment
|
||
<code class="docutils literal notranslate"><span class="pre">y</span> <span class="pre">=</span> <span class="pre">expr</span></code>. For example:</p>
|
||
<blockquote>
|
||
<div><p>sums = [s for s in [0] for x in data for s in [s + x]]</p>
|
||
</div></blockquote>
|
||
<p>Unlike the <code class="docutils literal notranslate"><span class="pre">:=</span></code> operator this idiom does not leak a variable to the
|
||
outer scope.</p>
|
||
<p>(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=32856">bpo-32856</a>.)</p>
|
||
</li>
|
||
<li><p>Optimized signal handling in multithreaded applications. If a thread different
|
||
than the main thread gets a signal, the bytecode evaluation loop is no longer
|
||
interrupted at each bytecode instruction to check for pending signals which
|
||
cannot be handled. Only the main thread of the main interpreter can handle
|
||
signals.</p>
|
||
<p>Previously, the bytecode evaluation loop was interrupted at each instruction
|
||
until the main thread handles signals.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40010">bpo-40010</a>.)</p>
|
||
</li>
|
||
<li><p>Optimized the <a class="reference internal" href="../library/subprocess.html#module-subprocess" title="subprocess: Subprocess management."><code class="xref py py-mod docutils literal notranslate"><span class="pre">subprocess</span></code></a> module on FreeBSD using <code class="docutils literal notranslate"><span class="pre">closefrom()</span></code>.
|
||
(Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor
|
||
Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38061">bpo-38061</a>.)</p></li>
|
||
<li><p><a class="reference internal" href="../c-api/long.html#c.PyLong_FromDouble" title="PyLong_FromDouble"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyLong_FromDouble()</span></code></a> is now up to 1.87x faster for values that
|
||
fit into <span class="c-expr sig sig-inline c"><span class="kt">long</span></span>.
|
||
(Contributed by Sergey Fedoseev in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37986">bpo-37986</a>.)</p></li>
|
||
<li><p>A number of Python builtins (<a class="reference internal" href="../library/stdtypes.html#range" title="range"><code class="xref py py-class docutils literal notranslate"><span class="pre">range</span></code></a>, <a class="reference internal" href="../library/stdtypes.html#tuple" title="tuple"><code class="xref py py-class docutils literal notranslate"><span class="pre">tuple</span></code></a>, <a class="reference internal" href="../library/stdtypes.html#set" title="set"><code class="xref py py-class docutils literal notranslate"><span class="pre">set</span></code></a>,
|
||
<a class="reference internal" href="../library/stdtypes.html#frozenset" title="frozenset"><code class="xref py py-class docutils literal notranslate"><span class="pre">frozenset</span></code></a>, <a class="reference internal" href="../library/stdtypes.html#list" title="list"><code class="xref py py-class docutils literal notranslate"><span class="pre">list</span></code></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>) are now sped up by using
|
||
<span class="target" id="index-18"></span><a class="pep reference external" href="https://peps.python.org/pep-0590/"><strong>PEP 590</strong></a> vectorcall protocol.
|
||
(Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37207">bpo-37207</a>.)</p></li>
|
||
<li><p>Optimized <code class="xref py py-func docutils literal notranslate"><span class="pre">difference_update()</span></code> for the case when the other set
|
||
is much larger than the base set.
|
||
(Suggested by Evgeny Kapun with code contributed by Michele Orrù in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=8425">bpo-8425</a>.)</p></li>
|
||
<li><p>Python’s small object allocator (<code class="docutils literal notranslate"><span class="pre">obmalloc.c</span></code>) now allows (no more than)
|
||
one empty arena to remain available for immediate reuse, without returning
|
||
it to the OS. This prevents thrashing in simple loops where an arena could
|
||
be created and destroyed anew on each iteration.
|
||
(Contributed by Tim Peters in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37257">bpo-37257</a>.)</p></li>
|
||
<li><p><a class="reference internal" href="../glossary.html#term-floor-division"><span class="xref std std-term">floor division</span></a> of float operation now has a better performance. Also
|
||
the message of <a class="reference internal" href="../library/exceptions.html#ZeroDivisionError" title="ZeroDivisionError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ZeroDivisionError</span></code></a> for this operation is updated.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39434">bpo-39434</a>.)</p></li>
|
||
<li><p>Decoding short ASCII strings with UTF-8 and ascii codecs is now about
|
||
15% faster. (Contributed by Inada Naoki in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37348">bpo-37348</a>.)</p></li>
|
||
</ul>
|
||
<p>Here’s a summary of performance improvements from Python 3.4 through Python 3.9:</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>Python version 3.4 3.5 3.6 3.7 3.8 3.9
|
||
-------------- --- --- --- --- --- ---
|
||
|
||
Variable and attribute read access:
|
||
read_local 7.1 7.1 5.4 5.1 3.9 3.9
|
||
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5
|
||
read_global 15.5 19.0 14.3 13.6 7.6 7.8
|
||
read_builtin 21.1 21.6 18.5 19.0 7.5 7.8
|
||
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9
|
||
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9
|
||
read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3
|
||
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5
|
||
read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7
|
||
read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1
|
||
|
||
Variable and attribute write access:
|
||
write_local 8.7 9.3 5.5 5.3 4.3 4.3
|
||
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8
|
||
write_global 19.7 21.2 18.0 18.0 15.8 16.7
|
||
write_classvar 92.9 96.0 104.6 102.1 39.2 39.8
|
||
write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4
|
||
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8
|
||
|
||
Data structure read access:
|
||
read_list 24.2 24.5 20.8 20.8 19.0 19.5
|
||
read_deque 24.7 25.5 20.2 20.6 19.8 20.2
|
||
read_dict 24.3 25.7 22.3 23.0 21.0 22.4
|
||
read_strdict 22.6 24.3 19.5 21.2 18.9 21.5
|
||
|
||
Data structure write access:
|
||
write_list 27.1 28.5 22.5 21.6 20.0 20.0
|
||
write_deque 28.7 30.1 22.7 21.8 23.5 21.7
|
||
write_dict 31.4 33.3 29.3 29.2 24.7 25.4
|
||
write_strdict 28.4 29.9 27.5 25.2 23.1 24.5
|
||
|
||
Stack (or queue) operations:
|
||
list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6
|
||
deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2
|
||
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4
|
||
|
||
Timing loop:
|
||
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3
|
||
</pre></div>
|
||
</div>
|
||
<p>These results were generated from the variable access benchmark script at:
|
||
<code class="docutils literal notranslate"><span class="pre">Tools/scripts/var_access_benchmark.py</span></code>. The benchmark script displays timings
|
||
in nanoseconds. The benchmarks were measured on an
|
||
<a class="reference external" href="https://ark.intel.com/content/www/us/en/ark/products/76088/intel-core-i7-4960hq-processor-6m-cache-up-to-3-80-ghz.html">Intel® Core™ i7-4960HQ processor</a>
|
||
running the macOS 64-bit builds found at
|
||
<a class="reference external" href="https://www.python.org/downloads/macos/">python.org</a>.</p>
|
||
</section>
|
||
<section id="deprecated">
|
||
<h2>Deprecated<a class="headerlink" href="#deprecated" title="Link to this heading">¶</a></h2>
|
||
<ul>
|
||
<li><p>The distutils <code class="docutils literal notranslate"><span class="pre">bdist_msi</span></code> command is now deprecated, use
|
||
<code class="docutils literal notranslate"><span class="pre">bdist_wheel</span></code> (wheel packages) instead.
|
||
(Contributed by Hugo van Kemenade in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39586">bpo-39586</a>.)</p></li>
|
||
<li><p>Currently <a class="reference internal" href="../library/math.html#math.factorial" title="math.factorial"><code class="xref py py-func docutils literal notranslate"><span class="pre">math.factorial()</span></code></a> accepts <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> instances with
|
||
non-negative integer values (like <code class="docutils literal notranslate"><span class="pre">5.0</span></code>). It raises a <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>
|
||
for non-integral and negative floats. It is now deprecated. In future
|
||
Python versions it will raise 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> for all floats.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37315">bpo-37315</a>.)</p></li>
|
||
<li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">symbol</span></code> modules are deprecated and will be
|
||
removed in future versions of Python. For the majority of use cases,
|
||
users can leverage the Abstract Syntax Tree (AST) generation and compilation
|
||
stage, using the <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> module.</p></li>
|
||
<li><p>The Public C API functions <code class="xref c c-func docutils literal notranslate"><span class="pre">PyParser_SimpleParseStringFlags()</span></code>,
|
||
<code class="xref c c-func docutils literal notranslate"><span class="pre">PyParser_SimpleParseStringFlagsFilename()</span></code>,
|
||
<code class="xref c c-func docutils literal notranslate"><span class="pre">PyParser_SimpleParseFileFlags()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">PyNode_Compile()</span></code>
|
||
are deprecated and will be removed in Python 3.10 together with the old parser.</p></li>
|
||
<li><p>Using <a class="reference internal" href="../library/constants.html#NotImplemented" title="NotImplemented"><code class="xref py py-data docutils literal notranslate"><span class="pre">NotImplemented</span></code></a> in a boolean context has been deprecated,
|
||
as it is almost exclusively the result of incorrect rich comparator
|
||
implementations. It will be made 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> in a future version
|
||
of Python.
|
||
(Contributed by Josh Rosenberg in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=35712">bpo-35712</a>.)</p></li>
|
||
<li><p>The <a class="reference internal" href="../library/random.html#module-random" title="random: Generate pseudo-random numbers with various common distributions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">random</span></code></a> module currently accepts any hashable type as a
|
||
possible seed value. Unfortunately, some of those types are not
|
||
guaranteed to have a deterministic hash value. After Python 3.9,
|
||
the module will restrict its seeds to <a class="reference internal" href="../library/constants.html#None" title="None"><code class="xref py py-const docutils literal notranslate"><span class="pre">None</span></code></a>, <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>,
|
||
<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>, <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>, <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>, and <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>.</p></li>
|
||
<li><p>Opening the <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">GzipFile</span></code></a> file for writing without specifying
|
||
the <em>mode</em> argument is deprecated. In future Python versions it will always
|
||
be opened for reading by default. Specify the <em>mode</em> argument for opening
|
||
it for writing and silencing a warning.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=28286">bpo-28286</a>.)</p></li>
|
||
<li><p>Deprecated the <code class="docutils literal notranslate"><span class="pre">split()</span></code> method of <code class="xref py py-class docutils literal notranslate"><span class="pre">_tkinter.TkappType</span></code> in
|
||
favour of the <code class="docutils literal notranslate"><span class="pre">splitlist()</span></code> method which has more consistent and
|
||
predictable behavior.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38371">bpo-38371</a>.)</p></li>
|
||
<li><p>The explicit passing of coroutine objects to <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> has been
|
||
deprecated and will be removed in version 3.11.
|
||
(Contributed by Yury Selivanov and Kyle Stanley in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34790">bpo-34790</a>.)</p></li>
|
||
<li><p>binhex4 and hexbin4 standards are now deprecated. The <code class="xref py py-mod docutils literal notranslate"><span class="pre">binhex</span></code> module
|
||
and the following <a class="reference internal" href="../library/binascii.html#module-binascii" title="binascii: Tools for converting between binary and various ASCII-encoded binary representations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">binascii</span></code></a> functions are now deprecated:</p>
|
||
<ul class="simple">
|
||
<li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">b2a_hqx()</span></code>, <code class="xref py py-func docutils literal notranslate"><span class="pre">a2b_hqx()</span></code></p></li>
|
||
<li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">rlecode_hqx()</span></code>, <code class="xref py py-func docutils literal notranslate"><span class="pre">rledecode_hqx()</span></code></p></li>
|
||
</ul>
|
||
<p>(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39353">bpo-39353</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> classes <code class="docutils literal notranslate"><span class="pre">slice</span></code>, <code class="docutils literal notranslate"><span class="pre">Index</span></code> and <code class="docutils literal notranslate"><span class="pre">ExtSlice</span></code> are considered deprecated
|
||
and will be removed in future Python versions. <code class="docutils literal notranslate"><span class="pre">value</span></code> itself should be
|
||
used instead of <code class="docutils literal notranslate"><span class="pre">Index(value)</span></code>. <code class="docutils literal notranslate"><span class="pre">Tuple(slices,</span> <span class="pre">Load())</span></code> should be
|
||
used instead of <code class="docutils literal notranslate"><span class="pre">ExtSlice(slices)</span></code>.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34822">bpo-34822</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> classes <code class="docutils literal notranslate"><span class="pre">Suite</span></code>, <code class="docutils literal notranslate"><span class="pre">Param</span></code>, <code class="docutils literal notranslate"><span class="pre">AugLoad</span></code> and <code class="docutils literal notranslate"><span class="pre">AugStore</span></code>
|
||
are considered deprecated and will be removed in future Python versions.
|
||
They were not generated by the parser and not accepted by the code
|
||
generator in Python 3.
|
||
(Contributed by Batuhan Taskaya in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39639">bpo-39639</a> and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39969">bpo-39969</a>
|
||
and Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39988">bpo-39988</a>.)</p></li>
|
||
<li><p>The <code class="xref c c-func docutils literal notranslate"><span class="pre">PyEval_InitThreads()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">PyEval_ThreadsInitialized()</span></code>
|
||
functions are now deprecated and will be removed in Python 3.11. Calling
|
||
<code class="xref c c-func docutils literal notranslate"><span class="pre">PyEval_InitThreads()</span></code> now does nothing. The <a class="reference internal" href="../glossary.html#term-GIL"><span class="xref std std-term">GIL</span></a> is initialized
|
||
by <a class="reference internal" href="../c-api/init.html#c.Py_Initialize" title="Py_Initialize"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_Initialize()</span></code></a> since Python 3.7.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39877">bpo-39877</a>.)</p></li>
|
||
<li><p>Passing <code class="docutils literal notranslate"><span class="pre">None</span></code> as the first argument to the <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> function
|
||
has been deprecated. (Contributed by Zackery Spytz in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=33262">bpo-33262</a>.)</p></li>
|
||
<li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">smtpd.MailmanProxy()</span></code> is now deprecated as it is unusable without
|
||
an external module, <code class="docutils literal notranslate"><span class="pre">mailman</span></code>. (Contributed by Samuel Colvin in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=35800">bpo-35800</a>.)</p></li>
|
||
<li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">lib2to3</span></code> module now emits a <a class="reference internal" href="../library/exceptions.html#PendingDeprecationWarning" title="PendingDeprecationWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">PendingDeprecationWarning</span></code></a>.
|
||
Python 3.9 switched to a PEG parser (see <span class="target" id="index-19"></span><a class="pep reference external" href="https://peps.python.org/pep-0617/"><strong>PEP 617</strong></a>), and Python 3.10 may
|
||
include new language syntax that is not parsable by lib2to3’s LL(1) parser.
|
||
The <code class="xref py py-mod docutils literal notranslate"><span class="pre">lib2to3</span></code> module may be removed from the standard library in a future
|
||
Python version. Consider third-party alternatives such as <a class="reference external" href="https://libcst.readthedocs.io/">LibCST</a> or
|
||
<a class="reference external" href="https://parso.readthedocs.io/">parso</a>.
|
||
(Contributed by Carl Meyer in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40360">bpo-40360</a>.)</p></li>
|
||
<li><p>The <em>random</em> parameter of <a class="reference internal" href="../library/random.html#random.shuffle" title="random.shuffle"><code class="xref py py-func docutils literal notranslate"><span class="pre">random.shuffle()</span></code></a> has been deprecated.
|
||
(Contributed by Raymond Hettinger in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40465">bpo-40465</a>)</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="removed">
|
||
<span id="removed-in-python-39"></span><h2>Removed<a class="headerlink" href="#removed" title="Link to this heading">¶</a></h2>
|
||
<ul class="simple">
|
||
<li><p>The erroneous version at <code class="xref py py-data docutils literal notranslate"><span class="pre">unittest.mock.__version__</span></code> has been removed.</p></li>
|
||
<li><p><code class="xref py py-class docutils literal notranslate"><span class="pre">nntplib.NNTP</span></code>: <code class="docutils literal notranslate"><span class="pre">xpath()</span></code> and <code class="docutils literal notranslate"><span class="pre">xgtitle()</span></code> methods have been removed.
|
||
These methods are deprecated since Python 3.3. Generally, these extensions
|
||
are not supported or not enabled by NNTP server administrators.
|
||
For <code class="docutils literal notranslate"><span class="pre">xgtitle()</span></code>, please use <code class="xref py py-meth docutils literal notranslate"><span class="pre">nntplib.NNTP.descriptions()</span></code> or
|
||
<code class="xref py py-meth docutils literal notranslate"><span class="pre">nntplib.NNTP.description()</span></code> instead.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39366">bpo-39366</a>.)</p></li>
|
||
<li><p><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>: <code class="docutils literal notranslate"><span class="pre">tostring()</span></code> and <code class="docutils literal notranslate"><span class="pre">fromstring()</span></code> methods have been
|
||
removed. They were aliases to <code class="docutils literal notranslate"><span class="pre">tobytes()</span></code> and <code class="docutils literal notranslate"><span class="pre">frombytes()</span></code>, deprecated
|
||
since Python 3.2.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38916">bpo-38916</a>.)</p></li>
|
||
<li><p>The undocumented <code class="docutils literal notranslate"><span class="pre">sys.callstats()</span></code> function has been removed. Since Python
|
||
3.7, it was deprecated and always returned <a class="reference internal" href="../library/constants.html#None" title="None"><code class="xref py py-const docutils literal notranslate"><span class="pre">None</span></code></a>. It required a special
|
||
build option <code class="docutils literal notranslate"><span class="pre">CALL_PROFILE</span></code> which was already removed in Python 3.7.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37414">bpo-37414</a>.)</p></li>
|
||
<li><p>The <code class="docutils literal notranslate"><span class="pre">sys.getcheckinterval()</span></code> and <code class="docutils literal notranslate"><span class="pre">sys.setcheckinterval()</span></code> functions have
|
||
been removed. They were deprecated since Python 3.2. Use
|
||
<a class="reference internal" href="../library/sys.html#sys.getswitchinterval" title="sys.getswitchinterval"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.getswitchinterval()</span></code></a> and <a class="reference internal" href="../library/sys.html#sys.setswitchinterval" title="sys.setswitchinterval"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.setswitchinterval()</span></code></a> instead.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37392">bpo-37392</a>.)</p></li>
|
||
<li><p>The C function <code class="docutils literal notranslate"><span class="pre">PyImport_Cleanup()</span></code> has been removed. It was documented as:
|
||
“Empty the module table. For internal use only.”
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36710">bpo-36710</a>.)</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_dummy_thread</span></code> and <code class="docutils literal notranslate"><span class="pre">dummy_threading</span></code> modules have been removed. These
|
||
modules were deprecated since Python 3.7 which requires threading support.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37312">bpo-37312</a>.)</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">aifc.openfp()</span></code> alias to <code class="docutils literal notranslate"><span class="pre">aifc.open()</span></code>, <code class="docutils literal notranslate"><span class="pre">sunau.openfp()</span></code> alias to
|
||
<code class="docutils literal notranslate"><span class="pre">sunau.open()</span></code>, and <code class="docutils literal notranslate"><span class="pre">wave.openfp()</span></code> alias to <a class="reference internal" href="../library/wave.html#wave.open" title="wave.open"><code class="xref py py-func docutils literal notranslate"><span class="pre">wave.open()</span></code></a> have been
|
||
removed. They were deprecated since Python 3.7.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37320">bpo-37320</a>.)</p></li>
|
||
<li><p>The <code class="xref py py-meth docutils literal notranslate"><span class="pre">isAlive()</span></code> method of <a class="reference internal" href="../library/threading.html#threading.Thread" title="threading.Thread"><code class="xref py py-class docutils literal notranslate"><span class="pre">threading.Thread</span></code></a>
|
||
has been removed. It was deprecated since Python 3.8.
|
||
Use <a class="reference internal" href="../library/threading.html#threading.Thread.is_alive" title="threading.Thread.is_alive"><code class="xref py py-meth docutils literal notranslate"><span class="pre">is_alive()</span></code></a> instead.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37804">bpo-37804</a>.)</p></li>
|
||
<li><p>Methods <code class="docutils literal notranslate"><span class="pre">getchildren()</span></code> and <code class="docutils literal notranslate"><span class="pre">getiterator()</span></code> of classes
|
||
<a class="reference internal" href="../library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree" title="xml.etree.ElementTree.ElementTree"><code class="xref py py-class docutils literal notranslate"><span class="pre">ElementTree</span></code></a> and
|
||
<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> in the <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">ElementTree</span></code></a>
|
||
module have been removed. They were deprecated in Python 3.2.
|
||
Use <code class="docutils literal notranslate"><span class="pre">iter(x)</span></code> or <code class="docutils literal notranslate"><span class="pre">list(x)</span></code> instead of <code class="docutils literal notranslate"><span class="pre">x.getchildren()</span></code> and
|
||
<code class="docutils literal notranslate"><span class="pre">x.iter()</span></code> or <code class="docutils literal notranslate"><span class="pre">list(x.iter())</span></code> instead of <code class="docutils literal notranslate"><span class="pre">x.getiterator()</span></code>.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36543">bpo-36543</a>.)</p></li>
|
||
<li><p>The old <a class="reference internal" href="../library/plistlib.html#module-plistlib" title="plistlib: Generate and parse Apple plist files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">plistlib</span></code></a> API has been removed, it was deprecated since Python
|
||
3.4. Use the <a class="reference internal" href="../library/plistlib.html#plistlib.load" title="plistlib.load"><code class="xref py py-func docutils literal notranslate"><span class="pre">load()</span></code></a>, <a class="reference internal" href="../library/plistlib.html#plistlib.loads" title="plistlib.loads"><code class="xref py py-func docutils literal notranslate"><span class="pre">loads()</span></code></a>, <a class="reference internal" href="../library/plistlib.html#plistlib.dump" title="plistlib.dump"><code class="xref py py-func docutils literal notranslate"><span class="pre">dump()</span></code></a>, and
|
||
<a class="reference internal" href="../library/plistlib.html#plistlib.dumps" title="plistlib.dumps"><code class="xref py py-func docutils literal notranslate"><span class="pre">dumps()</span></code></a> functions. Additionally, the <em>use_builtin_types</em> parameter was
|
||
removed, standard <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> objects are always used instead.
|
||
(Contributed by Jon Janzen in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36409">bpo-36409</a>.)</p></li>
|
||
<li><p>The C function <code class="docutils literal notranslate"><span class="pre">PyGen_NeedsFinalizing</span></code> has been removed. It was not
|
||
documented, tested, or used anywhere within CPython after the implementation
|
||
of <span class="target" id="index-20"></span><a class="pep reference external" href="https://peps.python.org/pep-0442/"><strong>PEP 442</strong></a>. Patch by Joannah Nanjekye.
|
||
(Contributed by Joannah Nanjekye in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=15088">bpo-15088</a>)</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">base64.encodestring()</span></code> and <code class="docutils literal notranslate"><span class="pre">base64.decodestring()</span></code>, aliases deprecated
|
||
since Python 3.1, have been removed: use <a class="reference internal" href="../library/base64.html#base64.encodebytes" title="base64.encodebytes"><code class="xref py py-func docutils literal notranslate"><span class="pre">base64.encodebytes()</span></code></a> and
|
||
<a class="reference internal" href="../library/base64.html#base64.decodebytes" title="base64.decodebytes"><code class="xref py py-func docutils literal notranslate"><span class="pre">base64.decodebytes()</span></code></a> instead.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39351">bpo-39351</a>.)</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">fractions.gcd()</span></code> function has been removed, it was deprecated since Python
|
||
3.5 (<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=22486">bpo-22486</a>): use <a class="reference internal" href="../library/math.html#math.gcd" title="math.gcd"><code class="xref py py-func docutils literal notranslate"><span class="pre">math.gcd()</span></code></a> instead.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39350">bpo-39350</a>.)</p></li>
|
||
<li><p>The <em>buffering</em> parameter of <a class="reference internal" href="../library/bz2.html#bz2.BZ2File" title="bz2.BZ2File"><code class="xref py py-class docutils literal notranslate"><span class="pre">bz2.BZ2File</span></code></a> has been removed. Since
|
||
Python 3.0, it was ignored and using it emitted 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>.
|
||
Pass an open file object to control how the file is opened.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39357">bpo-39357</a>.)</p></li>
|
||
<li><p>The <em>encoding</em> parameter of <a class="reference internal" href="../library/json.html#json.loads" title="json.loads"><code class="xref py py-func docutils literal notranslate"><span class="pre">json.loads()</span></code></a> has been removed.
|
||
As of Python 3.1, it was deprecated and ignored; using it has emitted 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> since Python 3.8.
|
||
(Contributed by Inada Naoki in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39377">bpo-39377</a>)</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">with</span> <span class="pre">(await</span> <span class="pre">asyncio.lock):</span></code> and <code class="docutils literal notranslate"><span class="pre">with</span> <span class="pre">(yield</span> <span class="pre">from</span> <span class="pre">asyncio.lock):</span></code> statements are
|
||
not longer supported, use <code class="docutils literal notranslate"><span class="pre">async</span> <span class="pre">with</span> <span class="pre">lock</span></code> instead. The same is correct for
|
||
<code class="docutils literal notranslate"><span class="pre">asyncio.Condition</span></code> and <code class="docutils literal notranslate"><span class="pre">asyncio.Semaphore</span></code>.
|
||
(Contributed by Andrew Svetlov in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34793">bpo-34793</a>.)</p></li>
|
||
<li><p>The <code class="xref py py-func docutils literal notranslate"><span class="pre">sys.getcounts()</span></code> function, the <code class="docutils literal notranslate"><span class="pre">-X</span> <span class="pre">showalloccount</span></code> command line
|
||
option and the <code class="docutils literal notranslate"><span class="pre">show_alloc_count</span></code> field of the C structure
|
||
<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> have been removed. They required a special Python build by
|
||
defining <code class="docutils literal notranslate"><span class="pre">COUNT_ALLOCS</span></code> macro.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39489">bpo-39489</a>.)</p></li>
|
||
<li><p>The <code class="docutils literal notranslate"><span class="pre">_field_types</span></code> attribute of the <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">typing.NamedTuple</span></code></a> class
|
||
has been removed. It was deprecated since Python 3.8. Use
|
||
the <code class="docutils literal notranslate"><span class="pre">__annotations__</span></code> attribute instead.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40182">bpo-40182</a>.)</p></li>
|
||
<li><p>The <code class="xref py py-meth docutils literal notranslate"><span class="pre">symtable.SymbolTable.has_exec()</span></code> method has been removed. It was
|
||
deprecated since 2006, and only returning <code class="docutils literal notranslate"><span class="pre">False</span></code> when it’s called.
|
||
(Contributed by Batuhan Taskaya in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40208">bpo-40208</a>)</p></li>
|
||
<li><p>The <code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.Task.current_task()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.Task.all_tasks()</span></code>
|
||
have been removed. They were deprecated since Python 3.7 and you can use
|
||
<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> and <a class="reference internal" href="../library/asyncio-task.html#asyncio.all_tasks" title="asyncio.all_tasks"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.all_tasks()</span></code></a> instead.
|
||
(Contributed by Rémi Lapeyre in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40967">bpo-40967</a>)</p></li>
|
||
<li><p>The <code class="docutils literal notranslate"><span class="pre">unescape()</span></code> method in the <a class="reference internal" href="../library/html.parser.html#html.parser.HTMLParser" title="html.parser.HTMLParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">html.parser.HTMLParser</span></code></a> class
|
||
has been removed (it was deprecated since Python 3.4). <a class="reference internal" href="../library/html.html#html.unescape" title="html.unescape"><code class="xref py py-func docutils literal notranslate"><span class="pre">html.unescape()</span></code></a>
|
||
should be used for converting character references to the corresponding
|
||
unicode characters.</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="porting-to-python-3-9">
|
||
<h2>Porting to Python 3.9<a class="headerlink" href="#porting-to-python-3-9" 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 class="simple">
|
||
<li><p><a class="reference internal" href="../library/functions.html#import__" title="__import__"><code class="xref py py-func docutils literal notranslate"><span class="pre">__import__()</span></code></a> and <a class="reference internal" href="../library/importlib.html#importlib.util.resolve_name" title="importlib.util.resolve_name"><code class="xref py py-func docutils literal notranslate"><span class="pre">importlib.util.resolve_name()</span></code></a> now raise
|
||
<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> where it previously raised <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>. Callers
|
||
catching the specific exception type and supporting both Python 3.9 and
|
||
earlier versions will need to catch both using <code class="docutils literal notranslate"><span class="pre">except</span> <span class="pre">(ImportError,</span> <span class="pre">ValueError):</span></code>.</p></li>
|
||
<li><p>The <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> activation scripts no longer special-case when
|
||
<code class="docutils literal notranslate"><span class="pre">__VENV_PROMPT__</span></code> is set to <code class="docutils literal notranslate"><span class="pre">""</span></code>.</p></li>
|
||
<li><p>The <a class="reference internal" href="../library/select.html#select.epoll.unregister" title="select.epoll.unregister"><code class="xref py py-meth docutils literal notranslate"><span class="pre">select.epoll.unregister()</span></code></a> method no longer ignores the
|
||
<a class="reference internal" href="../library/errno.html#errno.EBADF" title="errno.EBADF"><code class="xref py py-const docutils literal notranslate"><span class="pre">EBADF</span></code></a> error.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39239">bpo-39239</a>.)</p></li>
|
||
<li><p>The <em>compresslevel</em> parameter of <a class="reference internal" href="../library/bz2.html#bz2.BZ2File" title="bz2.BZ2File"><code class="xref py py-class docutils literal notranslate"><span class="pre">bz2.BZ2File</span></code></a> became keyword-only,
|
||
since the <em>buffering</em> parameter has been removed.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39357">bpo-39357</a>.)</p></li>
|
||
<li><p>Simplified AST for subscription. Simple indices will be represented by
|
||
their value, extended slices will be represented as tuples.
|
||
<code class="docutils literal notranslate"><span class="pre">Index(value)</span></code> will return a <code class="docutils literal notranslate"><span class="pre">value</span></code> itself, <code class="docutils literal notranslate"><span class="pre">ExtSlice(slices)</span></code>
|
||
will return <code class="docutils literal notranslate"><span class="pre">Tuple(slices,</span> <span class="pre">Load())</span></code>.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34822">bpo-34822</a>.)</p></li>
|
||
<li><p>The <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> module now ignores the <span class="target" id="index-21"></span><a class="reference internal" href="../using/cmdline.html#envvar-PYTHONCASEOK"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONCASEOK</span></code></a>
|
||
environment variable when the <a class="reference internal" href="../using/cmdline.html#cmdoption-E"><code class="xref std std-option docutils literal notranslate"><span class="pre">-E</span></code></a> or <a class="reference internal" href="../using/cmdline.html#cmdoption-I"><code class="xref std std-option docutils literal notranslate"><span class="pre">-I</span></code></a> command line
|
||
options are being used.</p></li>
|
||
<li><p>The <em>encoding</em> parameter has been added to the classes <a class="reference internal" href="../library/ftplib.html#ftplib.FTP" title="ftplib.FTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">ftplib.FTP</span></code></a> and
|
||
<a class="reference internal" href="../library/ftplib.html#ftplib.FTP_TLS" title="ftplib.FTP_TLS"><code class="xref py py-class docutils literal notranslate"><span class="pre">ftplib.FTP_TLS</span></code></a> as a keyword-only parameter, and the default encoding
|
||
is changed from Latin-1 to UTF-8 to follow <span class="target" id="index-22"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc2640.html"><strong>RFC 2640</strong></a>.</p></li>
|
||
<li><p><a class="reference internal" href="../library/asyncio-eventloop.html#asyncio.loop.shutdown_default_executor" title="asyncio.loop.shutdown_default_executor"><code class="xref py py-meth docutils literal notranslate"><span class="pre">asyncio.loop.shutdown_default_executor()</span></code></a> has been added to
|
||
<a class="reference internal" href="../library/asyncio-eventloop.html#asyncio.AbstractEventLoop" title="asyncio.AbstractEventLoop"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractEventLoop</span></code></a>, meaning alternative event loops that
|
||
inherit from it should have this method defined.
|
||
(Contributed by Kyle Stanley in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34037">bpo-34037</a>.)</p></li>
|
||
<li><p>The constant values of future flags in the <a class="reference internal" href="../library/__future__.html#module-__future__" title="__future__: Future statement definitions"><code class="xref py py-mod docutils literal notranslate"><span class="pre">__future__</span></code></a> module
|
||
is updated in order to prevent collision with compiler flags. Previously
|
||
<code class="docutils literal notranslate"><span class="pre">PyCF_ALLOW_TOP_LEVEL_AWAIT</span></code> was clashing with <code class="docutils literal notranslate"><span class="pre">CO_FUTURE_DIVISION</span></code>.
|
||
(Contributed by Batuhan Taskaya in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39562">bpo-39562</a>)</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">array('u')</span></code> now uses <code class="xref c c-type docutils literal notranslate"><span class="pre">wchar_t</span></code> as C type instead of <code class="docutils literal notranslate"><span class="pre">Py_UNICODE</span></code>.
|
||
This change doesn’t affect to its behavior because <code class="docutils literal notranslate"><span class="pre">Py_UNICODE</span></code> is alias
|
||
of <code class="xref c c-type docutils literal notranslate"><span class="pre">wchar_t</span></code> since Python 3.3.
|
||
(Contributed by Inada Naoki in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34538">bpo-34538</a>.)</p></li>
|
||
<li><p>The <a class="reference internal" href="../library/logging.html#logging.getLogger" title="logging.getLogger"><code class="xref py py-func docutils literal notranslate"><span class="pre">logging.getLogger()</span></code></a> API now returns the root logger when passed
|
||
the name <code class="docutils literal notranslate"><span class="pre">'root'</span></code>, whereas previously it returned a non-root logger named
|
||
<code class="docutils literal notranslate"><span class="pre">'root'</span></code>. This could affect cases where user code explicitly wants a
|
||
non-root logger named <code class="docutils literal notranslate"><span class="pre">'root'</span></code>, or instantiates a logger using
|
||
<code class="docutils literal notranslate"><span class="pre">logging.getLogger(__name__)</span></code> in some top-level module called <code class="docutils literal notranslate"><span class="pre">'root.py'</span></code>.
|
||
(Contributed by Vinay Sajip in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37742">bpo-37742</a>.)</p></li>
|
||
<li><p>Division handling of <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">PurePath</span></code></a> now returns <a class="reference internal" href="../library/constants.html#NotImplemented" title="NotImplemented"><code class="xref py py-data docutils literal notranslate"><span class="pre">NotImplemented</span></code></a>
|
||
instead of raising 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> when passed something other than an
|
||
instance of <code class="docutils literal notranslate"><span class="pre">str</span></code> or <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">PurePath</span></code></a>. This allows creating
|
||
compatible classes that don’t inherit from those mentioned types.
|
||
(Contributed by Roger Aiudi in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34775">bpo-34775</a>).</p></li>
|
||
<li><p>Starting with Python 3.9.5 the <a class="reference internal" href="../library/ipaddress.html#module-ipaddress" title="ipaddress: IPv4/IPv6 manipulation library."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ipaddress</span></code></a> module no longer
|
||
accepts any leading zeros in IPv4 address strings. Leading zeros are
|
||
ambiguous and interpreted as octal notation by some libraries. For example
|
||
the legacy function <a class="reference internal" href="../library/socket.html#socket.inet_aton" title="socket.inet_aton"><code class="xref py py-func docutils literal notranslate"><span class="pre">socket.inet_aton()</span></code></a> treats leading zeros as octal
|
||
notatation. glibc implementation of modern <a class="reference internal" href="../library/socket.html#socket.inet_pton" title="socket.inet_pton"><code class="xref py py-func docutils literal notranslate"><span class="pre">inet_pton()</span></code></a> does
|
||
not accept any leading zeros.
|
||
(Contributed by Christian Heimes in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36384">bpo-36384</a>).</p></li>
|
||
<li><p><a class="reference internal" href="../library/codecs.html#codecs.lookup" title="codecs.lookup"><code class="xref py py-func docutils literal notranslate"><span class="pre">codecs.lookup()</span></code></a> now normalizes the encoding name the same way as
|
||
<code class="xref py py-func docutils literal notranslate"><span class="pre">encodings.normalize_encoding()</span></code>, except that <a class="reference internal" href="../library/codecs.html#codecs.lookup" title="codecs.lookup"><code class="xref py py-func docutils literal notranslate"><span class="pre">codecs.lookup()</span></code></a> also
|
||
converts the name to lower case. For example, <code class="docutils literal notranslate"><span class="pre">"latex+latin1"</span></code> encoding
|
||
name is now normalized to <code class="docutils literal notranslate"><span class="pre">"latex_latin1"</span></code>.
|
||
(Contributed by Jordon Xu in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37751">bpo-37751</a>.)</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="changes-in-the-c-api">
|
||
<h3>Changes in the C API<a class="headerlink" href="#changes-in-the-c-api" title="Link to this heading">¶</a></h3>
|
||
<ul>
|
||
<li><p>Instances of <a class="reference internal" href="../c-api/typeobj.html#heap-types"><span class="std std-ref">heap-allocated types</span></a> (such as those created with
|
||
<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> and similar APIs) hold a reference to their type
|
||
object since Python 3.8. As indicated in the “Changes in the C API” of Python
|
||
3.8, for the vast majority of cases, there should be no side effect but for
|
||
types that have a custom <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_traverse" title="PyTypeObject.tp_traverse"><code class="xref c c-member docutils literal notranslate"><span class="pre">tp_traverse</span></code></a> function,
|
||
ensure that all custom <code class="docutils literal notranslate"><span class="pre">tp_traverse</span></code> functions of heap-allocated types
|
||
visit the object’s type.</p>
|
||
<blockquote>
|
||
<div><p>Example:</p>
|
||
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
|
||
<span class="nf">foo_traverse</span><span class="p">(</span><span class="n">foo_struct</span><span class="w"> </span><span class="o">*</span><span class="n">self</span><span class="p">,</span><span class="w"> </span><span class="n">visitproc</span><span class="w"> </span><span class="n">visit</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="c1">// Rest of the traverse function</span>
|
||
<span class="cp">#if PY_VERSION_HEX >= 0x03090000</span>
|
||
<span class="w"> </span><span class="c1">// This was not needed before Python 3.9 (Python issue 35810 and 40217)</span>
|
||
<span class="w"> </span><span class="n">Py_VISIT</span><span class="p">(</span><span class="n">Py_TYPE</span><span class="p">(</span><span class="n">self</span><span class="p">));</span>
|
||
<span class="cp">#endif</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
</div></blockquote>
|
||
<p>If your traverse function delegates to <code class="docutils literal notranslate"><span class="pre">tp_traverse</span></code> of its base class
|
||
(or another type), ensure that <code class="docutils literal notranslate"><span class="pre">Py_TYPE(self)</span></code> is visited only once.
|
||
Note that only <a class="reference internal" href="../c-api/typeobj.html#heap-types"><span class="std std-ref">heap type</span></a> are expected to visit the type
|
||
in <code class="docutils literal notranslate"><span class="pre">tp_traverse</span></code>.</p>
|
||
<blockquote>
|
||
<div><p>For example, if your <code class="docutils literal notranslate"><span class="pre">tp_traverse</span></code> function includes:</p>
|
||
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">base</span><span class="o">-></span><span class="n">tp_traverse</span><span class="p">(</span><span class="n">self</span><span class="p">,</span><span class="w"> </span><span class="n">visit</span><span class="p">,</span><span class="w"> </span><span class="n">arg</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>then add:</p>
|
||
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#if PY_VERSION_HEX >= 0x03090000</span>
|
||
<span class="w"> </span><span class="c1">// This was not needed before Python 3.9 (bpo-35810 and bpo-40217)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">base</span><span class="o">-></span><span class="n">tp_flags</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="n">Py_TPFLAGS_HEAPTYPE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="c1">// a heap type's tp_traverse already visited Py_TYPE(self)</span>
|
||
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="n">Py_VISIT</span><span class="p">(</span><span class="n">Py_TYPE</span><span class="p">(</span><span class="n">self</span><span class="p">));</span>
|
||
<span class="w"> </span><span class="p">}</span>
|
||
<span class="cp">#else</span>
|
||
</pre></div>
|
||
</div>
|
||
</div></blockquote>
|
||
<p>(See <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=35810">bpo-35810</a> and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40217">bpo-40217</a> for more information.)</p>
|
||
</li>
|
||
<li><p>The functions <code class="docutils literal notranslate"><span class="pre">PyEval_CallObject</span></code>, <code class="docutils literal notranslate"><span class="pre">PyEval_CallFunction</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">PyEval_CallMethod</span></code> and <code class="docutils literal notranslate"><span class="pre">PyEval_CallObjectWithKeywords</span></code> are deprecated.
|
||
Use <a class="reference internal" href="../c-api/call.html#c.PyObject_Call" title="PyObject_Call"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_Call()</span></code></a> and its variants instead.
|
||
(See more details in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=29548">bpo-29548</a>.)</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="cpython-bytecode-changes">
|
||
<h3>CPython bytecode changes<a class="headerlink" href="#cpython-bytecode-changes" title="Link to this heading">¶</a></h3>
|
||
<ul>
|
||
<li><p>The <a class="reference internal" href="../library/dis.html#opcode-LOAD_ASSERTION_ERROR"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">LOAD_ASSERTION_ERROR</span></code></a> opcode was added for handling the
|
||
<a class="reference internal" href="../reference/simple_stmts.html#assert"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">assert</span></code></a> statement. Previously, the assert statement would not work
|
||
correctly if the <a class="reference internal" href="../library/exceptions.html#AssertionError" title="AssertionError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">AssertionError</span></code></a> exception was being shadowed.
|
||
(Contributed by Zackery Spytz in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34880">bpo-34880</a>.)</p></li>
|
||
<li><p>The <a class="reference internal" href="../library/dis.html#opcode-COMPARE_OP"><code class="xref std std-opcode docutils literal notranslate"><span class="pre">COMPARE_OP</span></code></a> opcode was split into four distinct instructions:</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">COMPARE_OP</span></code> for rich comparisons</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">IS_OP</span></code> for ‘is’ and ‘is not’ tests</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">CONTAINS_OP</span></code> for ‘in’ and ‘not in’ tests</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">JUMP_IF_NOT_EXC_MATCH</span></code> for checking exceptions in ‘try-except’
|
||
statements.</p></li>
|
||
</ul>
|
||
<p>(Contributed by Mark Shannon in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39156">bpo-39156</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 class="simple">
|
||
<li><p>Added <code class="docutils literal notranslate"><span class="pre">--with-platlibdir</span></code> option to the <code class="docutils literal notranslate"><span class="pre">configure</span></code> script: name of the
|
||
platform-specific library directory, stored in the new <a class="reference internal" href="../library/sys.html#sys.platlibdir" title="sys.platlibdir"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.platlibdir</span></code></a>
|
||
attribute. See <a class="reference internal" href="../library/sys.html#sys.platlibdir" title="sys.platlibdir"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.platlibdir</span></code></a> attribute for more information.
|
||
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis
|
||
and Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=1294959">bpo-1294959</a>.)</p></li>
|
||
<li><p>The <code class="docutils literal notranslate"><span class="pre">COUNT_ALLOCS</span></code> special build macro has been removed.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39489">bpo-39489</a>.)</p></li>
|
||
<li><p>On non-Windows platforms, the <code class="xref c c-func docutils literal notranslate"><span class="pre">setenv()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">unsetenv()</span></code>
|
||
functions are now required to build Python.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39395">bpo-39395</a>.)</p></li>
|
||
<li><p>On non-Windows platforms, creating <code class="docutils literal notranslate"><span class="pre">bdist_wininst</span></code> installers is now
|
||
officially unsupported. (See <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=10945">bpo-10945</a> for more details.)</p></li>
|
||
<li><p>When building Python on macOS from source, <code class="docutils literal notranslate"><span class="pre">_tkinter</span></code> now links with
|
||
non-system Tcl and Tk frameworks if they are installed in
|
||
<code class="docutils literal notranslate"><span class="pre">/Library/Frameworks</span></code>, as had been the case on older releases
|
||
of macOS. If a macOS SDK is explicitly configured, by using
|
||
<a class="reference internal" href="../using/configure.html#cmdoption-enable-universalsdk"><code class="xref std std-option docutils literal notranslate"><span class="pre">--enable-universalsdk</span></code></a> or <code class="docutils literal notranslate"><span class="pre">-isysroot</span></code>, only the SDK itself is
|
||
searched. The default behavior can still be overridden with
|
||
<code class="docutils literal notranslate"><span class="pre">--with-tcltk-includes</span></code> and <code class="docutils literal notranslate"><span class="pre">--with-tcltk-libs</span></code>.
|
||
(Contributed by Ned Deily in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=34956">bpo-34956</a>.)</p></li>
|
||
<li><p>Python can now be built for Windows 10 ARM64.
|
||
(Contributed by Steve Dower in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=33125">bpo-33125</a>.)</p></li>
|
||
<li><p>Some individual tests are now skipped when <code class="docutils literal notranslate"><span class="pre">--pgo</span></code> is used. The tests
|
||
in question increased the PGO task time significantly and likely
|
||
didn’t help improve optimization of the final executable. This
|
||
speeds up the task by a factor of about 15x. Running the full unit test
|
||
suite is slow. This change may result in a slightly less optimized build
|
||
since not as many code branches will be executed. If you are willing to
|
||
wait for the much slower build, the old behavior can be restored using
|
||
<code class="docutils literal notranslate"><span class="pre">./configure</span> <span class="pre">[..]</span> <span class="pre">PROFILE_TASK="-m</span> <span class="pre">test</span> <span class="pre">--pgo-extended"</span></code>. We make no
|
||
guarantees as to which PGO task set produces a faster build. Users who care
|
||
should run their own relevant benchmarks as results can depend on the
|
||
environment, workload, and compiler tool chain.
|
||
(See <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36044">bpo-36044</a> and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37707">bpo-37707</a> for more details.)</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="id1">
|
||
<h3>New Features<a class="headerlink" href="#id1" title="Link to this heading">¶</a></h3>
|
||
<ul>
|
||
<li><p><span class="target" id="index-23"></span><a class="pep reference external" href="https://peps.python.org/pep-0573/"><strong>PEP 573</strong></a>: Added <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 associate
|
||
a module with a class; <a class="reference internal" href="../c-api/type.html#c.PyType_GetModule" title="PyType_GetModule"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_GetModule()</span></code></a> and
|
||
<a class="reference internal" href="../c-api/type.html#c.PyType_GetModuleState" title="PyType_GetModuleState"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyType_GetModuleState()</span></code></a> to retrieve the module and its state; and
|
||
<a class="reference internal" href="../c-api/structures.html#c.PyCMethod" title="PyCMethod"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyCMethod</span></code></a> and <a class="reference internal" href="../c-api/structures.html#c.METH_METHOD" title="METH_METHOD"><code class="xref c c-macro docutils literal notranslate"><span class="pre">METH_METHOD</span></code></a> to allow a method to
|
||
access the class it was defined in.
|
||
(Contributed by Marcel Plch and Petr Viktorin in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38787">bpo-38787</a>.)</p></li>
|
||
<li><p>Added <a class="reference internal" href="../c-api/frame.html#c.PyFrame_GetCode" title="PyFrame_GetCode"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyFrame_GetCode()</span></code></a> function: get a frame code.
|
||
Added <a class="reference internal" href="../c-api/frame.html#c.PyFrame_GetBack" title="PyFrame_GetBack"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyFrame_GetBack()</span></code></a> function: get the frame next outer frame.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40421">bpo-40421</a>.)</p></li>
|
||
<li><p>Added <a class="reference internal" href="../c-api/frame.html#c.PyFrame_GetLineNumber" title="PyFrame_GetLineNumber"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyFrame_GetLineNumber()</span></code></a> to the limited C API.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40421">bpo-40421</a>.)</p></li>
|
||
<li><p>Added <a class="reference internal" href="../c-api/init.html#c.PyThreadState_GetInterpreter" title="PyThreadState_GetInterpreter"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThreadState_GetInterpreter()</span></code></a> and
|
||
<a class="reference internal" href="../c-api/init.html#c.PyInterpreterState_Get" title="PyInterpreterState_Get"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyInterpreterState_Get()</span></code></a> functions to get the interpreter.
|
||
Added <a class="reference internal" href="../c-api/init.html#c.PyThreadState_GetFrame" title="PyThreadState_GetFrame"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThreadState_GetFrame()</span></code></a> function to get the current frame of a
|
||
Python thread state.
|
||
Added <a class="reference internal" href="../c-api/init.html#c.PyThreadState_GetID" title="PyThreadState_GetID"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThreadState_GetID()</span></code></a> function: get the unique identifier of a
|
||
Python thread state.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39947">bpo-39947</a>.)</p></li>
|
||
<li><p>Added a new public <a class="reference internal" href="../c-api/call.html#c.PyObject_CallNoArgs" title="PyObject_CallNoArgs"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_CallNoArgs()</span></code></a> function to the C API, which
|
||
calls a callable Python object without any arguments. It is the most efficient
|
||
way to call a callable Python object without any argument.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37194">bpo-37194</a>.)</p></li>
|
||
<li><p>Changes in the limited C API (if <code class="docutils literal notranslate"><span class="pre">Py_LIMITED_API</span></code> macro is defined):</p>
|
||
<ul class="simple">
|
||
<li><p>Provide <a class="reference internal" href="../c-api/exceptions.html#c.Py_EnterRecursiveCall" title="Py_EnterRecursiveCall"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_EnterRecursiveCall()</span></code></a> and <a class="reference internal" href="../c-api/exceptions.html#c.Py_LeaveRecursiveCall" title="Py_LeaveRecursiveCall"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_LeaveRecursiveCall()</span></code></a>
|
||
as regular functions for the limited API. Previously, there were defined as
|
||
macros, but these macros didn’t compile with the limited C API which cannot
|
||
access <code class="docutils literal notranslate"><span class="pre">PyThreadState.recursion_depth</span></code> field (the structure is opaque in
|
||
the limited C API).</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyObject_INIT()</span></code> and <code class="docutils literal notranslate"><span class="pre">PyObject_INIT_VAR()</span></code> become regular “opaque”
|
||
function to hide implementation details.</p></li>
|
||
</ul>
|
||
<p>(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38644">bpo-38644</a> and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39542">bpo-39542</a>.)</p>
|
||
</li>
|
||
<li><p>The <a class="reference internal" href="../c-api/module.html#c.PyModule_AddType" title="PyModule_AddType"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyModule_AddType()</span></code></a> function is added to help adding a type
|
||
to a module.
|
||
(Contributed by Donghee Na in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40024">bpo-40024</a>.)</p></li>
|
||
<li><p>Added the functions <a class="reference internal" href="../c-api/gcsupport.html#c.PyObject_GC_IsTracked" title="PyObject_GC_IsTracked"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_IsTracked()</span></code></a> and
|
||
<a class="reference internal" href="../c-api/gcsupport.html#c.PyObject_GC_IsFinalized" title="PyObject_GC_IsFinalized"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_IsFinalized()</span></code></a> to the public API to allow to query if
|
||
Python objects are being currently tracked or have been already finalized by
|
||
the garbage collector respectively.
|
||
(Contributed by Pablo Galindo Salgado in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40241">bpo-40241</a>.)</p></li>
|
||
<li><p>Added <code class="xref c c-func docutils literal notranslate"><span class="pre">_PyObject_FunctionStr()</span></code> to get a user-friendly string
|
||
representation of a function-like object.
|
||
(Patch by Jeroen Demeyer in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37645">bpo-37645</a>.)</p></li>
|
||
<li><p>Added <a class="reference internal" href="../c-api/call.html#c.PyObject_CallOneArg" title="PyObject_CallOneArg"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_CallOneArg()</span></code></a> for calling an object with one
|
||
positional argument
|
||
(Patch by Jeroen Demeyer in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37483">bpo-37483</a>.)</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="id2">
|
||
<h3>Porting to Python 3.9<a class="headerlink" href="#id2" title="Link to this heading">¶</a></h3>
|
||
<ul>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyInterpreterState.eval_frame</span></code> (<span class="target" id="index-24"></span><a class="pep reference external" href="https://peps.python.org/pep-0523/"><strong>PEP 523</strong></a>) now requires a new mandatory
|
||
<em>tstate</em> parameter (<code class="docutils literal notranslate"><span class="pre">PyThreadState*</span></code>).
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38500">bpo-38500</a>.)</p></li>
|
||
<li><p>Extension modules: <a class="reference internal" href="../c-api/module.html#c.PyModuleDef.m_traverse" title="PyModuleDef.m_traverse"><code class="xref c c-member docutils literal notranslate"><span class="pre">m_traverse</span></code></a>,
|
||
<a class="reference internal" href="../c-api/module.html#c.PyModuleDef.m_clear" title="PyModuleDef.m_clear"><code class="xref c c-member docutils literal notranslate"><span class="pre">m_clear</span></code></a> and <a class="reference internal" href="../c-api/module.html#c.PyModuleDef.m_free" title="PyModuleDef.m_free"><code class="xref c c-member docutils literal notranslate"><span class="pre">m_free</span></code></a>
|
||
functions of <a class="reference internal" href="../c-api/module.html#c.PyModuleDef" title="PyModuleDef"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyModuleDef</span></code></a> are no longer called if the module state
|
||
was requested but is not allocated yet. This is the case immediately after
|
||
the module is created and before the module is executed
|
||
(<a class="reference internal" href="../c-api/module.html#c.Py_mod_exec" title="Py_mod_exec"><code class="xref c c-data docutils literal notranslate"><span class="pre">Py_mod_exec</span></code></a> function). More precisely, these functions are not called
|
||
if <a class="reference internal" href="../c-api/module.html#c.PyModuleDef.m_size" title="PyModuleDef.m_size"><code class="xref c c-member docutils literal notranslate"><span class="pre">m_size</span></code></a> is greater than 0 and the module state (as
|
||
returned by <a class="reference internal" href="../c-api/module.html#c.PyModule_GetState" title="PyModule_GetState"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyModule_GetState()</span></code></a>) is <code class="docutils literal notranslate"><span class="pre">NULL</span></code>.</p>
|
||
<p>Extension modules without module state (<code class="docutils literal notranslate"><span class="pre">m_size</span> <span class="pre"><=</span> <span class="pre">0</span></code>) are not affected.</p>
|
||
</li>
|
||
<li><p>If <a class="reference internal" href="../c-api/init.html#c.Py_AddPendingCall" title="Py_AddPendingCall"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_AddPendingCall()</span></code></a> is called in a subinterpreter, the function is
|
||
now scheduled to be called from the subinterpreter, rather than being called
|
||
from the main interpreter. Each subinterpreter now has its own list of
|
||
scheduled calls.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39984">bpo-39984</a>.)</p></li>
|
||
<li><p>The Windows registry is no longer used to initialize <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> when
|
||
the <code class="docutils literal notranslate"><span class="pre">-E</span></code> option is used (if <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> is set to
|
||
<code class="docutils literal notranslate"><span class="pre">0</span></code>). This is significant when embedding Python on Windows.
|
||
(Contributed by Zackery Spytz in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=8901">bpo-8901</a>.)</p></li>
|
||
<li><p>The global variable <a class="reference internal" href="../c-api/tuple.html#c.PyStructSequence_UnnamedField" title="PyStructSequence_UnnamedField"><code class="xref c c-data docutils literal notranslate"><span class="pre">PyStructSequence_UnnamedField</span></code></a> is now a constant
|
||
and refers to a constant string.
|
||
(Contributed by Serhiy Storchaka in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38650">bpo-38650</a>.)</p></li>
|
||
<li><p>The <code class="xref c c-type docutils literal notranslate"><span class="pre">PyGC_Head</span></code> structure is now opaque. It is only defined in the
|
||
internal C API (<code class="docutils literal notranslate"><span class="pre">pycore_gc.h</span></code>).
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40241">bpo-40241</a>.)</p></li>
|
||
<li><p>The <code class="docutils literal notranslate"><span class="pre">Py_UNICODE_COPY</span></code>, <code class="docutils literal notranslate"><span class="pre">Py_UNICODE_FILL</span></code>, <code class="docutils literal notranslate"><span class="pre">PyUnicode_WSTR_LENGTH</span></code>,
|
||
<code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_FromUnicode()</span></code>, <code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AsUnicode()</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">_PyUnicode_AsUnicode</span></code>, and <code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_AsUnicodeAndSize()</span></code> are
|
||
marked as deprecated in C. They have been deprecated by <span class="target" id="index-25"></span><a class="pep reference external" href="https://peps.python.org/pep-0393/"><strong>PEP 393</strong></a> since
|
||
Python 3.3.
|
||
(Contributed by Inada Naoki in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36346">bpo-36346</a>.)</p></li>
|
||
<li><p>The <a class="reference internal" href="../c-api/sys.html#c.Py_FatalError" title="Py_FatalError"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_FatalError()</span></code></a> function is replaced with a macro which logs
|
||
automatically the name of the current function, unless the
|
||
<code class="docutils literal notranslate"><span class="pre">Py_LIMITED_API</span></code> macro is defined.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39882">bpo-39882</a>.)</p></li>
|
||
<li><p>The vectorcall protocol now requires that the caller passes only strings as
|
||
keyword names. (See <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37540">bpo-37540</a> for more information.)</p></li>
|
||
<li><p>Implementation details of a number of macros and functions are now hidden:</p>
|
||
<ul class="simple">
|
||
<li><p><a class="reference internal" href="../c-api/gcsupport.html#c.PyObject_IS_GC" title="PyObject_IS_GC"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_IS_GC()</span></code></a> macro was converted to a function.</p></li>
|
||
<li><p>The <code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_NEW()</span></code> macro becomes an alias to the
|
||
<a class="reference internal" href="../c-api/allocation.html#c.PyObject_New" title="PyObject_New"><code class="xref c c-macro docutils literal notranslate"><span class="pre">PyObject_New</span></code></a> macro, and the <code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_NEW_VAR()</span></code> macro
|
||
becomes an alias to the <a class="reference internal" href="../c-api/allocation.html#c.PyObject_NewVar" title="PyObject_NewVar"><code class="xref c c-macro docutils literal notranslate"><span class="pre">PyObject_NewVar</span></code></a> macro. They no longer
|
||
access directly the <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_basicsize" title="PyTypeObject.tp_basicsize"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyTypeObject.tp_basicsize</span></code></a> member.</p></li>
|
||
<li><p><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GET_WEAKREFS_LISTPTR()</span></code> macro was converted to a function:
|
||
the macro accessed directly the <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset" title="PyTypeObject.tp_weaklistoffset"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyTypeObject.tp_weaklistoffset</span></code></a>
|
||
member.</p></li>
|
||
<li><p><a class="reference internal" href="../c-api/buffer.html#c.PyObject_CheckBuffer" title="PyObject_CheckBuffer"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_CheckBuffer()</span></code></a> macro was converted to a function: the macro
|
||
accessed directly the <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_as_buffer" title="PyTypeObject.tp_as_buffer"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyTypeObject.tp_as_buffer</span></code></a> member.</p></li>
|
||
<li><p><a class="reference internal" href="../c-api/number.html#c.PyIndex_Check" title="PyIndex_Check"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyIndex_Check()</span></code></a> is now always declared as an opaque function to hide
|
||
implementation details: removed the <code class="docutils literal notranslate"><span class="pre">PyIndex_Check()</span></code> macro. The macro accessed
|
||
directly the <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_as_number" title="PyTypeObject.tp_as_number"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyTypeObject.tp_as_number</span></code></a> member.</p></li>
|
||
</ul>
|
||
<p>(See <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40170">bpo-40170</a> for more details.)</p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
<section id="id3">
|
||
<h3>Removed<a class="headerlink" href="#id3" title="Link to this heading">¶</a></h3>
|
||
<ul>
|
||
<li><p>Excluded <code class="docutils literal notranslate"><span class="pre">PyFPE_START_PROTECT()</span></code> and <code class="docutils literal notranslate"><span class="pre">PyFPE_END_PROTECT()</span></code> macros of
|
||
<code class="docutils literal notranslate"><span class="pre">pyfpe.h</span></code> from the limited C API.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38835">bpo-38835</a>.)</p></li>
|
||
<li><p>The <code class="docutils literal notranslate"><span class="pre">tp_print</span></code> slot of <a class="reference internal" href="../c-api/typeobj.html#type-structs"><span class="std std-ref">PyTypeObject</span></a> has been removed.
|
||
It was used for printing objects to files in Python 2.7 and before. Since
|
||
Python 3.0, it has been ignored and unused.
|
||
(Contributed by Jeroen Demeyer in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36974">bpo-36974</a>.)</p></li>
|
||
<li><p>Changes in the limited C API (if <code class="docutils literal notranslate"><span class="pre">Py_LIMITED_API</span></code> macro is defined):</p>
|
||
<ul class="simple">
|
||
<li><p>Excluded the following functions from the limited C API:</p>
|
||
<ul>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyThreadState_DeleteCurrent()</span></code>
|
||
(Contributed by Joannah Nanjekye in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37878">bpo-37878</a>.)</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_CheckRecursionLimit</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_NewReference()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_ForgetReference()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_PyTraceMalloc_NewReference()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_GetRefTotal()</span></code></p></li>
|
||
<li><p>The trashcan mechanism which never worked in the limited C API.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyTrash_UNWIND_LEVEL</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Py_TRASHCAN_BEGIN_CONDITION</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Py_TRASHCAN_BEGIN</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Py_TRASHCAN_END</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Py_TRASHCAN_SAFE_BEGIN</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Py_TRASHCAN_SAFE_END</span></code></p></li>
|
||
</ul>
|
||
</li>
|
||
<li><p>Moved following functions and definitions to the internal C API:</p>
|
||
<ul>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_PyDebug_PrintTotalRefs()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_PrintReferences()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_PrintReferenceAddresses()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_tracemalloc_config</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_Py_AddToAllObjects()</span></code> (specific to <code class="docutils literal notranslate"><span class="pre">Py_TRACE_REFS</span></code> build)</p></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38644">bpo-38644</a> and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39542">bpo-39542</a>.)</p>
|
||
</li>
|
||
<li><p>Removed <code class="docutils literal notranslate"><span class="pre">_PyRuntime.getframe</span></code> hook and removed <code class="docutils literal notranslate"><span class="pre">_PyThreadState_GetFrame</span></code>
|
||
macro which was an alias to <code class="docutils literal notranslate"><span class="pre">_PyRuntime.getframe</span></code>. They were only exposed
|
||
by the internal C API. Removed also <code class="docutils literal notranslate"><span class="pre">PyThreadFrameGetter</span></code> type.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39946">bpo-39946</a>.)</p></li>
|
||
<li><p>Removed the following functions from the C API. Call <a class="reference internal" href="../c-api/gcsupport.html#c.PyGC_Collect" title="PyGC_Collect"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyGC_Collect()</span></code></a>
|
||
explicitly to clear all free lists.
|
||
(Contributed by Inada Naoki and Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=37340">bpo-37340</a>,
|
||
<a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=38896">bpo-38896</a> and <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=40428">bpo-40428</a>.)</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyAsyncGen_ClearFreeLists()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyContext_ClearFreeList()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyDict_ClearFreeList()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyFloat_ClearFreeList()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyFrame_ClearFreeList()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyList_ClearFreeList()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyMethod_ClearFreeList()</span></code> and <code class="docutils literal notranslate"><span class="pre">PyCFunction_ClearFreeList()</span></code>:
|
||
the free lists of bound method objects have been removed.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PySet_ClearFreeList()</span></code>: the set free list has been removed
|
||
in Python 3.4.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyTuple_ClearFreeList()</span></code></p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">PyUnicode_ClearFreeList()</span></code>: the Unicode free list has been removed in
|
||
Python 3.3.</p></li>
|
||
</ul>
|
||
</li>
|
||
<li><p>Removed <code class="docutils literal notranslate"><span class="pre">_PyUnicode_ClearStaticStrings()</span></code> function.
|
||
(Contributed by Victor Stinner in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39465">bpo-39465</a>.)</p></li>
|
||
<li><p>Removed <code class="docutils literal notranslate"><span class="pre">Py_UNICODE_MATCH</span></code>. It has been deprecated by <span class="target" id="index-26"></span><a class="pep reference external" href="https://peps.python.org/pep-0393/"><strong>PEP 393</strong></a>, and
|
||
broken since Python 3.3. The <a class="reference internal" href="../c-api/unicode.html#c.PyUnicode_Tailmatch" title="PyUnicode_Tailmatch"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyUnicode_Tailmatch()</span></code></a> function can be
|
||
used instead.
|
||
(Contributed by Inada Naoki in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=36346">bpo-36346</a>.)</p></li>
|
||
<li><p>Cleaned header files of interfaces defined but with no implementation.
|
||
The public API symbols being removed are:
|
||
<code class="docutils literal notranslate"><span class="pre">_PyBytes_InsertThousandsGroupingLocale</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">_PyBytes_InsertThousandsGrouping</span></code>, <code class="docutils literal notranslate"><span class="pre">_Py_InitializeFromArgs</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">_Py_InitializeFromWideArgs</span></code>, <code class="docutils literal notranslate"><span class="pre">_PyFloat_Repr</span></code>, <code class="docutils literal notranslate"><span class="pre">_PyFloat_Digits</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">_PyFloat_DigitsInit</span></code>, <code class="docutils literal notranslate"><span class="pre">PyFrame_ExtendStack</span></code>, <code class="docutils literal notranslate"><span class="pre">_PyAIterWrapper_Type</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">PyNullImporter_Type</span></code>, <code class="docutils literal notranslate"><span class="pre">PyCmpWrapper_Type</span></code>, <code class="docutils literal notranslate"><span class="pre">PySortWrapper_Type</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">PyNoArgsFunction</span></code>.
|
||
(Contributed by Pablo Galindo Salgado in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=39372">bpo-39372</a>.)</p></li>
|
||
</ul>
|
||
</section>
|
||
</section>
|
||
<section id="notable-changes-in-python-3-9-1">
|
||
<h2>Notable changes in Python 3.9.1<a class="headerlink" href="#notable-changes-in-python-3-9-1" title="Link to this heading">¶</a></h2>
|
||
<section id="id4">
|
||
<h3>typing<a class="headerlink" href="#id4" title="Link to this heading">¶</a></h3>
|
||
<p>The behavior of <a class="reference internal" href="../library/typing.html#typing.Literal" title="typing.Literal"><code class="xref py py-class docutils literal notranslate"><span class="pre">typing.Literal</span></code></a> was changed to conform with <span class="target" id="index-27"></span><a class="pep reference external" href="https://peps.python.org/pep-0586/"><strong>PEP 586</strong></a>
|
||
and to match the behavior of static type checkers specified in the PEP.</p>
|
||
<ol class="arabic">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Literal</span></code> now de-duplicates parameters.</p></li>
|
||
<li><p>Equality comparisons between <code class="docutils literal notranslate"><span class="pre">Literal</span></code> objects are now order independent.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Literal</span></code> comparisons now respect types. For example,
|
||
<code class="docutils literal notranslate"><span class="pre">Literal[0]</span> <span class="pre">==</span> <span class="pre">Literal[False]</span></code> previously evaluated to <code class="docutils literal notranslate"><span class="pre">True</span></code>. It is
|
||
now <code class="docutils literal notranslate"><span class="pre">False</span></code>. To support this change, the internally used type cache now
|
||
supports differentiating types.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Literal</span></code> objects will now raise 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> exception during
|
||
equality comparisons if any of their parameters are not <a class="reference internal" href="../glossary.html#term-hashable"><span class="xref std std-term">hashable</span></a>.
|
||
Note that declaring <code class="docutils literal notranslate"><span class="pre">Literal</span></code> with mutable parameters will not throw
|
||
an error:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </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">Literal</span>
|
||
<span class="gp">>>> </span><span class="n">Literal</span><span class="p">[{</span><span class="mi">0</span><span class="p">}]</span>
|
||
<span class="gp">>>> </span><span class="n">Literal</span><span class="p">[{</span><span class="mi">0</span><span class="p">}]</span> <span class="o">==</span> <span class="n">Literal</span><span class="p">[{</span><span class="kc">False</span><span class="p">}]</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
||
<span class="gr">TypeError</span>: <span class="n">unhashable type: 'set'</span>
|
||
</pre></div>
|
||
</div>
|
||
</li>
|
||
</ol>
|
||
<p>(Contributed by Yurii Karabas in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=42345">bpo-42345</a>.)</p>
|
||
</section>
|
||
<section id="macos-11-0-big-sur-and-apple-silicon-mac-support">
|
||
<h3>macOS 11.0 (Big Sur) and Apple Silicon Mac support<a class="headerlink" href="#macos-11-0-big-sur-and-apple-silicon-mac-support" title="Link to this heading">¶</a></h3>
|
||
<p>As of 3.9.1, Python now fully supports building and running on macOS 11.0
|
||
(Big Sur) and on Apple Silicon Macs (based on the <code class="docutils literal notranslate"><span class="pre">ARM64</span></code> architecture).
|
||
A new universal build variant, <code class="docutils literal notranslate"><span class="pre">universal2</span></code>, is now available to natively
|
||
support both <code class="docutils literal notranslate"><span class="pre">ARM64</span></code> and <code class="docutils literal notranslate"><span class="pre">Intel</span> <span class="pre">64</span></code> in one set of executables. Binaries
|
||
can also now be built on current versions of macOS to be deployed on a range
|
||
of older macOS versions (tested to 10.9) while making some newer OS
|
||
functions and options conditionally available based on the operating system
|
||
version in use at runtime (“weaklinking”).</p>
|
||
<p>(Contributed by Ronald Oussoren and Lawrence D’Anna in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=41100">bpo-41100</a>.)</p>
|
||
</section>
|
||
</section>
|
||
<section id="notable-changes-in-python-3-9-2">
|
||
<h2>Notable changes in Python 3.9.2<a class="headerlink" href="#notable-changes-in-python-3-9-2" title="Link to this heading">¶</a></h2>
|
||
<section id="collections-abc">
|
||
<h3>collections.abc<a class="headerlink" href="#collections-abc" title="Link to this heading">¶</a></h3>
|
||
<p><a class="reference internal" href="../library/collections.abc.html#collections.abc.Callable" title="collections.abc.Callable"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Callable</span></code></a> generic now flattens type parameters, similar
|
||
to what <a class="reference internal" href="../library/typing.html#typing.Callable" title="typing.Callable"><code class="xref py py-data docutils literal notranslate"><span class="pre">typing.Callable</span></code></a> currently does. This means that
|
||
<code class="docutils literal notranslate"><span class="pre">collections.abc.Callable[[int,</span> <span class="pre">str],</span> <span class="pre">str]</span></code> will have <code class="docutils literal notranslate"><span class="pre">__args__</span></code> of
|
||
<code class="docutils literal notranslate"><span class="pre">(int,</span> <span class="pre">str,</span> <span class="pre">str)</span></code>; previously this was <code class="docutils literal notranslate"><span class="pre">([int,</span> <span class="pre">str],</span> <span class="pre">str)</span></code>. To allow this
|
||
change, <a class="reference internal" href="../library/types.html#types.GenericAlias" title="types.GenericAlias"><code class="xref py py-class docutils literal notranslate"><span class="pre">types.GenericAlias</span></code></a> can now be subclassed, and a subclass will
|
||
be returned when subscripting the <a class="reference internal" href="../library/collections.abc.html#collections.abc.Callable" title="collections.abc.Callable"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Callable</span></code></a> type.
|
||
Code which accesses the arguments via <a class="reference internal" href="../library/typing.html#typing.get_args" title="typing.get_args"><code class="xref py py-func docutils literal notranslate"><span class="pre">typing.get_args()</span></code></a> or <code class="docutils literal notranslate"><span class="pre">__args__</span></code>
|
||
need to account for this change. 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> may be emitted for
|
||
invalid forms of parameterizing <a class="reference internal" href="../library/collections.abc.html#collections.abc.Callable" title="collections.abc.Callable"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Callable</span></code></a> which may have
|
||
passed silently in Python 3.9.1. This <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> will
|
||
become 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> in Python 3.10.
|
||
(Contributed by Ken Jin in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=42195">bpo-42195</a>.)</p>
|
||
</section>
|
||
<section id="urllib-parse">
|
||
<h3>urllib.parse<a class="headerlink" href="#urllib-parse" title="Link to this heading">¶</a></h3>
|
||
<p>Earlier Python versions allowed using both <code class="docutils literal notranslate"><span class="pre">;</span></code> and <code class="docutils literal notranslate"><span class="pre">&</span></code> as
|
||
query parameter separators in <a class="reference internal" href="../library/urllib.parse.html#urllib.parse.parse_qs" title="urllib.parse.parse_qs"><code class="xref py py-func docutils literal notranslate"><span class="pre">urllib.parse.parse_qs()</span></code></a> and
|
||
<a class="reference internal" href="../library/urllib.parse.html#urllib.parse.parse_qsl" title="urllib.parse.parse_qsl"><code class="xref py py-func docutils literal notranslate"><span class="pre">urllib.parse.parse_qsl()</span></code></a>. Due to security concerns, and to conform with
|
||
newer W3C recommendations, this has been changed to allow only a single
|
||
separator key, with <code class="docutils literal notranslate"><span class="pre">&</span></code> as the default. This change also affects
|
||
<code class="xref py py-func docutils literal notranslate"><span class="pre">cgi.parse()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">cgi.parse_multipart()</span></code> as they use the affected
|
||
functions internally. For more details, please see their respective
|
||
documentation.
|
||
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=42967">bpo-42967</a>.)</p>
|
||
</section>
|
||
</section>
|
||
<section id="notable-changes-in-python-3-9-3">
|
||
<h2>Notable changes in Python 3.9.3<a class="headerlink" href="#notable-changes-in-python-3-9-3" title="Link to this heading">¶</a></h2>
|
||
<p>A security fix alters the <a class="reference internal" href="../library/ftplib.html#ftplib.FTP" title="ftplib.FTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">ftplib.FTP</span></code></a> behavior to not trust the
|
||
IPv4 address sent from the remote server when setting up a passive data
|
||
channel. We reuse the ftp server IP address instead. For unusual code
|
||
requiring the old behavior, set a <code class="docutils literal notranslate"><span class="pre">trust_server_pasv_ipv4_address</span></code>
|
||
attribute on your FTP instance to <code class="docutils literal notranslate"><span class="pre">True</span></code>. (See <a class="reference external" href="https://github.com/python/cpython/issues/87451">gh-87451</a>)</p>
|
||
</section>
|
||
<section id="notable-changes-in-python-3-9-5">
|
||
<h2>Notable changes in Python 3.9.5<a class="headerlink" href="#notable-changes-in-python-3-9-5" title="Link to this heading">¶</a></h2>
|
||
<section id="id5">
|
||
<h3>urllib.parse<a class="headerlink" href="#id5" title="Link to this heading">¶</a></h3>
|
||
<p>The presence of newline or tab characters in parts of a URL allows for some
|
||
forms of attacks. Following the WHATWG specification that updates <span class="target" id="index-28"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc3986.html"><strong>RFC 3986</strong></a>,
|
||
ASCII newline <code class="docutils literal notranslate"><span class="pre">\n</span></code>, <code class="docutils literal notranslate"><span class="pre">\r</span></code> and tab <code class="docutils literal notranslate"><span class="pre">\t</span></code> characters are stripped from the
|
||
URL by the parser in <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> preventing such attacks. The removal
|
||
characters are controlled by a new module level variable
|
||
<code class="docutils literal notranslate"><span class="pre">urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE</span></code>. (See <a class="reference external" href="https://github.com/python/cpython/issues/88048">gh-88048</a>)</p>
|
||
</section>
|
||
</section>
|
||
<section id="notable-security-feature-in-3-9-14">
|
||
<h2>Notable security feature in 3.9.14<a class="headerlink" href="#notable-security-feature-in-3-9-14" title="Link to this heading">¶</a></h2>
|
||
<p>Converting between <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> and <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> in bases other than 2
|
||
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
|
||
now raises a <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> if the number of digits in string form is
|
||
above a limit to avoid potential denial of service attacks due to the
|
||
algorithmic complexity. This is a mitigation for <span class="target" id="index-29"></span><a class="cve reference external" href="https://www.cve.org/CVERecord?id=CVE-2020-10735"><strong>CVE 2020-10735</strong></a>.
|
||
This limit can be configured or disabled by environment variable, command
|
||
line flag, or <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> APIs. See the <a class="reference internal" href="../library/stdtypes.html#int-max-str-digits"><span class="std std-ref">integer string conversion
|
||
length limitation</span></a> documentation. The default limit
|
||
is 4300 digits in string form.</p>
|
||
</section>
|
||
<section id="notable-changes-in-3-9-17">
|
||
<h2>Notable changes in 3.9.17<a class="headerlink" href="#notable-changes-in-3-9-17" title="Link to this heading">¶</a></h2>
|
||
<section id="tarfile">
|
||
<h3>tarfile<a class="headerlink" href="#tarfile" title="Link to this heading">¶</a></h3>
|
||
<ul class="simple">
|
||
<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">Extraction filters</span></a> for details.
|
||
In Python 3.12, use without the <em>filter</em> argument will show 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>.
|
||
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-30"></span><a class="pep reference external" href="https://peps.python.org/pep-0706/"><strong>PEP 706</strong></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="#">What’s New In Python 3.9</a><ul>
|
||
<li><a class="reference internal" href="#summary-release-highlights">Summary – Release highlights</a></li>
|
||
<li><a class="reference internal" href="#you-should-check-for-deprecationwarning-in-your-code">You should check for DeprecationWarning in your code</a></li>
|
||
<li><a class="reference internal" href="#new-features">New Features</a><ul>
|
||
<li><a class="reference internal" href="#dictionary-merge-update-operators">Dictionary Merge & Update Operators</a></li>
|
||
<li><a class="reference internal" href="#new-string-methods-to-remove-prefixes-and-suffixes">New String Methods to Remove Prefixes and Suffixes</a></li>
|
||
<li><a class="reference internal" href="#type-hinting-generics-in-standard-collections">Type Hinting Generics in Standard Collections</a></li>
|
||
<li><a class="reference internal" href="#new-parser">New Parser</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><ul>
|
||
<li><a class="reference internal" href="#zoneinfo">zoneinfo</a></li>
|
||
<li><a class="reference internal" href="#graphlib">graphlib</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#improved-modules">Improved Modules</a><ul>
|
||
<li><a class="reference internal" href="#ast">ast</a></li>
|
||
<li><a class="reference internal" href="#asyncio">asyncio</a></li>
|
||
<li><a class="reference internal" href="#compileall">compileall</a></li>
|
||
<li><a class="reference internal" href="#concurrent-futures">concurrent.futures</a></li>
|
||
<li><a class="reference internal" href="#curses">curses</a></li>
|
||
<li><a class="reference internal" href="#datetime">datetime</a></li>
|
||
<li><a class="reference internal" href="#distutils">distutils</a></li>
|
||
<li><a class="reference internal" href="#fcntl">fcntl</a></li>
|
||
<li><a class="reference internal" href="#ftplib">ftplib</a></li>
|
||
<li><a class="reference internal" href="#gc">gc</a></li>
|
||
<li><a class="reference internal" href="#hashlib">hashlib</a></li>
|
||
<li><a class="reference internal" href="#http">http</a></li>
|
||
<li><a class="reference internal" href="#idle-and-idlelib">IDLE and idlelib</a></li>
|
||
<li><a class="reference internal" href="#imaplib">imaplib</a></li>
|
||
<li><a class="reference internal" href="#importlib">importlib</a></li>
|
||
<li><a class="reference internal" href="#inspect">inspect</a></li>
|
||
<li><a class="reference internal" href="#ipaddress">ipaddress</a></li>
|
||
<li><a class="reference internal" href="#math">math</a></li>
|
||
<li><a class="reference internal" href="#multiprocessing">multiprocessing</a></li>
|
||
<li><a class="reference internal" href="#nntplib">nntplib</a></li>
|
||
<li><a class="reference internal" href="#os">os</a></li>
|
||
<li><a class="reference internal" href="#pathlib">pathlib</a></li>
|
||
<li><a class="reference internal" href="#pdb">pdb</a></li>
|
||
<li><a class="reference internal" href="#poplib">poplib</a></li>
|
||
<li><a class="reference internal" href="#pprint">pprint</a></li>
|
||
<li><a class="reference internal" href="#pydoc">pydoc</a></li>
|
||
<li><a class="reference internal" href="#random">random</a></li>
|
||
<li><a class="reference internal" href="#signal">signal</a></li>
|
||
<li><a class="reference internal" href="#smtplib">smtplib</a></li>
|
||
<li><a class="reference internal" href="#socket">socket</a></li>
|
||
<li><a class="reference internal" href="#time">time</a></li>
|
||
<li><a class="reference internal" href="#sys">sys</a></li>
|
||
<li><a class="reference internal" href="#tracemalloc">tracemalloc</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="#venv">venv</a></li>
|
||
<li><a class="reference internal" href="#xml">xml</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#optimizations">Optimizations</a></li>
|
||
<li><a class="reference internal" href="#deprecated">Deprecated</a></li>
|
||
<li><a class="reference internal" href="#removed">Removed</a></li>
|
||
<li><a class="reference internal" href="#porting-to-python-3-9">Porting to Python 3.9</a><ul>
|
||
<li><a class="reference internal" href="#changes-in-the-python-api">Changes in the Python API</a></li>
|
||
<li><a class="reference internal" href="#changes-in-the-c-api">Changes in the C API</a></li>
|
||
<li><a class="reference internal" href="#cpython-bytecode-changes">CPython bytecode changes</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="#id1">New Features</a></li>
|
||
<li><a class="reference internal" href="#id2">Porting to Python 3.9</a></li>
|
||
<li><a class="reference internal" href="#id3">Removed</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#notable-changes-in-python-3-9-1">Notable changes in Python 3.9.1</a><ul>
|
||
<li><a class="reference internal" href="#id4">typing</a></li>
|
||
<li><a class="reference internal" href="#macos-11-0-big-sur-and-apple-silicon-mac-support">macOS 11.0 (Big Sur) and Apple Silicon Mac support</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#notable-changes-in-python-3-9-2">Notable changes in Python 3.9.2</a><ul>
|
||
<li><a class="reference internal" href="#collections-abc">collections.abc</a></li>
|
||
<li><a class="reference internal" href="#urllib-parse">urllib.parse</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#notable-changes-in-python-3-9-3">Notable changes in Python 3.9.3</a></li>
|
||
<li><a class="reference internal" href="#notable-changes-in-python-3-9-5">Notable changes in Python 3.9.5</a><ul>
|
||
<li><a class="reference internal" href="#id5">urllib.parse</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#notable-security-feature-in-3-9-14">Notable security feature in 3.9.14</a></li>
|
||
<li><a class="reference internal" href="#notable-changes-in-3-9-17">Notable changes in 3.9.17</a><ul>
|
||
<li><a class="reference internal" href="#tarfile">tarfile</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
</div>
|
||
<div>
|
||
<h4>Previous topic</h4>
|
||
<p class="topless"><a href="3.10.html"
|
||
title="previous chapter">What’s New In Python 3.10</a></p>
|
||
</div>
|
||
<div>
|
||
<h4>Next topic</h4>
|
||
<p class="topless"><a href="3.8.html"
|
||
title="next chapter">What’s New In Python 3.8</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.9.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.8.html" title="What’s New In Python 3.8"
|
||
>next</a> |</li>
|
||
<li class="right" >
|
||
<a href="3.10.html" title="What’s New In Python 3.10"
|
||
>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> »</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> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >What’s New in Python</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">What’s New In Python 3.9</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">
|
||
©
|
||
<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> |