123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
- <meta property="og:title" content="What’s New in Python 2.4" />
- <meta property="og:type" content="website" />
- <meta property="og:url" content="https://docs.python.org/3/whatsnew/2.4.html" />
- <meta property="og:site_name" content="Python documentation" />
- <meta property="og:description" content="Author, A.M. Kuchling,. This article explains the new features in Python 2.4.1, released on March 30, 2005. Python 2.4 is a medium-sized release. It doesn’t introduce as many changes as the radical..." />
- <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="Author, A.M. Kuchling,. This article explains the new features in Python 2.4.1, released on March 30, 2005. Python 2.4 is a medium-sized release. It doesn’t introduce as many changes as the radical..." />
- <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 2.4 — Python 3.12.0 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
-
- <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
- <link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?digest=b37c26da2f7529d09fe70b41c4b2133fe4931a90" />
- <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css" />
-
- <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
- <script src="../_static/jquery.js"></script>
- <script src="../_static/underscore.js"></script>
- <script src="../_static/doctools.js"></script>
-
- <script src="../_static/sidebar.js"></script>
-
- <link rel="search" type="application/opensearchdescription+xml"
- title="Search within Python 3.12.0 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 2.3" href="2.3.html" />
- <link rel="prev" title="What’s New in Python 2.5" href="2.5.html" />
- <link rel="canonical" href="https://docs.python.org/3/whatsnew/2.4.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/themetoggle.js"></script>
- </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="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 2.4</a><ul>
- <li><a class="reference internal" href="#pep-218-built-in-set-objects">PEP 218: Built-In Set Objects</a></li>
- <li><a class="reference internal" href="#pep-237-unifying-long-integers-and-integers">PEP 237: Unifying Long Integers and Integers</a></li>
- <li><a class="reference internal" href="#pep-289-generator-expressions">PEP 289: Generator Expressions</a></li>
- <li><a class="reference internal" href="#pep-292-simpler-string-substitutions">PEP 292: Simpler String Substitutions</a></li>
- <li><a class="reference internal" href="#pep-318-decorators-for-functions-and-methods">PEP 318: Decorators for Functions and Methods</a></li>
- <li><a class="reference internal" href="#pep-322-reverse-iteration">PEP 322: Reverse Iteration</a></li>
- <li><a class="reference internal" href="#pep-324-new-subprocess-module">PEP 324: New subprocess Module</a></li>
- <li><a class="reference internal" href="#pep-327-decimal-data-type">PEP 327: Decimal Data Type</a><ul>
- <li><a class="reference internal" href="#why-is-decimal-needed">Why is Decimal needed?</a></li>
- <li><a class="reference internal" href="#the-decimal-type">The <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> type</a></li>
- <li><a class="reference internal" href="#the-context-type">The <code class="xref py py-class docutils literal notranslate"><span class="pre">Context</span></code> type</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#pep-328-multi-line-imports">PEP 328: Multi-line Imports</a></li>
- <li><a class="reference internal" href="#pep-331-locale-independent-float-string-conversions">PEP 331: Locale-Independent Float/String Conversions</a></li>
- <li><a class="reference internal" href="#other-language-changes">Other Language Changes</a><ul>
- <li><a class="reference internal" href="#optimizations">Optimizations</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#new-improved-and-deprecated-modules">New, Improved, and Deprecated Modules</a><ul>
- <li><a class="reference internal" href="#cookielib">cookielib</a></li>
- <li><a class="reference internal" href="#doctest">doctest</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#build-and-c-api-changes">Build and C API Changes</a><ul>
- <li><a class="reference internal" href="#port-specific-changes">Port-Specific Changes</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#porting-to-python-2-4">Porting to Python 2.4</a></li>
- <li><a class="reference internal" href="#acknowledgements">Acknowledgements</a></li>
- </ul>
- </li>
- </ul>
- </div>
- <div>
- <h4>Previous topic</h4>
- <p class="topless"><a href="2.5.html"
- title="previous chapter">What’s New in Python 2.5</a></p>
- </div>
- <div>
- <h4>Next topic</h4>
- <p class="topless"><a href="2.3.html"
- title="next chapter">What’s New in Python 2.3</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/2.4.rst"
- rel="nofollow">Show Source
- </a>
- </li>
- </ul>
- </div>
- </nav>
- </div>
- </div>
-
- <div class="related" role="navigation" aria-label="related navigation">
- <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="2.3.html" title="What’s New in Python 2.3"
- accesskey="N">next</a> |</li>
- <li class="right" >
- <a href="2.5.html" title="What’s New in Python 2.5"
- 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.12.0 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 2.4</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" />
- <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-2-4">
- <h1>What’s New in Python 2.4<a class="headerlink" href="#what-s-new-in-python-2-4" title="Permalink to this headline">¶</a></h1>
- <dl class="field-list simple">
- <dt class="field-odd">Author</dt>
- <dd class="field-odd"><p>A.M. Kuchling</p>
- </dd>
- </dl>
- <p>This article explains the new features in Python 2.4.1, released on March 30,
- 2005.</p>
- <p>Python 2.4 is a medium-sized release. It doesn’t introduce as many changes as
- the radical Python 2.2, but introduces more features than the conservative 2.3
- release. The most significant new language features are function decorators and
- generator expressions; most other changes are to the standard library.</p>
- <p>According to the CVS change logs, there were 481 patches applied and 502 bugs
- fixed between Python 2.3 and 2.4. Both figures are likely to be underestimates.</p>
- <p>This article doesn’t attempt to provide a complete specification of every single
- new feature, but instead provides a brief introduction to each feature. For
- full details, you should refer to the documentation for Python 2.4, such as the
- Python Library Reference and the Python Reference Manual. Often you will be
- referred to the PEP for a particular new feature for explanations of the
- implementation and design rationale.</p>
- <section id="pep-218-built-in-set-objects">
- <h2>PEP 218: Built-In Set Objects<a class="headerlink" href="#pep-218-built-in-set-objects" title="Permalink to this headline">¶</a></h2>
- <p>Python 2.3 introduced the <code class="xref py py-mod docutils literal notranslate"><span class="pre">sets</span></code> module. C implementations of set data
- types have now been added to the Python core as two new built-in types,
- <code class="docutils literal notranslate"><span class="pre">set(iterable)</span></code> and <code class="docutils literal notranslate"><span class="pre">frozenset(iterable)</span></code>. They provide high speed
- operations for membership testing, for eliminating duplicates from sequences,
- and for mathematical operations like unions, intersections, differences, and
- symmetric differences.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">a</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="s1">'abracadabra'</span><span class="p">)</span> <span class="c1"># form a set from a string</span>
- <span class="gp">>>> </span><span class="s1">'z'</span> <span class="ow">in</span> <span class="n">a</span> <span class="c1"># fast membership testing</span>
- <span class="go">False</span>
- <span class="gp">>>> </span><span class="n">a</span> <span class="c1"># unique letters in a</span>
- <span class="go">set(['a', 'r', 'b', 'c', 'd'])</span>
- <span class="gp">>>> </span><span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="c1"># convert back into a string</span>
- <span class="go">'arbcd'</span>
- <span class="gp">>>> </span><span class="n">b</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="s1">'alacazam'</span><span class="p">)</span> <span class="c1"># form a second set</span>
- <span class="gp">>>> </span><span class="n">a</span> <span class="o">-</span> <span class="n">b</span> <span class="c1"># letters in a but not in b</span>
- <span class="go">set(['r', 'd', 'b'])</span>
- <span class="gp">>>> </span><span class="n">a</span> <span class="o">|</span> <span class="n">b</span> <span class="c1"># letters in either a or b</span>
- <span class="go">set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])</span>
- <span class="gp">>>> </span><span class="n">a</span> <span class="o">&</span> <span class="n">b</span> <span class="c1"># letters in both a and b</span>
- <span class="go">set(['a', 'c'])</span>
- <span class="gp">>>> </span><span class="n">a</span> <span class="o">^</span> <span class="n">b</span> <span class="c1"># letters in a or b but not both</span>
- <span class="go">set(['r', 'd', 'b', 'm', 'z', 'l'])</span>
- <span class="gp">>>> </span><span class="n">a</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s1">'z'</span><span class="p">)</span> <span class="c1"># add a new element</span>
- <span class="gp">>>> </span><span class="n">a</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="s1">'wxy'</span><span class="p">)</span> <span class="c1"># add multiple new elements</span>
- <span class="gp">>>> </span><span class="n">a</span>
- <span class="go">set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'x', 'z'])</span>
- <span class="gp">>>> </span><span class="n">a</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s1">'x'</span><span class="p">)</span> <span class="c1"># take one element out</span>
- <span class="gp">>>> </span><span class="n">a</span>
- <span class="go">set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'z'])</span>
- </pre></div>
- </div>
- <p>The <a class="reference internal" href="../library/stdtypes.html#frozenset" title="frozenset"><code class="xref py py-func docutils literal notranslate"><span class="pre">frozenset()</span></code></a> type is an immutable version of <a class="reference internal" href="../library/stdtypes.html#set" title="set"><code class="xref py py-func docutils literal notranslate"><span class="pre">set()</span></code></a>. Since it is
- immutable and hashable, it may be used as a dictionary key or as a member of
- another set.</p>
- <p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">sets</span></code> module remains in the standard library, and may be useful if you
- wish to subclass the <code class="xref py py-class docutils literal notranslate"><span class="pre">Set</span></code> or <code class="xref py py-class docutils literal notranslate"><span class="pre">ImmutableSet</span></code> classes. There are
- currently no plans to deprecate the module.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-0"></span><a class="pep reference external" href="https://peps.python.org/pep-0218/"><strong>PEP 218</strong></a> - Adding a Built-In Set Object Type</dt><dd><p>Originally proposed by Greg Wilson and ultimately implemented by Raymond
- Hettinger.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-237-unifying-long-integers-and-integers">
- <h2>PEP 237: Unifying Long Integers and Integers<a class="headerlink" href="#pep-237-unifying-long-integers-and-integers" title="Permalink to this headline">¶</a></h2>
- <p>The lengthy transition process for this PEP, begun in Python 2.2, takes another
- step forward in Python 2.4. In 2.3, certain integer operations that would
- behave differently after int/long unification triggered <a class="reference internal" href="../library/exceptions.html#FutureWarning" title="FutureWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">FutureWarning</span></code></a>
- warnings and returned values limited to 32 or 64 bits (depending on your
- platform). In 2.4, these expressions no longer produce a warning and instead
- produce a different result that’s usually a long integer.</p>
- <p>The problematic expressions are primarily left shifts and lengthy hexadecimal
- and octal constants. For example, <code class="docutils literal notranslate"><span class="pre">2</span> <span class="pre"><<</span> <span class="pre">32</span></code> results in a warning in 2.3,
- evaluating to 0 on 32-bit platforms. In Python 2.4, this expression now returns
- the correct answer, 8589934592.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-1"></span><a class="pep reference external" href="https://peps.python.org/pep-0237/"><strong>PEP 237</strong></a> - Unifying Long Integers and Integers</dt><dd><p>Original PEP written by Moshe Zadka and GvR. The changes for 2.4 were
- implemented by Kalle Svensson.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-289-generator-expressions">
- <h2>PEP 289: Generator Expressions<a class="headerlink" href="#pep-289-generator-expressions" title="Permalink to this headline">¶</a></h2>
- <p>The iterator feature introduced in Python 2.2 and the <a class="reference internal" href="../library/itertools.html#module-itertools" title="itertools: Functions creating iterators for efficient looping."><code class="xref py py-mod docutils literal notranslate"><span class="pre">itertools</span></code></a> module
- make it easier to write programs that loop through large data sets without
- having the entire data set in memory at one time. List comprehensions don’t fit
- into this picture very well because they produce a Python list object containing
- all of the items. This unavoidably pulls all of the objects into memory, which
- can be a problem if your data set is very large. When trying to write a
- functionally styled program, it would be natural to write something like:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">links</span> <span class="o">=</span> <span class="p">[</span><span class="n">link</span> <span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">get_all_links</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">link</span><span class="o">.</span><span class="n">followed</span><span class="p">]</span>
- <span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">links</span><span class="p">:</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>instead of</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">get_all_links</span><span class="p">():</span>
- <span class="k">if</span> <span class="n">link</span><span class="o">.</span><span class="n">followed</span><span class="p">:</span>
- <span class="k">continue</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>The first form is more concise and perhaps more readable, but if you’re dealing
- with a large number of link objects you’d have to write the second form to avoid
- having all link objects in memory at the same time.</p>
- <p>Generator expressions work similarly to list comprehensions but don’t
- materialize the entire list; instead they create a generator that will return
- elements one by one. The above example could be written as:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">links</span> <span class="o">=</span> <span class="p">(</span><span class="n">link</span> <span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">get_all_links</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">link</span><span class="o">.</span><span class="n">followed</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">links</span><span class="p">:</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>Generator expressions always have to be written inside parentheses, as in the
- above example. The parentheses signalling a function call also count, so if you
- want to create an iterator that will be immediately passed to a function you
- could write:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="nb">sum</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">count</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">list_all_objects</span><span class="p">())</span>
- </pre></div>
- </div>
- <p>Generator expressions differ from list comprehensions in various small ways.
- Most notably, the loop variable (<em>obj</em> in the above example) is not accessible
- outside of the generator expression. List comprehensions leave the variable
- assigned to its last value; future versions of Python will change this, making
- list comprehensions match generator expressions in this respect.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-2"></span><a class="pep reference external" href="https://peps.python.org/pep-0289/"><strong>PEP 289</strong></a> - Generator Expressions</dt><dd><p>Proposed by Raymond Hettinger and implemented by Jiwon Seo with early efforts
- steered by Hye-Shik Chang.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-292-simpler-string-substitutions">
- <h2>PEP 292: Simpler String Substitutions<a class="headerlink" href="#pep-292-simpler-string-substitutions" title="Permalink to this headline">¶</a></h2>
- <p>Some new classes in the standard library provide an alternative mechanism for
- substituting variables into strings; this style of substitution may be better
- for applications where untrained users need to edit templates.</p>
- <p>The usual way of substituting variables by name is the <code class="docutils literal notranslate"><span class="pre">%</span></code> operator:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s1">'</span><span class="si">%(page)i</span><span class="s1">: </span><span class="si">%(title)s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">{</span><span class="s1">'page'</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="s1">'title'</span><span class="p">:</span> <span class="s1">'The Best of Times'</span><span class="p">}</span>
- <span class="go">'2: The Best of Times'</span>
- </pre></div>
- </div>
- <p>When writing the template string, it can be easy to forget the <code class="docutils literal notranslate"><span class="pre">i</span></code> or <code class="docutils literal notranslate"><span class="pre">s</span></code>
- after the closing parenthesis. This isn’t a big problem if the template is in a
- Python module, because you run the code, get an “Unsupported format character”
- <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>, and fix the problem. However, consider an application such
- as Mailman where template strings or translations are being edited by users who
- aren’t aware of the Python language. The format string’s syntax is complicated
- to explain to such users, and if they make a mistake, it’s difficult to provide
- helpful feedback to them.</p>
- <p>PEP 292 adds a <code class="xref py py-class docutils literal notranslate"><span class="pre">Template</span></code> class to the <a class="reference internal" href="../library/string.html#module-string" title="string: Common string operations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">string</span></code></a> module that uses
- <code class="docutils literal notranslate"><span class="pre">$</span></code> to indicate a substitution:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">string</span>
- <span class="gp">>>> </span><span class="n">t</span> <span class="o">=</span> <span class="n">string</span><span class="o">.</span><span class="n">Template</span><span class="p">(</span><span class="s1">'$page: $title'</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="n">t</span><span class="o">.</span><span class="n">substitute</span><span class="p">({</span><span class="s1">'page'</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="s1">'title'</span><span class="p">:</span> <span class="s1">'The Best of Times'</span><span class="p">})</span>
- <span class="go">'2: The Best of Times'</span>
- </pre></div>
- </div>
- <p>If a key is missing from the dictionary, the <code class="xref py py-meth docutils literal notranslate"><span class="pre">substitute()</span></code> method will
- raise a <a class="reference internal" href="../library/exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyError</span></code></a>. There’s also a <code class="xref py py-meth docutils literal notranslate"><span class="pre">safe_substitute()</span></code> method that
- ignores missing keys:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">t</span> <span class="o">=</span> <span class="n">string</span><span class="o">.</span><span class="n">Template</span><span class="p">(</span><span class="s1">'$page: $title'</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="n">t</span><span class="o">.</span><span class="n">safe_substitute</span><span class="p">({</span><span class="s1">'page'</span><span class="p">:</span><span class="mi">3</span><span class="p">})</span>
- <span class="go">'3: $title'</span>
- </pre></div>
- </div>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-3"></span><a class="pep reference external" href="https://peps.python.org/pep-0292/"><strong>PEP 292</strong></a> - Simpler String Substitutions</dt><dd><p>Written and implemented by Barry Warsaw.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-318-decorators-for-functions-and-methods">
- <h2>PEP 318: Decorators for Functions and Methods<a class="headerlink" href="#pep-318-decorators-for-functions-and-methods" title="Permalink to this headline">¶</a></h2>
- <p>Python 2.2 extended Python’s object model by adding static methods and class
- methods, but it didn’t extend Python’s syntax to provide any new way of defining
- static or class methods. Instead, you had to write a <a class="reference internal" href="../reference/compound_stmts.html#def"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">def</span></code></a> statement
- in the usual way, and pass the resulting method to a <a class="reference internal" href="../library/functions.html#staticmethod" title="staticmethod"><code class="xref py py-func docutils literal notranslate"><span class="pre">staticmethod()</span></code></a> or
- <a class="reference internal" href="../library/functions.html#classmethod" title="classmethod"><code class="xref py py-func docutils literal notranslate"><span class="pre">classmethod()</span></code></a> function that would wrap up the function as a method of the
- new type. Your code would look like this:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">C</span><span class="p">:</span>
- <span class="k">def</span> <span class="nf">meth</span> <span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
- <span class="o">...</span>
- <span class="n">meth</span> <span class="o">=</span> <span class="nb">classmethod</span><span class="p">(</span><span class="n">meth</span><span class="p">)</span> <span class="c1"># Rebind name to wrapped-up class method</span>
- </pre></div>
- </div>
- <p>If the method was very long, it would be easy to miss or forget the
- <a class="reference internal" href="../library/functions.html#classmethod" title="classmethod"><code class="xref py py-func docutils literal notranslate"><span class="pre">classmethod()</span></code></a> invocation after the function body.</p>
- <p>The intention was always to add some syntax to make such definitions more
- readable, but at the time of 2.2’s release a good syntax was not obvious. Today
- a good syntax <em>still</em> isn’t obvious but users are asking for easier access to
- the feature; a new syntactic feature has been added to meet this need.</p>
- <p>The new feature is called “function decorators”. The name comes from the idea
- that <a class="reference internal" href="../library/functions.html#classmethod" title="classmethod"><code class="xref py py-func docutils literal notranslate"><span class="pre">classmethod()</span></code></a>, <a class="reference internal" href="../library/functions.html#staticmethod" title="staticmethod"><code class="xref py py-func docutils literal notranslate"><span class="pre">staticmethod()</span></code></a>, and friends are storing
- additional information on a function object; they’re <em>decorating</em> functions with
- more details.</p>
- <p>The notation borrows from Java and uses the <code class="docutils literal notranslate"><span class="pre">'@'</span></code> character as an indicator.
- Using the new syntax, the example above would be written:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">C</span><span class="p">:</span>
- <span class="nd">@classmethod</span>
- <span class="k">def</span> <span class="nf">meth</span> <span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>The <code class="docutils literal notranslate"><span class="pre">@classmethod</span></code> is shorthand for the <code class="docutils literal notranslate"><span class="pre">meth=classmethod(meth)</span></code> assignment.
- More generally, if you have the following:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="nd">@A</span>
- <span class="nd">@B</span>
- <span class="nd">@C</span>
- <span class="k">def</span> <span class="nf">f</span> <span class="p">():</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>It’s equivalent to the following pre-decorator code:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">f</span><span class="p">():</span> <span class="o">...</span>
- <span class="n">f</span> <span class="o">=</span> <span class="n">A</span><span class="p">(</span><span class="n">B</span><span class="p">(</span><span class="n">C</span><span class="p">(</span><span class="n">f</span><span class="p">)))</span>
- </pre></div>
- </div>
- <p>Decorators must come on the line before a function definition, one decorator per
- line, and can’t be on the same line as the def statement, meaning that <code class="docutils literal notranslate"><span class="pre">@A</span> <span class="pre">def</span>
- <span class="pre">f():</span> <span class="pre">...</span></code> is illegal. You can only decorate function definitions, either at
- the module level or inside a class; you can’t decorate class definitions.</p>
- <p>A decorator is just a function that takes the function to be decorated as an
- argument and returns either the same function or some new object. The return
- value of the decorator need not be callable (though it typically is), unless
- further decorators will be applied to the result. It’s easy to write your own
- decorators. The following simple example just sets an attribute on the function
- object:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">deco</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
- <span class="gp">... </span> <span class="n">func</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="s1">'decorated'</span>
- <span class="gp">... </span> <span class="k">return</span> <span class="n">func</span>
- <span class="gp">...</span>
- <span class="gp">>>> </span><span class="nd">@deco</span>
- <span class="gp">... </span><span class="k">def</span> <span class="nf">f</span><span class="p">():</span> <span class="k">pass</span>
- <span class="gp">...</span>
- <span class="gp">>>> </span><span class="n">f</span>
- <span class="go"><function f at 0x402ef0d4></span>
- <span class="gp">>>> </span><span class="n">f</span><span class="o">.</span><span class="n">attr</span>
- <span class="go">'decorated'</span>
- <span class="gp">>>></span>
- </pre></div>
- </div>
- <p>As a slightly more realistic example, the following decorator checks that the
- supplied argument is an integer:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">require_int</span> <span class="p">(</span><span class="n">func</span><span class="p">):</span>
- <span class="k">def</span> <span class="nf">wrapper</span> <span class="p">(</span><span class="n">arg</span><span class="p">):</span>
- <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">wrapper</span>
- <span class="nd">@require_int</span>
- <span class="k">def</span> <span class="nf">p1</span> <span class="p">(</span><span class="n">arg</span><span class="p">):</span>
- <span class="nb">print</span> <span class="n">arg</span>
- <span class="nd">@require_int</span>
- <span class="k">def</span> <span class="nf">p2</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
- <span class="nb">print</span> <span class="n">arg</span><span class="o">*</span><span class="mi">2</span>
- </pre></div>
- </div>
- <p>An example in <span class="target" id="index-4"></span><a class="pep reference external" href="https://peps.python.org/pep-0318/"><strong>PEP 318</strong></a> contains a fancier version of this idea that lets you
- both specify the required type and check the returned type.</p>
- <p>Decorator functions can take arguments. If arguments are supplied, your
- decorator function is called with only those arguments and must return a new
- decorator function; this function must take a single function and return a
- function, as previously described. In other words, <code class="docutils literal notranslate"><span class="pre">@A</span> <span class="pre">@B</span> <span class="pre">@C(args)</span></code> becomes:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">f</span><span class="p">():</span> <span class="o">...</span>
- <span class="n">_deco</span> <span class="o">=</span> <span class="n">C</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
- <span class="n">f</span> <span class="o">=</span> <span class="n">A</span><span class="p">(</span><span class="n">B</span><span class="p">(</span><span class="n">_deco</span><span class="p">(</span><span class="n">f</span><span class="p">)))</span>
- </pre></div>
- </div>
- <p>Getting this right can be slightly brain-bending, but it’s not too difficult.</p>
- <p>A small related change makes the <code class="xref py py-attr docutils literal notranslate"><span class="pre">func_name</span></code> attribute of functions
- writable. This attribute is used to display function names in tracebacks, so
- decorators should change the name of any new function that’s constructed and
- returned.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-5"></span><a class="pep reference external" href="https://peps.python.org/pep-0318/"><strong>PEP 318</strong></a> - Decorators for Functions, Methods and Classes</dt><dd><p>Written by Kevin D. Smith, Jim Jewett, and Skip Montanaro. Several people
- wrote patches implementing function decorators, but the one that was actually
- checked in was patch #979728, written by Mark Russell.</p>
- </dd>
- <dt><a class="reference external" href="https://wiki.python.org/moin/PythonDecoratorLibrary">https://wiki.python.org/moin/PythonDecoratorLibrary</a></dt><dd><p>This Wiki page contains several examples of decorators.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-322-reverse-iteration">
- <h2>PEP 322: Reverse Iteration<a class="headerlink" href="#pep-322-reverse-iteration" title="Permalink to this headline">¶</a></h2>
- <p>A new built-in function, <code class="docutils literal notranslate"><span class="pre">reversed(seq)</span></code>, takes a sequence and returns an
- iterator that loops over the elements of the sequence in reverse order.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">)):</span>
- <span class="gp">... </span> <span class="nb">print</span> <span class="n">i</span>
- <span class="gp">...</span>
- <span class="go">3</span>
- <span class="go">2</span>
- <span class="go">1</span>
- </pre></div>
- </div>
- <p>Compared to extended slicing, such as <code class="docutils literal notranslate"><span class="pre">range(1,4)[::-1]</span></code>, <a class="reference internal" href="../library/functions.html#reversed" title="reversed"><code class="xref py py-func docutils literal notranslate"><span class="pre">reversed()</span></code></a> is
- easier to read, runs faster, and uses substantially less memory.</p>
- <p>Note that <a class="reference internal" href="../library/functions.html#reversed" title="reversed"><code class="xref py py-func docutils literal notranslate"><span class="pre">reversed()</span></code></a> only accepts sequences, not arbitrary iterators. If
- you want to reverse an iterator, first convert it to a list with <a class="reference internal" href="../library/stdtypes.html#list" title="list"><code class="xref py py-func docutils literal notranslate"><span class="pre">list()</span></code></a>.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">input</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'/etc/passwd'</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">input</span><span class="p">)):</span>
- <span class="gp">... </span> <span class="nb">print</span> <span class="n">line</span>
- <span class="gp">...</span>
- <span class="go">root:*:0:0:System Administrator:/var/root:/bin/tcsh</span>
- <span class="go"> ...</span>
- </pre></div>
- </div>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-6"></span><a class="pep reference external" href="https://peps.python.org/pep-0322/"><strong>PEP 322</strong></a> - Reverse Iteration</dt><dd><p>Written and implemented by Raymond Hettinger.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-324-new-subprocess-module">
- <h2>PEP 324: New subprocess Module<a class="headerlink" href="#pep-324-new-subprocess-module" title="Permalink to this headline">¶</a></h2>
- <p>The standard library provides a number of ways to execute a subprocess, offering
- different features and different levels of complexity.
- <code class="docutils literal notranslate"><span class="pre">os.system(command)</span></code> is easy to use, but slow (it runs a shell process
- which executes the command) and dangerous (you have to be careful about escaping
- the shell’s metacharacters). The <code class="xref py py-mod docutils literal notranslate"><span class="pre">popen2</span></code> module offers classes that can
- capture standard output and standard error from the subprocess, but the naming
- is confusing. 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 cleans this up, providing a unified
- interface that offers all the features you might need.</p>
- <p>Instead of <code class="xref py py-mod docutils literal notranslate"><span class="pre">popen2</span></code>’s collection of classes, <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> contains a
- single class called <code class="xref py py-class docutils literal notranslate"><span class="pre">Popen</span></code> whose constructor supports a number of
- different keyword arguments.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Popen</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">bufsize</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">executable</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
- <span class="n">stdin</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">stderr</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
- <span class="n">preexec_fn</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">close_fds</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
- <span class="n">cwd</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">universal_newlines</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
- <span class="n">startupinfo</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">creationflags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
- </pre></div>
- </div>
- <p><em>args</em> is commonly a sequence of strings that will be the arguments to the
- program executed as the subprocess. (If the <em>shell</em> argument is true, <em>args</em>
- can be a string which will then be passed on to the shell for interpretation,
- just as <a class="reference internal" href="../library/os.html#os.system" title="os.system"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.system()</span></code></a> does.)</p>
- <p><em>stdin</em>, <em>stdout</em>, and <em>stderr</em> specify what the subprocess’s input, output, and
- error streams will be. You can provide a file object or a file descriptor, or
- you can use the constant <code class="docutils literal notranslate"><span class="pre">subprocess.PIPE</span></code> to create a pipe between the
- subprocess and the parent.</p>
- <p id="index-7">The constructor has a number of handy options:</p>
- <ul class="simple">
- <li><p><em>close_fds</em> requests that all file descriptors be closed before running the
- subprocess.</p></li>
- <li><p><em>cwd</em> specifies the working directory in which the subprocess will be executed
- (defaulting to whatever the parent’s working directory is).</p></li>
- <li><p><em>env</em> is a dictionary specifying environment variables.</p></li>
- <li><p><em>preexec_fn</em> is a function that gets called before the child is started.</p></li>
- <li><p><em>universal_newlines</em> opens the child’s input and output using Python’s
- <a class="reference internal" href="../glossary.html#term-universal-newlines"><span class="xref std std-term">universal newlines</span></a> feature.</p></li>
- </ul>
- <p>Once you’ve created the <code class="xref py py-class docutils literal notranslate"><span class="pre">Popen</span></code> instance, you can call its <code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code>
- method to pause until the subprocess has exited, <code class="xref py py-meth docutils literal notranslate"><span class="pre">poll()</span></code> to check if it’s
- exited without pausing, or <code class="docutils literal notranslate"><span class="pre">communicate(data)</span></code> to send the string <em>data</em>
- to the subprocess’s standard input. <code class="docutils literal notranslate"><span class="pre">communicate(data)</span></code> then reads any
- data that the subprocess has sent to its standard output or standard error,
- returning a tuple <code class="docutils literal notranslate"><span class="pre">(stdout_data,</span> <span class="pre">stderr_data)</span></code>.</p>
- <p><code class="xref py py-func docutils literal notranslate"><span class="pre">call()</span></code> is a shortcut that passes its arguments along to the <code class="xref py py-class docutils literal notranslate"><span class="pre">Popen</span></code>
- constructor, waits for the command to complete, and returns the status code of
- the subprocess. It can serve as a safer analog to <a class="reference internal" href="../library/os.html#os.system" title="os.system"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.system()</span></code></a>:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">sts</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">([</span><span class="s1">'dpkg'</span><span class="p">,</span> <span class="s1">'-i'</span><span class="p">,</span> <span class="s1">'/tmp/new-package.deb'</span><span class="p">])</span>
- <span class="k">if</span> <span class="n">sts</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
- <span class="c1"># Success</span>
- <span class="o">...</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># dpkg returned an error</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>The command is invoked without use of the shell. If you really do want to use
- the shell, you can add <code class="docutils literal notranslate"><span class="pre">shell=True</span></code> as a keyword argument and provide a string
- instead of a sequence:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">sts</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="s1">'dpkg -i /tmp/new-package.deb'</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>The PEP takes various examples of shell and Python code and shows how they’d be
- translated into Python code that uses <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>. Reading this section
- of the PEP is highly recommended.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-8"></span><a class="pep reference external" href="https://peps.python.org/pep-0324/"><strong>PEP 324</strong></a> - subprocess - New process module</dt><dd><p>Written and implemented by Peter Åstrand, with assistance from Fredrik Lundh and
- others.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-327-decimal-data-type">
- <h2>PEP 327: Decimal Data Type<a class="headerlink" href="#pep-327-decimal-data-type" title="Permalink to this headline">¶</a></h2>
- <p>Python has always supported floating-point (FP) numbers, based on the underlying
- C <span class="c-expr sig sig-inline c"><span class="kt">double</span></span> type, as a data type. However, while most programming
- languages provide a floating-point type, many people (even programmers) are
- unaware that floating-point numbers don’t represent certain decimal fractions
- accurately. The new <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> type can represent these fractions
- accurately, up to a user-specified precision limit.</p>
- <section id="why-is-decimal-needed">
- <h3>Why is Decimal needed?<a class="headerlink" href="#why-is-decimal-needed" title="Permalink to this headline">¶</a></h3>
- <p>The limitations arise from the representation used for floating-point numbers.
- FP numbers are made up of three components:</p>
- <ul class="simple">
- <li><p>The sign, which is positive or negative.</p></li>
- <li><p>The mantissa, which is a single-digit binary number followed by a fractional
- part. For example, <code class="docutils literal notranslate"><span class="pre">1.01</span></code> in base-2 notation is <code class="docutils literal notranslate"><span class="pre">1</span> <span class="pre">+</span> <span class="pre">0/2</span> <span class="pre">+</span> <span class="pre">1/4</span></code>, or 1.25 in
- decimal notation.</p></li>
- <li><p>The exponent, which tells where the decimal point is located in the number
- represented.</p></li>
- </ul>
- <p>For example, the number 1.25 has positive sign, a mantissa value of 1.01 (in
- binary), and an exponent of 0 (the decimal point doesn’t need to be shifted).
- The number 5 has the same sign and mantissa, but the exponent is 2 because the
- mantissa is multiplied by 4 (2 to the power of the exponent 2); 1.25 * 4 equals
- 5.</p>
- <p>Modern systems usually provide floating-point support that conforms to a
- standard called IEEE 754. C’s <span class="c-expr sig sig-inline c"><span class="kt">double</span></span> type is usually implemented as a
- 64-bit IEEE 754 number, which uses 52 bits of space for the mantissa. This
- means that numbers can only be specified to 52 bits of precision. If you’re
- trying to represent numbers whose expansion repeats endlessly, the expansion is
- cut off after 52 bits. Unfortunately, most software needs to produce output in
- base 10, and common fractions in base 10 are often repeating decimals in binary.
- For example, 1.1 decimal is binary <code class="docutils literal notranslate"><span class="pre">1.0001100110011</span> <span class="pre">...</span></code>; .1 = 1/16 + 1/32 +
- 1/256 plus an infinite number of additional terms. IEEE 754 has to chop off
- that infinitely repeated decimal after 52 digits, so the representation is
- slightly inaccurate.</p>
- <p>Sometimes you can see this inaccuracy when the number is printed:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="mf">1.1</span>
- <span class="go">1.1000000000000001</span>
- </pre></div>
- </div>
- <p>The inaccuracy isn’t always visible when you print the number because the
- FP-to-decimal-string conversion is provided by the C library, and most C libraries try
- to produce sensible output. Even if it’s not displayed, however, the inaccuracy
- is still there and subsequent operations can magnify the error.</p>
- <p>For many applications this doesn’t matter. If I’m plotting points and
- displaying them on my monitor, the difference between 1.1 and 1.1000000000000001
- is too small to be visible. Reports often limit output to a certain number of
- decimal places, and if you round the number to two or three or even eight
- decimal places, the error is never apparent. However, for applications where it
- does matter, it’s a lot of work to implement your own custom arithmetic
- routines.</p>
- <p>Hence, the <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> type was created.</p>
- </section>
- <section id="the-decimal-type">
- <h3>The <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> type<a class="headerlink" href="#the-decimal-type" title="Permalink to this headline">¶</a></h3>
- <p>A new module, <a class="reference internal" href="../library/decimal.html#module-decimal" title="decimal: Implementation of the General Decimal Arithmetic Specification."><code class="xref py py-mod docutils literal notranslate"><span class="pre">decimal</span></code></a>, was added to Python’s standard library. It
- contains two classes, <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> and <code class="xref py py-class docutils literal notranslate"><span class="pre">Context</span></code>. <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code>
- instances represent numbers, and <code class="xref py py-class docutils literal notranslate"><span class="pre">Context</span></code> instances are used to wrap up
- various settings such as the precision and default rounding mode.</p>
- <p><code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> instances are immutable, like regular Python integers and FP
- numbers; once it’s been created, you can’t change the value an instance
- represents. <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> instances can be created from integers or
- strings:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">decimal</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">1972</span><span class="p">)</span>
- <span class="go">Decimal("1972")</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s2">"1.1"</span><span class="p">)</span>
- <span class="go">Decimal("1.1")</span>
- </pre></div>
- </div>
- <p>You can also provide tuples containing the sign, the mantissa represented as a
- tuple of decimal digits, and the exponent:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="o">-</span><span class="mi">2</span><span class="p">))</span>
- <span class="go">Decimal("-14.75")</span>
- </pre></div>
- </div>
- <p>Cautionary note: the sign bit is a Boolean value, so 0 is positive and 1 is
- negative.</p>
- <p>Converting from floating-point numbers poses a bit of a problem: should the FP
- number representing 1.1 turn into the decimal number for exactly 1.1, or for 1.1
- plus whatever inaccuracies are introduced? The decision was to dodge the issue
- and leave such a conversion out of the API. Instead, you should convert the
- floating-point number into a string using the desired precision and pass the
- string to the <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> constructor:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">f</span> <span class="o">=</span> <span class="mf">1.1</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
- <span class="go">Decimal("1.1")</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s1">'</span><span class="si">%.12f</span><span class="s1">'</span> <span class="o">%</span> <span class="n">f</span><span class="p">)</span>
- <span class="go">Decimal("1.100000000000")</span>
- </pre></div>
- </div>
- <p>Once you have <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> instances, you can perform the usual mathematical
- operations on them. One limitation: exponentiation requires an integer
- exponent:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">a</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s1">'35.72'</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="n">b</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s1">'1.73'</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="n">a</span><span class="o">+</span><span class="n">b</span>
- <span class="go">Decimal("37.45")</span>
- <span class="gp">>>> </span><span class="n">a</span><span class="o">-</span><span class="n">b</span>
- <span class="go">Decimal("33.99")</span>
- <span class="gp">>>> </span><span class="n">a</span><span class="o">*</span><span class="n">b</span>
- <span class="go">Decimal("61.7956")</span>
- <span class="gp">>>> </span><span class="n">a</span><span class="o">/</span><span class="n">b</span>
- <span class="go">Decimal("20.64739884393063583815028902")</span>
- <span class="gp">>>> </span><span class="n">a</span> <span class="o">**</span> <span class="mi">2</span>
- <span class="go">Decimal("1275.9184")</span>
- <span class="gp">>>> </span><span class="n">a</span><span class="o">**</span><span class="n">b</span>
- <span class="gt">Traceback (most recent call last):</span>
- <span class="w"> </span><span class="c">...</span>
- <span class="gr">decimal.InvalidOperation</span>: <span class="n">x ** (non-integer)</span>
- </pre></div>
- </div>
- <p>You can combine <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> instances with integers, but not with
- floating-point numbers:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">a</span> <span class="o">+</span> <span class="mi">4</span>
- <span class="go">Decimal("39.72")</span>
- <span class="gp">>>> </span><span class="n">a</span> <span class="o">+</span> <span class="mf">4.5</span>
- <span class="gt">Traceback (most recent call last):</span>
- <span class="w"> </span><span class="c">...</span>
- <span class="gr">TypeError</span>: <span class="n">You can interact Decimal only with int, long or Decimal data types.</span>
- <span class="gp">>>></span>
- </pre></div>
- </div>
- <p><code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> numbers can be used with the <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> and <a class="reference internal" href="../library/cmath.html#module-cmath" title="cmath: Mathematical functions for complex numbers."><code class="xref py py-mod docutils literal notranslate"><span class="pre">cmath</span></code></a>
- modules, but note that they’ll be immediately converted to floating-point
- numbers before the operation is performed, resulting in a possible loss of
- precision and accuracy. You’ll also get back a regular floating-point number
- and not a <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code>.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">math</span><span class="o">,</span> <span class="nn">cmath</span>
- <span class="gp">>>> </span><span class="n">d</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="s1">'123456789012.345'</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
- <span class="go">351364.18288201344</span>
- <span class="gp">>>> </span><span class="n">cmath</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="o">-</span><span class="n">d</span><span class="p">)</span>
- <span class="go">351364.18288201344j</span>
- </pre></div>
- </div>
- <p><code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> instances have a <code class="xref py py-meth docutils literal notranslate"><span class="pre">sqrt()</span></code> method that returns a
- <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code>, but if you need other things such as trigonometric functions
- you’ll have to implement them.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">d</span><span class="o">.</span><span class="n">sqrt</span><span class="p">()</span>
- <span class="go">Decimal("351364.1828820134592177245001")</span>
- </pre></div>
- </div>
- </section>
- <section id="the-context-type">
- <h3>The <code class="xref py py-class docutils literal notranslate"><span class="pre">Context</span></code> type<a class="headerlink" href="#the-context-type" title="Permalink to this headline">¶</a></h3>
- <p>Instances of the <code class="xref py py-class docutils literal notranslate"><span class="pre">Context</span></code> class encapsulate several settings for
- decimal operations:</p>
- <ul class="simple">
- <li><p><code class="xref py py-attr docutils literal notranslate"><span class="pre">prec</span></code> is the precision, the number of decimal places.</p></li>
- <li><p><code class="xref py py-attr docutils literal notranslate"><span class="pre">rounding</span></code> specifies the rounding mode. The <a class="reference internal" href="../library/decimal.html#module-decimal" title="decimal: Implementation of the General Decimal Arithmetic Specification."><code class="xref py py-mod docutils literal notranslate"><span class="pre">decimal</span></code></a> module has
- constants for the various possibilities: <code class="xref py py-const docutils literal notranslate"><span class="pre">ROUND_DOWN</span></code>,
- <code class="xref py py-const docutils literal notranslate"><span class="pre">ROUND_CEILING</span></code>, <code class="xref py py-const docutils literal notranslate"><span class="pre">ROUND_HALF_EVEN</span></code>, and various others.</p></li>
- <li><p><code class="xref py py-attr docutils literal notranslate"><span class="pre">traps</span></code> is a dictionary specifying what happens on encountering certain
- error conditions: either an exception is raised or a value is returned. Some
- examples of error conditions are division by zero, loss of precision, and
- overflow.</p></li>
- </ul>
- <p>There’s a thread-local default context available by calling <code class="xref py py-func docutils literal notranslate"><span class="pre">getcontext()</span></code>;
- you can change the properties of this context to alter the default precision,
- rounding, or trap handling. The following example shows the effect of changing
- the precision of the default context:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span><span class="o">.</span><span class="n">prec</span>
- <span class="go">28</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
- <span class="go">Decimal("0.1428571428571428571428571429")</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span><span class="o">.</span><span class="n">prec</span> <span class="o">=</span> <span class="mi">9</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
- <span class="go">Decimal("0.142857143")</span>
- </pre></div>
- </div>
- <p>The default action for error conditions is selectable; the module can either
- return a special value such as infinity or not-a-number, or exceptions can be
- raised:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
- <span class="gt">Traceback (most recent call last):</span>
- <span class="w"> </span><span class="c">...</span>
- <span class="gr">decimal.DivisionByZero</span>: <span class="n">x / 0</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">getcontext</span><span class="p">()</span><span class="o">.</span><span class="n">traps</span><span class="p">[</span><span class="n">decimal</span><span class="o">.</span><span class="n">DivisionByZero</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="gp">>>> </span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
- <span class="go">Decimal("Infinity")</span>
- <span class="gp">>>></span>
- </pre></div>
- </div>
- <p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">Context</span></code> instance also has various methods for formatting numbers
- such as <code class="xref py py-meth docutils literal notranslate"><span class="pre">to_eng_string()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">to_sci_string()</span></code>.</p>
- <p>For more information, see the documentation for the <a class="reference internal" href="../library/decimal.html#module-decimal" title="decimal: Implementation of the General Decimal Arithmetic Specification."><code class="xref py py-mod docutils literal notranslate"><span class="pre">decimal</span></code></a> module, which
- includes a quick-start tutorial and a reference.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-9"></span><a class="pep reference external" href="https://peps.python.org/pep-0327/"><strong>PEP 327</strong></a> - Decimal Data Type</dt><dd><p>Written by Facundo Batista and implemented by Facundo Batista, Eric Price,
- Raymond Hettinger, Aahz, and Tim Peters.</p>
- </dd>
- <dt><a class="reference external" href="http://www.lahey.com/float.htm">http://www.lahey.com/float.htm</a></dt><dd><p>The article uses Fortran code to illustrate many of the problems that
- floating-point inaccuracy can cause.</p>
- </dd>
- <dt><a class="reference external" href="http://speleotrove.com/decimal/">http://speleotrove.com/decimal/</a></dt><dd><p>A description of a decimal-based representation. This representation is being
- proposed as a standard, and underlies the new Python decimal type. Much of this
- material was written by Mike Cowlishaw, designer of the Rexx language.</p>
- </dd>
- </dl>
- </div>
- </section>
- </section>
- <section id="pep-328-multi-line-imports">
- <h2>PEP 328: Multi-line Imports<a class="headerlink" href="#pep-328-multi-line-imports" title="Permalink to this headline">¶</a></h2>
- <p>One language change is a small syntactic tweak aimed at making it easier to
- import many names from a module. In a <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">module</span> <span class="pre">import</span> <span class="pre">names</span></code> statement,
- <em>names</em> is a sequence of names separated by commas. If the sequence is very
- long, you can either write multiple imports from the same module, or you can use
- backslashes to escape the line endings like this:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">SimpleXMLRPCServer</span> <span class="kn">import</span> <span class="n">SimpleXMLRPCServer</span><span class="p">,</span>\
- <span class="n">SimpleXMLRPCRequestHandler</span><span class="p">,</span>\
- <span class="n">CGIXMLRPCRequestHandler</span><span class="p">,</span>\
- <span class="n">resolve_dotted_attribute</span>
- </pre></div>
- </div>
- <p>The syntactic change in Python 2.4 simply allows putting the names within
- parentheses. Python ignores newlines within a parenthesized expression, so the
- backslashes are no longer needed:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">SimpleXMLRPCServer</span> <span class="kn">import</span> <span class="p">(</span><span class="n">SimpleXMLRPCServer</span><span class="p">,</span>
- <span class="n">SimpleXMLRPCRequestHandler</span><span class="p">,</span>
- <span class="n">CGIXMLRPCRequestHandler</span><span class="p">,</span>
- <span class="n">resolve_dotted_attribute</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>The PEP also proposes that all <a class="reference internal" href="../reference/simple_stmts.html#import"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">import</span></code></a> statements be absolute imports,
- with a leading <code class="docutils literal notranslate"><span class="pre">.</span></code> character to indicate a relative import. This part of the
- PEP was not implemented for Python 2.4, but was completed for Python 2.5.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-10"></span><a class="pep reference external" href="https://peps.python.org/pep-0328/"><strong>PEP 328</strong></a> - Imports: Multi-Line and Absolute/Relative</dt><dd><p>Written by Aahz. Multi-line imports were implemented by Dima Dorfman.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-331-locale-independent-float-string-conversions">
- <h2>PEP 331: Locale-Independent Float/String Conversions<a class="headerlink" href="#pep-331-locale-independent-float-string-conversions" title="Permalink to this headline">¶</a></h2>
- <p>The <a class="reference internal" href="../library/locale.html#module-locale" title="locale: Internationalization services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">locale</span></code></a> modules lets Python software select various conversions and
- display conventions that are localized to a particular country or language.
- However, the module was careful to not change the numeric locale because various
- functions in Python’s implementation required that the numeric locale remain set
- to the <code class="docutils literal notranslate"><span class="pre">'C'</span></code> locale. Often this was because the code was using the C
- library’s <code class="xref c c-func docutils literal notranslate"><span class="pre">atof()</span></code> function.</p>
- <p>Not setting the numeric locale caused trouble for extensions that used third-party
- C libraries, however, because they wouldn’t have the correct locale set.
- The motivating example was GTK+, whose user interface widgets weren’t displaying
- numbers in the current locale.</p>
- <p>The solution described in the PEP is to add three new functions to the Python
- API that perform ASCII-only conversions, ignoring the locale setting:</p>
- <ul class="simple">
- <li><p><code class="docutils literal notranslate"><span class="pre">PyOS_ascii_strtod(str,</span> <span class="pre">ptr)</span></code> and <code class="docutils literal notranslate"><span class="pre">PyOS_ascii_atof(str,</span> <span class="pre">ptr)</span></code>
- both convert a string to a C <span class="c-expr sig sig-inline c"><span class="kt">double</span></span>.</p></li>
- <li><p><code class="docutils literal notranslate"><span class="pre">PyOS_ascii_formatd(buffer,</span> <span class="pre">buf_len,</span> <span class="pre">format,</span> <span class="pre">d)</span></code> converts a
- <span class="c-expr sig sig-inline c"><span class="kt">double</span></span> to an ASCII string.</p></li>
- </ul>
- <p>The code for these functions came from the GLib library
- (<a class="reference external" href="https://developer-old.gnome.org/glib/2.26/">https://developer-old.gnome.org/glib/2.26/</a>), whose developers kindly
- relicensed the relevant functions and donated them to the Python Software
- Foundation. The <a class="reference internal" href="../library/locale.html#module-locale" title="locale: Internationalization services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">locale</span></code></a> module can now change the numeric locale,
- letting extensions such as GTK+ produce the correct results.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-11"></span><a class="pep reference external" href="https://peps.python.org/pep-0331/"><strong>PEP 331</strong></a> - Locale-Independent Float/String Conversions</dt><dd><p>Written by Christian R. Reis, and implemented by Gustavo Carneiro.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="other-language-changes">
- <h2>Other Language Changes<a class="headerlink" href="#other-language-changes" title="Permalink to this headline">¶</a></h2>
- <p>Here are all of the changes that Python 2.4 makes to the core Python language.</p>
- <ul>
- <li><p>Decorators for functions and methods were added (<span class="target" id="index-12"></span><a class="pep reference external" href="https://peps.python.org/pep-0318/"><strong>PEP 318</strong></a>).</p></li>
- <li><p>Built-in <a class="reference internal" href="../library/stdtypes.html#set" title="set"><code class="xref py py-func docutils literal notranslate"><span class="pre">set()</span></code></a> and <a class="reference internal" href="../library/stdtypes.html#frozenset" title="frozenset"><code class="xref py py-func docutils literal notranslate"><span class="pre">frozenset()</span></code></a> types were added (<span class="target" id="index-13"></span><a class="pep reference external" href="https://peps.python.org/pep-0218/"><strong>PEP 218</strong></a>).
- Other new built-ins include the <code class="docutils literal notranslate"><span class="pre">reversed(seq)</span></code> function (<span class="target" id="index-14"></span><a class="pep reference external" href="https://peps.python.org/pep-0322/"><strong>PEP 322</strong></a>).</p></li>
- <li><p>Generator expressions were added (<span class="target" id="index-15"></span><a class="pep reference external" href="https://peps.python.org/pep-0289/"><strong>PEP 289</strong></a>).</p></li>
- <li><p>Certain numeric expressions no longer return values restricted to 32 or 64
- bits (<span class="target" id="index-16"></span><a class="pep reference external" href="https://peps.python.org/pep-0237/"><strong>PEP 237</strong></a>).</p></li>
- <li><p>You can now put parentheses around the list of names in a <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">module</span> <span class="pre">import</span>
- <span class="pre">names</span></code> statement (<span class="target" id="index-17"></span><a class="pep reference external" href="https://peps.python.org/pep-0328/"><strong>PEP 328</strong></a>).</p></li>
- <li><p>The <a class="reference internal" href="../library/stdtypes.html#dict.update" title="dict.update"><code class="xref py py-meth docutils literal notranslate"><span class="pre">dict.update()</span></code></a> method now accepts the same argument forms as the
- <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> constructor. This includes any mapping, any iterable of key/value
- pairs, and keyword arguments. (Contributed by Raymond Hettinger.)</p></li>
- <li><p>The string methods <code class="xref py py-meth docutils literal notranslate"><span class="pre">ljust()</span></code>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">rjust()</span></code>, and <code class="xref py py-meth docutils literal notranslate"><span class="pre">center()</span></code> now take
- an optional argument for specifying a fill character other than a space.
- (Contributed by Raymond Hettinger.)</p></li>
- <li><p>Strings also gained an <code class="xref py py-meth docutils literal notranslate"><span class="pre">rsplit()</span></code> method that works like the <code class="xref py py-meth docutils literal notranslate"><span class="pre">split()</span></code>
- method but splits from the end of the string. (Contributed by Sean
- Reifschneider.)</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s1">'www.python.org'</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
- <span class="go">['www', 'python.org']</span>
- <span class="go">'www.python.org'.rsplit('.', 1)</span>
- <span class="go">['www.python', 'org']</span>
- </pre></div>
- </div>
- </li>
- <li><p>Three keyword parameters, <em>cmp</em>, <em>key</em>, and <em>reverse</em>, were added to the
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">sort()</span></code> method of lists. These parameters make some common usages of
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">sort()</span></code> simpler. All of these parameters are optional.</p>
- <p>For the <em>cmp</em> parameter, the value should be a comparison function that takes
- two parameters and returns -1, 0, or +1 depending on how the parameters compare.
- This function will then be used to sort the list. Previously this was the only
- parameter that could be provided to <code class="xref py py-meth docutils literal notranslate"><span class="pre">sort()</span></code>.</p>
- <p><em>key</em> should be a single-parameter function that takes a list element and
- returns a comparison key for the element. The list is then sorted using the
- comparison keys. The following example sorts a list case-insensitively:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'A'</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">,</span> <span class="s1">'D'</span><span class="p">]</span>
- <span class="gp">>>> </span><span class="n">L</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> <span class="c1"># Case-sensitive sort</span>
- <span class="gp">>>> </span><span class="n">L</span>
- <span class="go">['A', 'D', 'b', 'c']</span>
- <span class="gp">>>> </span><span class="c1"># Using 'key' parameter to sort list</span>
- <span class="gp">>>> </span><span class="n">L</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
- <span class="gp">>>> </span><span class="n">L</span>
- <span class="go">['A', 'b', 'c', 'D']</span>
- <span class="gp">>>> </span><span class="c1"># Old-fashioned way</span>
- <span class="gp">>>> </span><span class="n">L</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">cmp</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">cmp</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">y</span><span class="o">.</span><span class="n">lower</span><span class="p">()))</span>
- <span class="gp">>>> </span><span class="n">L</span>
- <span class="go">['A', 'b', 'c', 'D']</span>
- </pre></div>
- </div>
- <p>The last example, which uses the <em>cmp</em> parameter, is the old way to perform a
- case-insensitive sort. It works but is slower than using a <em>key</em> parameter.
- Using <em>key</em> calls <code class="xref py py-meth docutils literal notranslate"><span class="pre">lower()</span></code> method once for each element in the list while
- using <em>cmp</em> will call it twice for each comparison, so using <em>key</em> saves on
- invocations of the <code class="xref py py-meth docutils literal notranslate"><span class="pre">lower()</span></code> method.</p>
- <p>For simple key functions and comparison functions, it is often possible to avoid
- a <a class="reference internal" href="../reference/expressions.html#lambda"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">lambda</span></code></a> expression by using an unbound method instead. For example,
- the above case-insensitive sort is best written as:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="nb">str</span><span class="o">.</span><span class="n">lower</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="n">L</span>
- <span class="go">['A', 'b', 'c', 'D']</span>
- </pre></div>
- </div>
- <p>Finally, the <em>reverse</em> parameter takes a Boolean value. If the value is true,
- the list will be sorted into reverse order. Instead of <code class="docutils literal notranslate"><span class="pre">L.sort();</span>
- <span class="pre">L.reverse()</span></code>, you can now write <code class="docutils literal notranslate"><span class="pre">L.sort(reverse=True)</span></code>.</p>
- <p>The results of sorting are now guaranteed to be stable. This means that two
- entries with equal keys will be returned in the same order as they were input.
- For example, you can sort a list of people by name, and then sort the list by
- age, resulting in a list sorted by age where people with the same age are in
- name-sorted order.</p>
- <p>(All changes to <code class="xref py py-meth docutils literal notranslate"><span class="pre">sort()</span></code> contributed by Raymond Hettinger.)</p>
- </li>
- <li><p>There is a new built-in function <code class="docutils literal notranslate"><span class="pre">sorted(iterable)</span></code> that works like the
- in-place <a class="reference internal" href="../library/stdtypes.html#list.sort" title="list.sort"><code class="xref py py-meth docutils literal notranslate"><span class="pre">list.sort()</span></code></a> method but can be used in expressions. The
- differences are:</p></li>
- <li><p>the input may be any iterable;</p></li>
- <li><p>a newly formed copy is sorted, leaving the original intact; and</p></li>
- <li><p>the expression returns the new sorted copy</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="mi">9</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">5</span><span class="p">]</span>
- <span class="gp">>>> </span><span class="p">[</span><span class="mi">10</span><span class="o">+</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">L</span><span class="p">)]</span> <span class="c1"># usable in a list comprehension</span>
- <span class="go">[11, 12, 13, 14, 15, 16, 17, 18, 19]</span>
- <span class="gp">>>> </span><span class="n">L</span> <span class="c1"># original is left unchanged</span>
- <span class="go">[9,7,8,3,2,4,1,6,5]</span>
- <span class="gp">>>> </span><span class="nb">sorted</span><span class="p">(</span><span class="s1">'Monty Python'</span><span class="p">)</span> <span class="c1"># any iterable may be an input</span>
- <span class="go">[' ', 'M', 'P', 'h', 'n', 'n', 'o', 'o', 't', 't', 'y', 'y']</span>
- <span class="gp">>>> </span><span class="c1"># List the contents of a dict sorted by key values</span>
- <span class="gp">>>> </span><span class="n">colormap</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">red</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">blue</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">green</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">black</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">yellow</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">colormap</span><span class="o">.</span><span class="n">iteritems</span><span class="p">()):</span>
- <span class="gp">... </span> <span class="nb">print</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span>
- <span class="gp">...</span>
- <span class="go">black 4</span>
- <span class="go">blue 2</span>
- <span class="go">green 3</span>
- <span class="go">red 1</span>
- <span class="go">yellow 5</span>
- </pre></div>
- </div>
- <p>(Contributed by Raymond Hettinger.)</p>
- </li>
- <li><p>Integer operations will no longer trigger an <code class="xref py py-exc docutils literal notranslate"><span class="pre">OverflowWarning</span></code>. The
- <code class="xref py py-exc docutils literal notranslate"><span class="pre">OverflowWarning</span></code> warning will disappear in Python 2.5.</p></li>
- <li><p>The interpreter gained a new switch, <a class="reference internal" href="../using/cmdline.html#cmdoption-m"><code class="xref std std-option docutils literal notranslate"><span class="pre">-m</span></code></a>, that takes a name, searches
- for the corresponding module on <code class="docutils literal notranslate"><span class="pre">sys.path</span></code>, and runs the module as a script.
- For example, you can now run the Python profiler with <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">profile</span></code>.
- (Contributed by Nick Coghlan.)</p></li>
- <li><p>The <code class="docutils literal notranslate"><span class="pre">eval(expr,</span> <span class="pre">globals,</span> <span class="pre">locals)</span></code> and <code class="docutils literal notranslate"><span class="pre">execfile(filename,</span> <span class="pre">globals,</span>
- <span class="pre">locals)</span></code> functions and the <code class="docutils literal notranslate"><span class="pre">exec</span></code> statement now accept any mapping type
- for the <em>locals</em> parameter. Previously this had to be a regular Python
- dictionary. (Contributed by Raymond Hettinger.)</p></li>
- <li><p>The <a class="reference internal" href="../library/functions.html#zip" title="zip"><code class="xref py py-func docutils literal notranslate"><span class="pre">zip()</span></code></a> built-in function and <code class="xref py py-func docutils literal notranslate"><span class="pre">itertools.izip()</span></code> now return an
- empty list if called with no arguments. Previously they raised 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. This makes them more suitable for use with variable
- length argument lists:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">transpose</span><span class="p">(</span><span class="n">array</span><span class="p">):</span>
- <span class="gp">... </span> <span class="k">return</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">array</span><span class="p">)</span>
- <span class="gp">...</span>
- <span class="gp">>>> </span><span class="n">transpose</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">)])</span>
- <span class="go">[(1, 4), (2, 5), (3, 6)]</span>
- <span class="gp">>>> </span><span class="n">transpose</span><span class="p">([])</span>
- <span class="go">[]</span>
- </pre></div>
- </div>
- <p>(Contributed by Raymond Hettinger.)</p>
- </li>
- <li><p>Encountering a failure while importing a module no longer leaves a partially initialized
- module object in <code class="docutils literal notranslate"><span class="pre">sys.modules</span></code>. The incomplete module object left
- behind would fool further imports of the same module into succeeding, leading to
- confusing errors. (Fixed by Tim Peters.)</p></li>
- <li><p><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> is now a constant; code that binds a new value to the name
- <code class="docutils literal notranslate"><span class="pre">None</span></code> is now a syntax error. (Contributed by Raymond Hettinger.)</p></li>
- </ul>
- <section id="optimizations">
- <h3>Optimizations<a class="headerlink" href="#optimizations" title="Permalink to this headline">¶</a></h3>
- <ul class="simple">
- <li><p>The inner loops for list and tuple slicing were optimized and now run about
- one-third faster. The inner loops for dictionaries were also optimized,
- resulting in performance boosts for <code class="xref py py-meth docutils literal notranslate"><span class="pre">keys()</span></code>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">values()</span></code>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">items()</span></code>,
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">iterkeys()</span></code>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">itervalues()</span></code>, and <code class="xref py py-meth docutils literal notranslate"><span class="pre">iteritems()</span></code>. (Contributed by
- Raymond Hettinger.)</p></li>
- <li><p>The machinery for growing and shrinking lists was optimized for speed and for
- space efficiency. Appending and popping from lists now runs faster due to more
- efficient code paths and less frequent use of the underlying system
- <code class="xref c c-func docutils literal notranslate"><span class="pre">realloc()</span></code>. List comprehensions also benefit. <code class="xref py py-meth docutils literal notranslate"><span class="pre">list.extend()</span></code> was
- also optimized and no longer converts its argument into a temporary list before
- extending the base list. (Contributed by Raymond Hettinger.)</p></li>
- <li><p><a class="reference internal" href="../library/stdtypes.html#list" title="list"><code class="xref py py-func docutils literal notranslate"><span class="pre">list()</span></code></a>, <a class="reference internal" href="../library/stdtypes.html#tuple" title="tuple"><code class="xref py py-func docutils literal notranslate"><span class="pre">tuple()</span></code></a>, <a class="reference internal" href="../library/functions.html#map" title="map"><code class="xref py py-func docutils literal notranslate"><span class="pre">map()</span></code></a>, <a class="reference internal" href="../library/functions.html#filter" title="filter"><code class="xref py py-func docutils literal notranslate"><span class="pre">filter()</span></code></a>, and <a class="reference internal" href="../library/functions.html#zip" title="zip"><code class="xref py py-func docutils literal notranslate"><span class="pre">zip()</span></code></a> now
- run several times faster with non-sequence arguments that supply a
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">__len__()</span></code> method. (Contributed by Raymond Hettinger.)</p></li>
- <li><p>The methods <code class="xref py py-meth docutils literal notranslate"><span class="pre">list.__getitem__()</span></code>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">dict.__getitem__()</span></code>, and
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">dict.__contains__()</span></code> are now implemented as <code class="xref py py-class docutils literal notranslate"><span class="pre">method_descriptor</span></code>
- objects rather than <code class="xref py py-class docutils literal notranslate"><span class="pre">wrapper_descriptor</span></code> objects. This form of access
- doubles their performance and makes them more suitable for use as arguments to
- functionals: <code class="docutils literal notranslate"><span class="pre">map(mydict.__getitem__,</span> <span class="pre">keylist)</span></code>. (Contributed by Raymond
- Hettinger.)</p></li>
- <li><p>Added a new opcode, <code class="docutils literal notranslate"><span class="pre">LIST_APPEND</span></code>, that simplifies the generated bytecode
- for list comprehensions and speeds them up by about a third. (Contributed by
- Raymond Hettinger.)</p></li>
- <li><p>The peephole bytecode optimizer has been improved to produce shorter, faster
- bytecode; remarkably, the resulting bytecode is more readable. (Enhanced by
- Raymond Hettinger.)</p></li>
- <li><p>String concatenations in statements of the form <code class="docutils literal notranslate"><span class="pre">s</span> <span class="pre">=</span> <span class="pre">s</span> <span class="pre">+</span> <span class="pre">"abc"</span></code> and <code class="docutils literal notranslate"><span class="pre">s</span> <span class="pre">+=</span>
- <span class="pre">"abc"</span></code> are now performed more efficiently in certain circumstances. This
- optimization won’t be present in other Python implementations such as Jython, so
- you shouldn’t rely on it; using the <code class="xref py py-meth docutils literal notranslate"><span class="pre">join()</span></code> method of strings is still
- recommended when you want to efficiently glue a large number of strings
- together. (Contributed by Armin Rigo.)</p></li>
- </ul>
- <p>The net result of the 2.4 optimizations is that Python 2.4 runs the pystone
- benchmark around 5% faster than Python 2.3 and 35% faster than Python 2.2.
- (pystone is not a particularly good benchmark, but it’s the most commonly used
- measurement of Python’s performance. Your own applications may show greater or
- smaller benefits from Python 2.4.)</p>
- </section>
- </section>
- <section id="new-improved-and-deprecated-modules">
- <h2>New, Improved, and Deprecated Modules<a class="headerlink" href="#new-improved-and-deprecated-modules" title="Permalink to this headline">¶</a></h2>
- <p>As usual, Python’s standard library received a number of enhancements and bug
- fixes. Here’s a partial list of the most notable changes, sorted alphabetically
- by module name. Consult the <code class="file docutils literal notranslate"><span class="pre">Misc/NEWS</span></code> file in the source tree for a more
- complete list of changes, or look through the CVS logs for all the details.</p>
- <ul>
- <li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code> module’s <code class="xref py py-func docutils literal notranslate"><span class="pre">loop()</span></code> function now has a <em>count</em> parameter
- that lets you perform a limited number of passes through the polling loop. The
- default is still to loop forever.</p></li>
- <li><p>The <a class="reference internal" href="../library/base64.html#module-base64" title="base64: RFC 4648: Base16, Base32, Base64 Data Encodings; Base85 and Ascii85"><code class="xref py py-mod docutils literal notranslate"><span class="pre">base64</span></code></a> module now has more complete <span class="target" id="index-18"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc3548.html"><strong>RFC 3548</strong></a> support for Base64,
- Base32, and Base16 encoding and decoding, including optional case folding and
- optional alternative alphabets. (Contributed by Barry Warsaw.)</p></li>
- <li><p>The <a class="reference internal" href="../library/bisect.html#module-bisect" title="bisect: Array bisection algorithms for binary searching."><code class="xref py py-mod docutils literal notranslate"><span class="pre">bisect</span></code></a> module now has an underlying C implementation for improved
- performance. (Contributed by Dmitry Vasiliev.)</p></li>
- <li><p>The CJKCodecs collections of East Asian codecs, maintained by Hye-Shik Chang,
- was integrated into 2.4. The new encodings are:</p></li>
- <li><p>Chinese (PRC): gb2312, gbk, gb18030, big5hkscs, hz</p></li>
- <li><p>Chinese (ROC): big5, cp950</p></li>
- <li><dl class="simple">
- <dt>Japanese: cp932, euc-jis-2004, euc-jp, euc-jisx0213, iso-2022-jp,</dt><dd><p>iso-2022-jp-1, iso-2022-jp-2, iso-2022-jp-3, iso-2022-jp-ext, iso-2022-jp-2004,
- shift-jis, shift-jisx0213, shift-jis-2004</p>
- </dd>
- </dl>
- </li>
- <li><p>Korean: cp949, euc-kr, johab, iso-2022-kr</p></li>
- <li><p>Some other new encodings were added: HP Roman8, ISO_8859-11, ISO_8859-16,
- PCTP-154, and TIS-620.</p></li>
- <li><p>The UTF-8 and UTF-16 codecs now cope better with receiving partial input.
- Previously the <code class="xref py py-class docutils literal notranslate"><span class="pre">StreamReader</span></code> class would try to read more data, making
- it impossible to resume decoding from the stream. The <code class="xref py py-meth docutils literal notranslate"><span class="pre">read()</span></code> method will
- now return as much data as it can and future calls will resume decoding where
- previous ones left off. (Implemented by Walter Dörwald.)</p></li>
- <li><p>There is a new <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 for various specialized collection
- datatypes. Currently it contains just one type, <code class="xref py py-class docutils literal notranslate"><span class="pre">deque</span></code>, a double-ended
- queue that supports efficiently adding and removing elements from either
- end:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">deque</span>
- <span class="gp">>>> </span><span class="n">d</span> <span class="o">=</span> <span class="n">deque</span><span class="p">(</span><span class="s1">'ghi'</span><span class="p">)</span> <span class="c1"># make a new deque with three items</span>
- <span class="gp">>>> </span><span class="n">d</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'j'</span><span class="p">)</span> <span class="c1"># add a new entry to the right side</span>
- <span class="gp">>>> </span><span class="n">d</span><span class="o">.</span><span class="n">appendleft</span><span class="p">(</span><span class="s1">'f'</span><span class="p">)</span> <span class="c1"># add a new entry to the left side</span>
- <span class="gp">>>> </span><span class="n">d</span> <span class="c1"># show the representation of the deque</span>
- <span class="go">deque(['f', 'g', 'h', 'i', 'j'])</span>
- <span class="gp">>>> </span><span class="n">d</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> <span class="c1"># return and remove the rightmost item</span>
- <span class="go">'j'</span>
- <span class="gp">>>> </span><span class="n">d</span><span class="o">.</span><span class="n">popleft</span><span class="p">()</span> <span class="c1"># return and remove the leftmost item</span>
- <span class="go">'f'</span>
- <span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="c1"># list the contents of the deque</span>
- <span class="go">['g', 'h', 'i']</span>
- <span class="gp">>>> </span><span class="s1">'h'</span> <span class="ow">in</span> <span class="n">d</span> <span class="c1"># search the deque</span>
- <span class="go">True</span>
- </pre></div>
- </div>
- <p>Several modules, such as the <code class="xref py py-mod docutils literal notranslate"><span class="pre">Queue</span></code> and <a class="reference internal" href="../library/threading.html#module-threading" title="threading: Thread-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code></a> modules, now take
- advantage of <a class="reference internal" href="../library/collections.html#collections.deque" title="collections.deque"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.deque</span></code></a> for improved performance. (Contributed
- by Raymond Hettinger.)</p>
- </li>
- <li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">ConfigParser</span></code> classes have been enhanced slightly. The <code class="xref py py-meth docutils literal notranslate"><span class="pre">read()</span></code>
- method now returns a list of the files that were successfully parsed, and the
- <a class="reference internal" href="../library/stdtypes.html#set" title="set"><code class="xref py py-meth docutils literal notranslate"><span class="pre">set()</span></code></a> method 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> if passed a <em>value</em> argument that
- isn’t a string. (Contributed by John Belmonte and David Goodger.)</p></li>
- <li><p>The <a class="reference internal" href="../library/curses.html#module-curses" title="curses: An interface to the curses library, providing portable terminal handling. (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">curses</span></code></a> module now supports the ncurses extension
- <code class="xref py py-func docutils literal notranslate"><span class="pre">use_default_colors()</span></code>. On platforms where the terminal supports
- transparency, this makes it possible to use a transparent background.
- (Contributed by Jörg Lehmann.)</p></li>
- <li><p>The <a class="reference internal" href="../library/difflib.html#module-difflib" title="difflib: Helpers for computing differences between objects."><code class="xref py py-mod docutils literal notranslate"><span class="pre">difflib</span></code></a> module now includes an <code class="xref py py-class docutils literal notranslate"><span class="pre">HtmlDiff</span></code> class that creates
- an HTML table showing a side by side comparison of two versions of a text.
- (Contributed by Dan Gass.)</p></li>
- <li><p>The <a class="reference internal" href="../library/email.html#module-email" title="email: Package supporting the parsing, manipulating, and generating email messages."><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code></a> package was updated to version 3.0, which dropped various
- deprecated APIs and removes support for Python versions earlier than 2.3. The
- 3.0 version of the package uses a new incremental parser for MIME messages,
- available in the <code class="xref py py-mod docutils literal notranslate"><span class="pre">email.FeedParser</span></code> module. The new parser doesn’t require
- reading the entire message into memory, and doesn’t raise exceptions if a
- message is malformed; instead it records any problems in the <code class="xref py py-attr docutils literal notranslate"><span class="pre">defect</span></code>
- attribute of the message. (Developed by Anthony Baxter, Barry Warsaw, Thomas
- Wouters, and others.)</p></li>
- <li><p>The <a class="reference internal" href="../library/heapq.html#module-heapq" title="heapq: Heap queue algorithm (a.k.a. priority queue)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">heapq</span></code></a> module has been converted to C. The resulting tenfold
- improvement in speed makes the module suitable for handling high volumes of
- data. In addition, the module has two new functions <code class="xref py py-func docutils literal notranslate"><span class="pre">nlargest()</span></code> and
- <code class="xref py py-func docutils literal notranslate"><span class="pre">nsmallest()</span></code> that use heaps to find the N largest or smallest values in a
- dataset without the expense of a full sort. (Contributed by Raymond Hettinger.)</p></li>
- <li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">httplib</span></code> module now contains constants for HTTP status codes defined
- in various HTTP-related RFC documents. Constants have names such as
- <code class="xref py py-const docutils literal notranslate"><span class="pre">OK</span></code>, <code class="xref py py-const docutils literal notranslate"><span class="pre">CREATED</span></code>, <code class="xref py py-const docutils literal notranslate"><span class="pre">CONTINUE</span></code>, and
- <code class="xref py py-const docutils literal notranslate"><span class="pre">MOVED_PERMANENTLY</span></code>; use pydoc to get a full list. (Contributed by
- Andrew Eland.)</p></li>
- <li><p>The <a class="reference internal" href="../library/imaplib.html#module-imaplib" title="imaplib: IMAP4 protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">imaplib</span></code></a> module now supports IMAP’s THREAD command (contributed by
- Yves Dionne) and new <code class="xref py py-meth docutils literal notranslate"><span class="pre">deleteacl()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">myrights()</span></code> methods (contributed
- by Arnaud Mazin).</p></li>
- <li><p>The <a class="reference internal" href="../library/itertools.html#module-itertools" title="itertools: Functions creating iterators for efficient looping."><code class="xref py py-mod docutils literal notranslate"><span class="pre">itertools</span></code></a> module gained a <code class="docutils literal notranslate"><span class="pre">groupby(iterable[,</span> <span class="pre">*func*])</span></code>
- function. <em>iterable</em> is something that can be iterated over to return a stream
- of elements, and the optional <em>func</em> parameter is a function that takes an
- element and returns a key value; if omitted, the key is simply the element
- itself. <code class="xref py py-func docutils literal notranslate"><span class="pre">groupby()</span></code> then groups the elements into subsequences which have
- matching values of the key, and returns a series of 2-tuples containing the key
- value and an iterator over the subsequence.</p>
- <p>Here’s an example to make this clearer. The <em>key</em> function simply returns
- whether a number is even or odd, so the result of <code class="xref py py-func docutils literal notranslate"><span class="pre">groupby()</span></code> is to return
- consecutive runs of odd or even numbers.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">itertools</span>
- <span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">14</span><span class="p">]</span>
- <span class="gp">>>> </span><span class="k">for</span> <span class="n">key_val</span><span class="p">,</span> <span class="n">it</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">%</span> <span class="mi">2</span><span class="p">):</span>
- <span class="gp">... </span> <span class="nb">print</span> <span class="n">key_val</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
- <span class="gp">...</span>
- <span class="go">0 [2, 4, 6]</span>
- <span class="go">1 [7]</span>
- <span class="go">0 [8]</span>
- <span class="go">1 [9, 11]</span>
- <span class="go">0 [12, 14]</span>
- <span class="gp">>>></span>
- </pre></div>
- </div>
- <p><code class="xref py py-func docutils literal notranslate"><span class="pre">groupby()</span></code> is typically used with sorted input. The logic for
- <code class="xref py py-func docutils literal notranslate"><span class="pre">groupby()</span></code> is similar to the Unix <code class="docutils literal notranslate"><span class="pre">uniq</span></code> filter which makes it handy for
- eliminating, counting, or identifying duplicate elements:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">word</span> <span class="o">=</span> <span class="s1">'abracadabra'</span>
- <span class="gp">>>> </span><span class="n">letters</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> <span class="c1"># Turn string into a sorted list of letters</span>
- <span class="gp">>>> </span><span class="n">letters</span>
- <span class="go">['a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'r', 'r']</span>
- <span class="gp">>>> </span><span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="n">letters</span><span class="p">):</span>
- <span class="gp">... </span> <span class="nb">print</span> <span class="n">k</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
- <span class="gp">...</span>
- <span class="go">a ['a', 'a', 'a', 'a', 'a']</span>
- <span class="go">b ['b', 'b']</span>
- <span class="go">c ['c']</span>
- <span class="go">d ['d']</span>
- <span class="go">r ['r', 'r']</span>
- <span class="gp">>>> </span><span class="c1"># List unique letters</span>
- <span class="gp">>>> </span><span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">groupby</span><span class="p">(</span><span class="n">letters</span><span class="p">)]</span>
- <span class="go">['a', 'b', 'c', 'd', 'r']</span>
- <span class="gp">>>> </span><span class="c1"># Count letter occurrences</span>
- <span class="gp">>>> </span><span class="p">[(</span><span class="n">k</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">g</span><span class="p">)))</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">groupby</span><span class="p">(</span><span class="n">letters</span><span class="p">)]</span>
- <span class="go">[('a', 5), ('b', 2), ('c', 1), ('d', 1), ('r', 2)]</span>
- </pre></div>
- </div>
- <p>(Contributed by Hye-Shik Chang.)</p>
- </li>
- <li><p><a class="reference internal" href="../library/itertools.html#module-itertools" title="itertools: Functions creating iterators for efficient looping."><code class="xref py py-mod docutils literal notranslate"><span class="pre">itertools</span></code></a> also gained a function named <code class="docutils literal notranslate"><span class="pre">tee(iterator,</span> <span class="pre">N)</span></code> that
- returns <em>N</em> independent iterators that replicate <em>iterator</em>. If <em>N</em> is omitted,
- the default is 2.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
- <span class="gp">>>> </span><span class="n">i1</span><span class="p">,</span> <span class="n">i2</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">tee</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="n">i1</span><span class="p">,</span><span class="n">i2</span>
- <span class="go">(<itertools.tee object at 0x402c2080>, <itertools.tee object at 0x402c2090>)</span>
- <span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">i1</span><span class="p">)</span> <span class="c1"># Run the first iterator to exhaustion</span>
- <span class="go">[1, 2, 3]</span>
- <span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">i2</span><span class="p">)</span> <span class="c1"># Run the second iterator to exhaustion</span>
- <span class="go">[1, 2, 3]</span>
- </pre></div>
- </div>
- <p>Note that <code class="xref py py-func docutils literal notranslate"><span class="pre">tee()</span></code> has to keep copies of the values returned by the
- iterator; in the worst case, it may need to keep all of them. This should
- therefore be used carefully if the leading iterator can run far ahead of the
- trailing iterator in a long stream of inputs. If the separation is large, then
- you might as well use <a class="reference internal" href="../library/stdtypes.html#list" title="list"><code class="xref py py-func docutils literal notranslate"><span class="pre">list()</span></code></a> instead. When the iterators track closely
- with one another, <code class="xref py py-func docutils literal notranslate"><span class="pre">tee()</span></code> is ideal. Possible applications include
- bookmarking, windowing, or lookahead iterators. (Contributed by Raymond
- Hettinger.)</p>
- </li>
- <li><p>A number of functions were added to the <a class="reference internal" href="../library/locale.html#module-locale" title="locale: Internationalization services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">locale</span></code></a> module, such as
- <code class="xref py py-func docutils literal notranslate"><span class="pre">bind_textdomain_codeset()</span></code> to specify a particular encoding and a family of
- <code class="xref py py-func docutils literal notranslate"><span class="pre">l*gettext()</span></code> functions that return messages in the chosen encoding.
- (Contributed by Gustavo Niemeyer.)</p></li>
- <li><p>Some keyword arguments were added to the <a class="reference internal" href="../library/logging.html#module-logging" title="logging: Flexible event logging system for applications."><code class="xref py py-mod docutils literal notranslate"><span class="pre">logging</span></code></a> package’s
- <code class="xref py py-func docutils literal notranslate"><span class="pre">basicConfig()</span></code> function to simplify log configuration. The default
- behavior is to log messages to standard error, but various keyword arguments can
- be specified to log to a particular file, change the logging format, or set the
- logging level. For example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">logging</span>
- <span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="s1">'/var/log/application.log'</span><span class="p">,</span>
- <span class="n">level</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="c1"># Log all messages</span>
- <span class="nb">format</span><span class="o">=</span><span class="s1">'%(levelname):%(process):%(thread):%(message)'</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>Other additions to the <a class="reference internal" href="../library/logging.html#module-logging" title="logging: Flexible event logging system for applications."><code class="xref py py-mod docutils literal notranslate"><span class="pre">logging</span></code></a> package include a <code class="docutils literal notranslate"><span class="pre">log(level,</span> <span class="pre">msg)</span></code>
- convenience method, as well as a <code class="xref py py-class docutils literal notranslate"><span class="pre">TimedRotatingFileHandler</span></code> class that
- rotates its log files at a timed interval. The module already had
- <code class="xref py py-class docutils literal notranslate"><span class="pre">RotatingFileHandler</span></code>, which rotated logs once the file exceeded a
- certain size. Both classes derive from a new <code class="xref py py-class docutils literal notranslate"><span class="pre">BaseRotatingHandler</span></code> class
- that can be used to implement other rotating handlers.</p>
- <p>(Changes implemented by Vinay Sajip.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/marshal.html#module-marshal" title="marshal: Convert Python objects to streams of bytes and back (with different constraints)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">marshal</span></code></a> module now shares interned strings on unpacking a data
- structure. This may shrink the size of certain pickle strings, but the primary
- effect is to make <code class="file docutils literal notranslate"><span class="pre">.pyc</span></code> files significantly smaller. (Contributed by
- Martin von Löwis.)</p></li>
- <li><p>The <a class="reference internal" href="../library/nntplib.html#module-nntplib" title="nntplib: NNTP protocol client (requires sockets). (deprecated)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">nntplib</span></code></a> module’s <code class="xref py py-class docutils literal notranslate"><span class="pre">NNTP</span></code> class gained <code class="xref py py-meth docutils literal notranslate"><span class="pre">description()</span></code> and
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">descriptions()</span></code> methods to retrieve newsgroup descriptions for a single
- group or for a range of groups. (Contributed by Jürgen A. Erhard.)</p></li>
- <li><p>Two new functions were added to 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,
- <code class="docutils literal notranslate"><span class="pre">attrgetter(attr)</span></code> and <code class="docutils literal notranslate"><span class="pre">itemgetter(index)</span></code>. Both functions return
- callables that take a single argument and return the corresponding attribute or
- item; these callables make excellent data extractors when used with <a class="reference internal" href="../library/functions.html#map" title="map"><code class="xref py py-func docutils literal notranslate"><span class="pre">map()</span></code></a>
- or <a class="reference internal" href="../library/functions.html#sorted" title="sorted"><code class="xref py py-func docutils literal notranslate"><span class="pre">sorted()</span></code></a>. For example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">'c'</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="s1">'d'</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="s1">'a'</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="p">(</span><span class="s1">'b'</span><span class="p">,</span> <span class="mi">3</span><span class="p">)]</span>
- <span class="gp">>>> </span><span class="nb">map</span><span class="p">(</span><span class="n">operator</span><span class="o">.</span><span class="n">itemgetter</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">L</span><span class="p">)</span>
- <span class="go">['c', 'd', 'a', 'b']</span>
- <span class="gp">>>> </span><span class="nb">map</span><span class="p">(</span><span class="n">operator</span><span class="o">.</span><span class="n">itemgetter</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">L</span><span class="p">)</span>
- <span class="go">[2, 1, 4, 3]</span>
- <span class="gp">>>> </span><span class="nb">sorted</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">operator</span><span class="o">.</span><span class="n">itemgetter</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span> <span class="c1"># Sort list by second tuple item</span>
- <span class="go">[('d', 1), ('c', 2), ('b', 3), ('a', 4)]</span>
- </pre></div>
- </div>
- <p>(Contributed by Raymond Hettinger.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/optparse.html#module-optparse" title="optparse: Command-line option parsing library. (deprecated)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">optparse</span></code></a> module was updated in various ways. The module now passes
- its messages through <a class="reference internal" href="../library/gettext.html#gettext.gettext" title="gettext.gettext"><code class="xref py py-func docutils literal notranslate"><span class="pre">gettext.gettext()</span></code></a>, making it possible to
- internationalize Optik’s help and error messages. Help messages for options can
- now include the string <code class="docutils literal notranslate"><span class="pre">'%default'</span></code>, which will be replaced by the option’s
- default value. (Contributed by Greg Ward.)</p></li>
- <li><p>The long-term plan is to deprecate the <code class="xref py py-mod docutils literal notranslate"><span class="pre">rfc822</span></code> module in some future
- Python release in favor of the <a class="reference internal" href="../library/email.html#module-email" title="email: Package supporting the parsing, manipulating, and generating email messages."><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code></a> package. To this end, the
- <code class="xref py py-func docutils literal notranslate"><span class="pre">email.Utils.formatdate()</span></code> function has been changed to make it usable as a
- replacement for <code class="xref py py-func docutils literal notranslate"><span class="pre">rfc822.formatdate()</span></code>. You may want to write new e-mail
- processing code with this in mind. (Change implemented by Anthony Baxter.)</p></li>
- <li><p>A new <code class="docutils literal notranslate"><span class="pre">urandom(n)</span></code> function was added to the <a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a> module, returning
- a string containing <em>n</em> bytes of random data. This function provides access to
- platform-specific sources of randomness such as <code class="file docutils literal notranslate"><span class="pre">/dev/urandom</span></code> on Linux or
- the Windows CryptoAPI. (Contributed by Trevor Perrin.)</p></li>
- <li><p>Another new function: <code class="docutils literal notranslate"><span class="pre">os.path.lexists(path)</span></code> returns true if the file
- specified by <em>path</em> exists, whether or not it’s a symbolic link. This differs
- from the existing <code class="docutils literal notranslate"><span class="pre">os.path.exists(path)</span></code> function, which returns false if
- <em>path</em> is a symlink that points to a destination that doesn’t exist.
- (Contributed by Beni Cherniavsky.)</p></li>
- <li><p>A new <code class="xref py py-func docutils literal notranslate"><span class="pre">getsid()</span></code> function was added to the <a class="reference internal" href="../library/posix.html#module-posix" title="posix: The most common POSIX system calls (normally used via module os). (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">posix</span></code></a> module that
- underlies the <a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a> module. (Contributed by J. Raynor.)</p></li>
- <li><p>The <a class="reference internal" href="../library/poplib.html#module-poplib" title="poplib: POP3 protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">poplib</span></code></a> module now supports POP over SSL. (Contributed by Hector
- Urtubia.)</p></li>
- <li><p>The <a class="reference internal" href="../library/profile.html#module-profile" title="profile: Python source profiler."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code></a> module can now profile C extension functions. (Contributed
- by Nick Bastin.)</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 has a new method called <code class="docutils literal notranslate"><span class="pre">getrandbits(N)</span></code> that
- returns a long integer <em>N</em> bits in length. The existing <code class="xref py py-meth docutils literal notranslate"><span class="pre">randrange()</span></code>
- method now uses <code class="xref py py-meth docutils literal notranslate"><span class="pre">getrandbits()</span></code> where appropriate, making generation of
- arbitrarily large random numbers more efficient. (Contributed by Raymond
- Hettinger.)</p></li>
- <li><p>The regular expression language accepted by the <a class="reference internal" href="../library/re.html#module-re" title="re: Regular expression operations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">re</span></code></a> module was extended
- with simple conditional expressions, written as <code class="docutils literal notranslate"><span class="pre">(?(group)A|B)</span></code>. <em>group</em> is
- either a numeric group ID or a group name defined with <code class="docutils literal notranslate"><span class="pre">(?P<group>...)</span></code>
- earlier in the expression. If the specified group matched, the regular
- expression pattern <em>A</em> will be tested against the string; if the group didn’t
- match, the pattern <em>B</em> will be used instead. (Contributed by Gustavo Niemeyer.)</p></li>
- <li><p>The <a class="reference internal" href="../library/re.html#module-re" title="re: Regular expression operations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">re</span></code></a> module is also no longer recursive, thanks to a massive amount
- of work by Gustavo Niemeyer. In a recursive regular expression engine, certain
- patterns result in a large amount of C stack space being consumed, and it was
- possible to overflow the stack. For example, if you matched a 30000-byte string
- of <code class="docutils literal notranslate"><span class="pre">a</span></code> characters against the expression <code class="docutils literal notranslate"><span class="pre">(a|b)+</span></code>, one stack frame was
- consumed per character. Python 2.3 tried to check for stack overflow and raise
- a <a class="reference internal" href="../library/exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">RuntimeError</span></code></a> exception, but certain patterns could sidestep the
- checking and if you were unlucky Python could segfault. Python 2.4’s regular
- expression engine can match this pattern without problems.</p></li>
- <li><p>The <a class="reference internal" href="../library/signal.html#module-signal" title="signal: Set handlers for asynchronous events."><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code></a> module now performs tighter error-checking on the parameters
- to the <a class="reference internal" href="../library/signal.html#signal.signal" title="signal.signal"><code class="xref py py-func docutils literal notranslate"><span class="pre">signal.signal()</span></code></a> function. For example, you can’t set a handler on
- the <code class="xref py py-const docutils literal notranslate"><span class="pre">SIGKILL</span></code> signal; previous versions of Python would quietly accept
- this, but 2.4 will raise a <a class="reference internal" href="../library/exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">RuntimeError</span></code></a> exception.</p></li>
- <li><p>Two new functions were added to 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. <code class="xref py py-func docutils literal notranslate"><span class="pre">socketpair()</span></code>
- returns a pair of connected sockets and <code class="docutils literal notranslate"><span class="pre">getservbyport(port)</span></code> looks up the
- service name for a given port number. (Contributed by Dave Cole and Barry
- Warsaw.)</p></li>
- <li><p>The <code class="xref py py-func docutils literal notranslate"><span class="pre">sys.exitfunc()</span></code> function has been deprecated. Code should be using
- the existing <a class="reference internal" href="../library/atexit.html#module-atexit" title="atexit: Register and execute cleanup functions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">atexit</span></code></a> module, which correctly handles calling multiple exit
- functions. Eventually <code class="xref py py-func docutils literal notranslate"><span class="pre">sys.exitfunc()</span></code> will become a purely internal
- interface, accessed only by <a class="reference internal" href="../library/atexit.html#module-atexit" title="atexit: Register and execute cleanup functions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">atexit</span></code></a>.</p></li>
- <li><p>The <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> module now generates GNU-format tar files by default.
- (Contributed by Lars Gustäbel.)</p></li>
- <li><p>The <a class="reference internal" href="../library/threading.html#module-threading" title="threading: Thread-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code></a> module now has an elegantly simple way to support
- thread-local data. The module contains a <code class="xref py py-class docutils literal notranslate"><span class="pre">local</span></code> class whose attribute
- values are local to different threads.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">threading</span>
- <span class="n">data</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">local</span><span class="p">()</span>
- <span class="n">data</span><span class="o">.</span><span class="n">number</span> <span class="o">=</span> <span class="mi">42</span>
- <span class="n">data</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'www.python.org'</span><span class="p">,</span> <span class="mi">80</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>Other threads can assign and retrieve their own values for the <code class="xref py py-attr docutils literal notranslate"><span class="pre">number</span></code>
- and <code class="xref py py-attr docutils literal notranslate"><span class="pre">url</span></code> attributes. You can subclass <code class="xref py py-class docutils literal notranslate"><span class="pre">local</span></code> to initialize
- attributes or to add methods. (Contributed by Jim Fulton.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/timeit.html#module-timeit" title="timeit: Measure the execution time of small code snippets."><code class="xref py py-mod docutils literal notranslate"><span class="pre">timeit</span></code></a> module now automatically disables periodic garbage
- collection during the timing loop. This change makes consecutive timings more
- comparable. (Contributed by Raymond Hettinger.)</p></li>
- <li><p>The <a class="reference internal" href="../library/weakref.html#module-weakref" title="weakref: Support for weak references and weak dictionaries."><code class="xref py py-mod docutils literal notranslate"><span class="pre">weakref</span></code></a> module now supports a wider variety of objects including
- Python functions, class instances, sets, frozensets, deques, arrays, files,
- sockets, and regular expression pattern objects. (Contributed by Raymond
- Hettinger.)</p></li>
- <li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpclib</span></code> module now supports a multi-call extension for
- transmitting multiple XML-RPC calls in a single HTTP operation. (Contributed by
- Brian Quinlan.)</p></li>
- <li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">mpz</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">rotor</span></code>, and <code class="xref py py-mod docutils literal notranslate"><span class="pre">xreadlines</span></code> modules have been
- removed.</p></li>
- </ul>
- <section id="cookielib">
- <h3>cookielib<a class="headerlink" href="#cookielib" title="Permalink to this headline">¶</a></h3>
- <p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">cookielib</span></code> library supports client-side handling for HTTP cookies,
- mirroring the <code class="xref py py-mod docutils literal notranslate"><span class="pre">Cookie</span></code> module’s server-side cookie support. Cookies are
- stored in cookie jars; the library transparently stores cookies offered by the
- web server in the cookie jar, and fetches the cookie from the jar when
- connecting to the server. As in web browsers, policy objects control whether
- cookies are accepted or not.</p>
- <p>In order to store cookies across sessions, two implementations of cookie jars
- are provided: one that stores cookies in the Netscape format so applications can
- use the Mozilla or Lynx cookie files, and one that stores cookies in the same
- format as the Perl libwww library.</p>
- <p><code class="xref py py-mod docutils literal notranslate"><span class="pre">urllib2</span></code> has been changed to interact with <code class="xref py py-mod docutils literal notranslate"><span class="pre">cookielib</span></code>:
- <code class="xref py py-class docutils literal notranslate"><span class="pre">HTTPCookieProcessor</span></code> manages a cookie jar that is used when accessing
- URLs.</p>
- <p>This module was contributed by John J. Lee.</p>
- </section>
- <section id="doctest">
- <h3>doctest<a class="headerlink" href="#doctest" title="Permalink to this headline">¶</a></h3>
- <p>The <a class="reference internal" href="../library/doctest.html#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> module underwent considerable refactoring thanks to Edward
- Loper and Tim Peters. Testing can still be as simple as running
- <a class="reference internal" href="../library/doctest.html#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">doctest.testmod()</span></code></a>, but the refactorings allow customizing the module’s
- operation in various ways</p>
- <p>The new <code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestFinder</span></code> class extracts the tests from a given object’s
- docstrings:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">f</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">""">>> f(2,2)</span>
- <span class="sd">4</span>
- <span class="sd">>>> f(3,2)</span>
- <span class="sd">6</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="n">x</span><span class="o">*</span><span class="n">y</span>
- <span class="n">finder</span> <span class="o">=</span> <span class="n">doctest</span><span class="o">.</span><span class="n">DocTestFinder</span><span class="p">()</span>
- <span class="c1"># Get list of DocTest instances</span>
- <span class="n">tests</span> <span class="o">=</span> <span class="n">finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>The new <code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code> class then runs individual tests and can produce
- a summary of the results:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">runner</span> <span class="o">=</span> <span class="n">doctest</span><span class="o">.</span><span class="n">DocTestRunner</span><span class="p">()</span>
- <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tests</span><span class="p">:</span>
- <span class="n">tried</span><span class="p">,</span> <span class="n">failed</span> <span class="o">=</span> <span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
- <span class="n">runner</span><span class="o">.</span><span class="n">summarize</span><span class="p">(</span><span class="n">verbose</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>The above example produces the following output:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="n">items</span> <span class="n">passed</span> <span class="nb">all</span> <span class="n">tests</span><span class="p">:</span>
- <span class="mi">2</span> <span class="n">tests</span> <span class="ow">in</span> <span class="n">f</span>
- <span class="mi">2</span> <span class="n">tests</span> <span class="ow">in</span> <span class="mi">1</span> <span class="n">items</span><span class="o">.</span>
- <span class="mi">2</span> <span class="n">passed</span> <span class="ow">and</span> <span class="mi">0</span> <span class="n">failed</span><span class="o">.</span>
- <span class="n">Test</span> <span class="n">passed</span><span class="o">.</span>
- </pre></div>
- </div>
- <p><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code> uses an instance of the <code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code> class to
- compare the expected output with the actual output. This class takes a number
- of different flags that customize its behaviour; ambitious users can also write
- a completely new subclass of <code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code>.</p>
- <p>The default output checker provides a number of handy features. For example,
- with the <a class="reference internal" href="../library/doctest.html#doctest.ELLIPSIS" title="doctest.ELLIPSIS"><code class="xref py py-const docutils literal notranslate"><span class="pre">doctest.ELLIPSIS</span></code></a> option flag, an ellipsis (<code class="docutils literal notranslate"><span class="pre">...</span></code>) in the
- expected output matches any substring, making it easier to accommodate outputs
- that vary in minor ways:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">o</span> <span class="p">(</span><span class="n">n</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">""">>> o(1)</span>
- <span class="sd"><__main__.C instance at 0x...></span>
- <span class="sd">>>></span>
- <span class="sd">"""</span>
- </pre></div>
- </div>
- <p>Another special string, <code class="docutils literal notranslate"><span class="pre"><BLANKLINE></span></code>, matches a blank line:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">p</span> <span class="p">(</span><span class="n">n</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">""">>> p(1)</span>
- <span class="sd"><BLANKLINE></span>
- <span class="sd">>>></span>
- <span class="sd">"""</span>
- </pre></div>
- </div>
- <p>Another new capability is producing a diff-style display of the output by
- specifying the <a class="reference internal" href="../library/doctest.html#doctest.REPORT_UDIFF" title="doctest.REPORT_UDIFF"><code class="xref py py-const docutils literal notranslate"><span class="pre">doctest.REPORT_UDIFF</span></code></a> (unified diffs),
- <a class="reference internal" href="../library/doctest.html#doctest.REPORT_CDIFF" title="doctest.REPORT_CDIFF"><code class="xref py py-const docutils literal notranslate"><span class="pre">doctest.REPORT_CDIFF</span></code></a> (context diffs), or <a class="reference internal" href="../library/doctest.html#doctest.REPORT_NDIFF" title="doctest.REPORT_NDIFF"><code class="xref py py-const docutils literal notranslate"><span class="pre">doctest.REPORT_NDIFF</span></code></a>
- (delta-style) option flags. For example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">g</span> <span class="p">(</span><span class="n">n</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">""">>> g(4)</span>
- <span class="sd">here</span>
- <span class="sd">is</span>
- <span class="sd">a</span>
- <span class="sd">lengthy</span>
- <span class="sd">>>>"""</span>
- <span class="n">L</span> <span class="o">=</span> <span class="s1">'here is a rather lengthy list of words'</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
- <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">L</span><span class="p">[:</span><span class="n">n</span><span class="p">]:</span>
- <span class="nb">print</span> <span class="n">word</span>
- </pre></div>
- </div>
- <p>Running the above function’s tests with <a class="reference internal" href="../library/doctest.html#doctest.REPORT_UDIFF" title="doctest.REPORT_UDIFF"><code class="xref py py-const docutils literal notranslate"><span class="pre">doctest.REPORT_UDIFF</span></code></a> specified,
- you get the following output:</p>
- <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>**********************************************************************
- File "t.py", line 15, in g
- Failed example:
- g(4)
- Differences (unified diff with -expected +actual):
- @@ -2,3 +2,3 @@
- is
- a
- -lengthy
- +rather
- **********************************************************************
- </pre></div>
- </div>
- </section>
- </section>
- <section id="build-and-c-api-changes">
- <h2>Build and C API Changes<a class="headerlink" href="#build-and-c-api-changes" title="Permalink to this headline">¶</a></h2>
- <p>Some of the changes to Python’s build process and to the C API are:</p>
- <ul class="simple">
- <li><p>Three new convenience macros were added for common return values from
- extension functions: <a class="reference internal" href="../c-api/none.html#c.Py_RETURN_NONE" title="Py_RETURN_NONE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_RETURN_NONE</span></code></a>, <a class="reference internal" href="../c-api/bool.html#c.Py_RETURN_TRUE" title="Py_RETURN_TRUE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_RETURN_TRUE</span></code></a>, and
- <a class="reference internal" href="../c-api/bool.html#c.Py_RETURN_FALSE" title="Py_RETURN_FALSE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_RETURN_FALSE</span></code></a>. (Contributed by Brett Cannon.)</p></li>
- <li><p>Another new macro, <a class="reference internal" href="../c-api/refcounting.html#c.Py_CLEAR" title="Py_CLEAR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_CLEAR</span></code></a>, decreases the reference count of
- <em>obj</em> and sets <em>obj</em> to the null pointer. (Contributed by Jim Fulton.)</p></li>
- <li><p>A new function, <code class="docutils literal notranslate"><span class="pre">PyTuple_Pack(N,</span> <span class="pre">obj1,</span> <span class="pre">obj2,</span> <span class="pre">...,</span> <span class="pre">objN)</span></code>, constructs
- tuples from a variable length argument list of Python objects. (Contributed by
- Raymond Hettinger.)</p></li>
- <li><p>A new function, <code class="docutils literal notranslate"><span class="pre">PyDict_Contains(d,</span> <span class="pre">k)</span></code>, implements fast dictionary
- lookups without masking exceptions raised during the look-up process.
- (Contributed by Raymond Hettinger.)</p></li>
- <li><p>The <span class="c-expr sig sig-inline c"><span class="n">Py_IS_NAN</span><span class="p">(</span><span class="n">X</span><span class="p">)</span></span> macro returns 1 if its float or double argument
- <em>X</em> is a NaN. (Contributed by Tim Peters.)</p></li>
- <li><p>C code can avoid unnecessary locking by using the new
- <code class="xref c c-func docutils literal notranslate"><span class="pre">PyEval_ThreadsInitialized()</span></code> function to tell if any thread operations
- have been performed. If this function returns false, no lock operations are
- needed. (Contributed by Nick Coghlan.)</p></li>
- <li><p>A new function, <a class="reference internal" href="../c-api/arg.html#c.PyArg_VaParseTupleAndKeywords" title="PyArg_VaParseTupleAndKeywords"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyArg_VaParseTupleAndKeywords()</span></code></a>, is the same as
- <a class="reference internal" href="../c-api/arg.html#c.PyArg_ParseTupleAndKeywords" title="PyArg_ParseTupleAndKeywords"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyArg_ParseTupleAndKeywords()</span></code></a> but takes a <code class="xref c c-type docutils literal notranslate"><span class="pre">va_list</span></code> instead of a
- number of arguments. (Contributed by Greg Chapman.)</p></li>
- <li><p>A new method flag, <a class="reference internal" href="../c-api/structures.html#c.METH_COEXIST" title="METH_COEXIST"><code class="xref c c-macro docutils literal notranslate"><span class="pre">METH_COEXIST</span></code></a>, allows a function defined in slots
- to co-exist with a <a class="reference internal" href="../c-api/structures.html#c.PyCFunction" title="PyCFunction"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyCFunction</span></code></a> having the same name. This can halve
- the access time for a method such as <code class="xref py py-meth docutils literal notranslate"><span class="pre">set.__contains__()</span></code>. (Contributed by
- Raymond Hettinger.)</p></li>
- <li><p>Python can now be built with additional profiling for the interpreter itself,
- intended as an aid to people developing the Python core. Providing
- <code class="xref std std-option docutils literal notranslate"><span class="pre">--enable-profiling</span></code> to the <strong class="program">configure</strong> script will let you
- profile the interpreter with <strong class="program">gprof</strong>, and providing the
- <code class="xref std std-option docutils literal notranslate"><span class="pre">--with-tsc</span></code> switch enables profiling using the Pentium’s
- Time-Stamp-Counter register. Note that the <code class="xref std std-option docutils literal notranslate"><span class="pre">--with-tsc</span></code> switch is slightly
- misnamed, because the profiling feature also works on the PowerPC platform,
- though that processor architecture doesn’t call that register “the TSC
- register”. (Contributed by Jeremy Hylton.)</p></li>
- <li><p>The <code class="xref c c-type docutils literal notranslate"><span class="pre">tracebackobject</span></code> type has been renamed to
- <code class="xref c c-type docutils literal notranslate"><span class="pre">PyTracebackObject</span></code>.</p></li>
- </ul>
- <section id="port-specific-changes">
- <h3>Port-Specific Changes<a class="headerlink" href="#port-specific-changes" title="Permalink to this headline">¶</a></h3>
- <ul class="simple">
- <li><p>The Windows port now builds under MSVC++ 7.1 as well as version 6.
- (Contributed by Martin von Löwis.)</p></li>
- </ul>
- </section>
- </section>
- <section id="porting-to-python-2-4">
- <h2>Porting to Python 2.4<a class="headerlink" href="#porting-to-python-2-4" title="Permalink to this headline">¶</a></h2>
- <p>This section lists previously described changes that may require changes to your
- code:</p>
- <ul class="simple">
- <li><p>Left shifts and hexadecimal/octal constants that are too large no longer
- trigger a <a class="reference internal" href="../library/exceptions.html#FutureWarning" title="FutureWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">FutureWarning</span></code></a> and return a value limited to 32 or 64 bits;
- instead they return a long integer.</p></li>
- <li><p>Integer operations will no longer trigger an <code class="xref py py-exc docutils literal notranslate"><span class="pre">OverflowWarning</span></code>. The
- <code class="xref py py-exc docutils literal notranslate"><span class="pre">OverflowWarning</span></code> warning will disappear in Python 2.5.</p></li>
- <li><p>The <a class="reference internal" href="../library/functions.html#zip" title="zip"><code class="xref py py-func docutils literal notranslate"><span class="pre">zip()</span></code></a> built-in function and <code class="xref py py-func docutils literal notranslate"><span class="pre">itertools.izip()</span></code> now return an
- empty list 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> exception if called with no
- arguments.</p></li>
- <li><p>You can no longer compare the <code class="xref py py-class docutils literal notranslate"><span class="pre">date</span></code> and <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</span></code></a> instances
- provided by the <a class="reference internal" href="../library/datetime.html#module-datetime" title="datetime: Basic date and time types."><code class="xref py py-mod docutils literal notranslate"><span class="pre">datetime</span></code></a> module. Two instances of different classes
- will now always be unequal, and relative comparisons (<code class="docutils literal notranslate"><span class="pre"><</span></code>, <code class="docutils literal notranslate"><span class="pre">></span></code>) 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>.</p></li>
- <li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">dircache.listdir()</span></code> now passes exceptions to the caller instead of
- returning empty lists.</p></li>
- <li><p><code class="xref py py-func docutils literal notranslate"><span class="pre">LexicalHandler.startDTD()</span></code> used to receive the public and system IDs in
- the wrong order. This has been corrected; applications relying on the wrong
- order need to be fixed.</p></li>
- <li><p><a class="reference internal" href="../library/fcntl.html#fcntl.ioctl" title="fcntl.ioctl"><code class="xref py py-func docutils literal notranslate"><span class="pre">fcntl.ioctl()</span></code></a> now warns if the <em>mutate</em> argument is omitted and
- relevant.</p></li>
- <li><p>The <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> module now generates GNU-format tar files by default.</p></li>
- <li><p>Encountering a failure while importing a module no longer leaves a
- partially initialized module object in <code class="docutils literal notranslate"><span class="pre">sys.modules</span></code>.</p></li>
- <li><p><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> is now a constant; code that binds a new value to the name
- <code class="docutils literal notranslate"><span class="pre">None</span></code> is now a syntax error.</p></li>
- <li><p>The <code class="xref py py-func docutils literal notranslate"><span class="pre">signals.signal()</span></code> function now raises a <a class="reference internal" href="../library/exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">RuntimeError</span></code></a> exception
- for certain illegal values; previously these errors would pass silently. For
- example, you can no longer set a handler on the <code class="xref py py-const docutils literal notranslate"><span class="pre">SIGKILL</span></code> signal.</p></li>
- </ul>
- </section>
- <section id="acknowledgements">
- <span id="acks"></span><h2>Acknowledgements<a class="headerlink" href="#acknowledgements" title="Permalink to this headline">¶</a></h2>
- <p>The author would like to thank the following people for offering suggestions,
- corrections and assistance with various drafts of this article: Koray Can,
- Hye-Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson,
- Fredrik Lundh, Sean Reifschneider, Sadruddin Rejeb.</p>
- </section>
- </section>
- <div class="clearer"></div>
- </div>
- </div>
- </div>
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <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 2.4</a><ul>
- <li><a class="reference internal" href="#pep-218-built-in-set-objects">PEP 218: Built-In Set Objects</a></li>
- <li><a class="reference internal" href="#pep-237-unifying-long-integers-and-integers">PEP 237: Unifying Long Integers and Integers</a></li>
- <li><a class="reference internal" href="#pep-289-generator-expressions">PEP 289: Generator Expressions</a></li>
- <li><a class="reference internal" href="#pep-292-simpler-string-substitutions">PEP 292: Simpler String Substitutions</a></li>
- <li><a class="reference internal" href="#pep-318-decorators-for-functions-and-methods">PEP 318: Decorators for Functions and Methods</a></li>
- <li><a class="reference internal" href="#pep-322-reverse-iteration">PEP 322: Reverse Iteration</a></li>
- <li><a class="reference internal" href="#pep-324-new-subprocess-module">PEP 324: New subprocess Module</a></li>
- <li><a class="reference internal" href="#pep-327-decimal-data-type">PEP 327: Decimal Data Type</a><ul>
- <li><a class="reference internal" href="#why-is-decimal-needed">Why is Decimal needed?</a></li>
- <li><a class="reference internal" href="#the-decimal-type">The <code class="xref py py-class docutils literal notranslate"><span class="pre">Decimal</span></code> type</a></li>
- <li><a class="reference internal" href="#the-context-type">The <code class="xref py py-class docutils literal notranslate"><span class="pre">Context</span></code> type</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#pep-328-multi-line-imports">PEP 328: Multi-line Imports</a></li>
- <li><a class="reference internal" href="#pep-331-locale-independent-float-string-conversions">PEP 331: Locale-Independent Float/String Conversions</a></li>
- <li><a class="reference internal" href="#other-language-changes">Other Language Changes</a><ul>
- <li><a class="reference internal" href="#optimizations">Optimizations</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#new-improved-and-deprecated-modules">New, Improved, and Deprecated Modules</a><ul>
- <li><a class="reference internal" href="#cookielib">cookielib</a></li>
- <li><a class="reference internal" href="#doctest">doctest</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#build-and-c-api-changes">Build and C API Changes</a><ul>
- <li><a class="reference internal" href="#port-specific-changes">Port-Specific Changes</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#porting-to-python-2-4">Porting to Python 2.4</a></li>
- <li><a class="reference internal" href="#acknowledgements">Acknowledgements</a></li>
- </ul>
- </li>
- </ul>
- </div>
- <div>
- <h4>Previous topic</h4>
- <p class="topless"><a href="2.5.html"
- title="previous chapter">What’s New in Python 2.5</a></p>
- </div>
- <div>
- <h4>Next topic</h4>
- <p class="topless"><a href="2.3.html"
- title="next chapter">What’s New in Python 2.3</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/2.4.rst"
- rel="nofollow">Show Source
- </a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- <div class="clearer"></div>
- </div>
- <div class="related" role="navigation" aria-label="related navigation">
- <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="2.3.html" title="What’s New in Python 2.3"
- >next</a> |</li>
- <li class="right" >
- <a href="2.5.html" title="What’s New in Python 2.5"
- >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.12.0 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 2.4</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" />
- <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-2023, 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 Oct 02, 2023.
- <a href="/bugs.html">Found a bug</a>?
- <br />
- Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.5.0.
- </div>
- </body>
- </html>
|