1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350 |
- <!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.5" />
- <meta property="og:type" content="website" />
- <meta property="og:url" content="https://docs.python.org/3/whatsnew/2.5.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.5. The final release of Python 2.5 is scheduled for August 2006; PEP 356 describes the planned release schedule. Python 2...." />
- <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.5. The final release of Python 2.5 is scheduled for August 2006; PEP 356 describes the planned release schedule. Python 2...." />
- <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.5 — 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.4" href="2.4.html" />
- <link rel="prev" title="What’s New in Python 2.6" href="2.6.html" />
- <link rel="canonical" href="https://docs.python.org/3/whatsnew/2.5.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.5</a><ul>
- <li><a class="reference internal" href="#pep-308-conditional-expressions">PEP 308: Conditional Expressions</a></li>
- <li><a class="reference internal" href="#pep-309-partial-function-application">PEP 309: Partial Function Application</a></li>
- <li><a class="reference internal" href="#pep-314-metadata-for-python-software-packages-v1-1">PEP 314: Metadata for Python Software Packages v1.1</a></li>
- <li><a class="reference internal" href="#pep-328-absolute-and-relative-imports">PEP 328: Absolute and Relative Imports</a></li>
- <li><a class="reference internal" href="#pep-338-executing-modules-as-scripts">PEP 338: Executing Modules as Scripts</a></li>
- <li><a class="reference internal" href="#pep-341-unified-try-except-finally">PEP 341: Unified try/except/finally</a></li>
- <li><a class="reference internal" href="#pep-342-new-generator-features">PEP 342: New Generator Features</a></li>
- <li><a class="reference internal" href="#pep-343-the-with-statement">PEP 343: The ‘with’ statement</a><ul>
- <li><a class="reference internal" href="#writing-context-managers">Writing Context Managers</a></li>
- <li><a class="reference internal" href="#the-contextlib-module">The contextlib module</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#pep-352-exceptions-as-new-style-classes">PEP 352: Exceptions as New-Style Classes</a></li>
- <li><a class="reference internal" href="#pep-353-using-ssize-t-as-the-index-type">PEP 353: Using ssize_t as the index type</a></li>
- <li><a class="reference internal" href="#pep-357-the-index-method">PEP 357: The ‘__index__’ method</a></li>
- <li><a class="reference internal" href="#other-language-changes">Other Language Changes</a><ul>
- <li><a class="reference internal" href="#interactive-interpreter-changes">Interactive Interpreter Changes</a></li>
- <li><a class="reference internal" href="#optimizations">Optimizations</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#new-improved-and-removed-modules">New, Improved, and Removed Modules</a><ul>
- <li><a class="reference internal" href="#the-ctypes-package">The ctypes package</a></li>
- <li><a class="reference internal" href="#the-elementtree-package">The ElementTree package</a></li>
- <li><a class="reference internal" href="#the-hashlib-package">The hashlib package</a></li>
- <li><a class="reference internal" href="#the-sqlite3-package">The sqlite3 package</a></li>
- <li><a class="reference internal" href="#the-wsgiref-package">The wsgiref package</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-5">Porting to Python 2.5</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.6.html"
- title="previous chapter">What’s New in Python 2.6</a></p>
- </div>
- <div>
- <h4>Next topic</h4>
- <p class="topless"><a href="2.4.html"
- title="next chapter">What’s New in Python 2.4</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.5.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.4.html" title="What’s New in Python 2.4"
- accesskey="N">next</a> |</li>
- <li class="right" >
- <a href="2.6.html" title="What’s New in Python 2.6"
- 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.5</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-5">
- <h1>What’s New in Python 2.5<a class="headerlink" href="#what-s-new-in-python-2-5" 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.5. The final release of
- Python 2.5 is scheduled for August 2006; <span class="target" id="index-0"></span><a class="pep reference external" href="https://peps.python.org/pep-0356/"><strong>PEP 356</strong></a> describes the planned
- release schedule. Python 2.5 was released on September 19, 2006.</p>
- <p>The changes in Python 2.5 are an interesting mix of language and library
- improvements. The library enhancements will be more important to Python’s user
- community, I think, because several widely useful packages were added. New
- modules include ElementTree for XML processing (<code class="xref py py-mod docutils literal notranslate"><span class="pre">xml.etree</span></code>),
- the SQLite database module (<code class="xref py py-mod docutils literal notranslate"><span class="pre">sqlite</span></code>), and the <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a>
- module for calling C functions.</p>
- <p>The language changes are of middling significance. Some pleasant new features
- were added, but most of them aren’t features that you’ll use every day.
- Conditional expressions were finally added to the language using a novel syntax;
- see section <a class="reference internal" href="#pep-308"><span class="std std-ref">PEP 308: Conditional Expressions</span></a>. The new ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement will make
- writing cleanup code easier (section <a class="reference internal" href="#pep-343"><span class="std std-ref">PEP 343: The ‘with’ statement</span></a>). Values can now be passed
- into generators (section <a class="reference internal" href="#pep-342"><span class="std std-ref">PEP 342: New Generator Features</span></a>). Imports are now visible as either
- absolute or relative (section <a class="reference internal" href="#pep-328"><span class="std std-ref">PEP 328: Absolute and Relative Imports</span></a>). Some corner cases of exception
- handling are handled better (section <a class="reference internal" href="#pep-341"><span class="std std-ref">PEP 341: Unified try/except/finally</span></a>). All these improvements
- are worthwhile, but they’re improvements to one specific language feature or
- another; none of them are broad modifications to Python’s semantics.</p>
- <p>As well as the language and library additions, other improvements and bugfixes
- were made throughout the source tree. A search through the SVN change logs
- finds there were 353 patches applied and 458 bugs fixed between Python 2.4 and
- 2.5. (Both figures are likely to be underestimates.)</p>
- <p>This article doesn’t try to be a complete specification of the new features;
- instead changes are briefly introduced using helpful examples. For full
- details, you should always refer to the documentation for Python 2.5 at
- <a class="reference external" href="https://docs.python.org">https://docs.python.org</a>. If you want to understand the complete implementation
- and design rationale, refer to the PEP for a particular new feature.</p>
- <p>Comments, suggestions, and error reports for this document are welcome; please
- e-mail them to the author or open a bug in the Python bug tracker.</p>
- <section id="pep-308-conditional-expressions">
- <span id="pep-308"></span><h2>PEP 308: Conditional Expressions<a class="headerlink" href="#pep-308-conditional-expressions" title="Permalink to this headline">¶</a></h2>
- <p>For a long time, people have been requesting a way to write conditional
- expressions, which are expressions that return value A or value B depending on
- whether a Boolean value is true or false. A conditional expression lets you
- write a single assignment statement that has the same effect as the following:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="n">condition</span><span class="p">:</span>
- <span class="n">x</span> <span class="o">=</span> <span class="n">true_value</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">x</span> <span class="o">=</span> <span class="n">false_value</span>
- </pre></div>
- </div>
- <p>There have been endless tedious discussions of syntax on both python-dev and
- comp.lang.python. A vote was even held that found the majority of voters wanted
- conditional expressions in some form, but there was no syntax that was preferred
- by a clear majority. Candidates included C’s <code class="docutils literal notranslate"><span class="pre">cond</span> <span class="pre">?</span> <span class="pre">true_v</span> <span class="pre">:</span> <span class="pre">false_v</span></code>, <code class="docutils literal notranslate"><span class="pre">if</span>
- <span class="pre">cond</span> <span class="pre">then</span> <span class="pre">true_v</span> <span class="pre">else</span> <span class="pre">false_v</span></code>, and 16 other variations.</p>
- <p>Guido van Rossum eventually chose a surprising syntax:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="n">true_value</span> <span class="k">if</span> <span class="n">condition</span> <span class="k">else</span> <span class="n">false_value</span>
- </pre></div>
- </div>
- <p>Evaluation is still lazy as in existing Boolean expressions, so the order of
- evaluation jumps around a bit. The <em>condition</em> expression in the middle is
- evaluated first, and the <em>true_value</em> expression is evaluated only if the
- condition was true. Similarly, the <em>false_value</em> expression is only evaluated
- when the condition is false.</p>
- <p>This syntax may seem strange and backwards; why does the condition go in the
- <em>middle</em> of the expression, and not in the front as in C’s <code class="docutils literal notranslate"><span class="pre">c</span> <span class="pre">?</span> <span class="pre">x</span> <span class="pre">:</span> <span class="pre">y</span></code>? The
- decision was checked by applying the new syntax to the modules in the standard
- library and seeing how the resulting code read. In many cases where a
- conditional expression is used, one value seems to be the ‘common case’ and one
- value is an ‘exceptional case’, used only on rarer occasions when the condition
- isn’t met. The conditional syntax makes this pattern a bit more obvious:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">contents</span> <span class="o">=</span> <span class="p">((</span><span class="n">doc</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> <span class="k">if</span> <span class="n">doc</span> <span class="k">else</span> <span class="s1">''</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>I read the above statement as meaning “here <em>contents</em> is usually assigned a
- value of <code class="docutils literal notranslate"><span class="pre">doc+'\n'</span></code>; sometimes <em>doc</em> is empty, in which special case an empty
- string is returned.” I doubt I will use conditional expressions very often
- where there isn’t a clear common and uncommon case.</p>
- <p>There was some discussion of whether the language should require surrounding
- conditional expressions with parentheses. The decision was made to <em>not</em>
- require parentheses in the Python language’s grammar, but as a matter of style I
- think you should always use them. Consider these two statements:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># First version -- no parens</span>
- <span class="n">level</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">logging</span> <span class="k">else</span> <span class="mi">0</span>
- <span class="c1"># Second version -- with parens</span>
- <span class="n">level</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="k">if</span> <span class="n">logging</span> <span class="k">else</span> <span class="mi">0</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>In the first version, I think a reader’s eye might group the statement into
- ‘level = 1’, ‘if logging’, ‘else 0’, and think that the condition decides
- whether the assignment to <em>level</em> is performed. The second version reads
- better, in my opinion, because it makes it clear that the assignment is always
- performed and the choice is being made between two values.</p>
- <p>Another reason for including the brackets: a few odd combinations of list
- comprehensions and lambdas could look like incorrect conditional expressions.
- See <span class="target" id="index-1"></span><a class="pep reference external" href="https://peps.python.org/pep-0308/"><strong>PEP 308</strong></a> for some examples. If you put parentheses around your
- conditional expressions, you won’t run into this case.</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-0308/"><strong>PEP 308</strong></a> - Conditional Expressions</dt><dd><p>PEP written by Guido van Rossum and Raymond D. Hettinger; implemented by Thomas
- Wouters.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-309-partial-function-application">
- <span id="pep-309"></span><h2>PEP 309: Partial Function Application<a class="headerlink" href="#pep-309-partial-function-application" title="Permalink to this headline">¶</a></h2>
- <p>The <a class="reference internal" href="../library/functools.html#module-functools" title="functools: Higher-order functions and operations on callable objects."><code class="xref py py-mod docutils literal notranslate"><span class="pre">functools</span></code></a> module is intended to contain tools for functional-style
- programming.</p>
- <p>One useful tool in this module is the <code class="xref py py-func docutils literal notranslate"><span class="pre">partial()</span></code> function. For programs
- written in a functional style, you’ll sometimes want to construct variants of
- existing functions that have some of the parameters filled in. Consider a
- Python function <code class="docutils literal notranslate"><span class="pre">f(a,</span> <span class="pre">b,</span> <span class="pre">c)</span></code>; you could create a new function <code class="docutils literal notranslate"><span class="pre">g(b,</span> <span class="pre">c)</span></code> that
- was equivalent to <code class="docutils literal notranslate"><span class="pre">f(1,</span> <span class="pre">b,</span> <span class="pre">c)</span></code>. This is called “partial function
- application”.</p>
- <p><code class="xref py py-func docutils literal notranslate"><span class="pre">partial()</span></code> takes the arguments <code class="docutils literal notranslate"><span class="pre">(function,</span> <span class="pre">arg1,</span> <span class="pre">arg2,</span> <span class="pre">...</span> <span class="pre">kwarg1=value1,</span>
- <span class="pre">kwarg2=value2)</span></code>. The resulting object is callable, so you can just call it to
- invoke <em>function</em> with the filled-in arguments.</p>
- <p>Here’s a small but realistic example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">functools</span>
- <span class="k">def</span> <span class="nf">log</span> <span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">subsystem</span><span class="p">):</span>
- <span class="s2">"Write the contents of 'message' to the specified subsystem."</span>
- <span class="nb">print</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">subsystem</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
- <span class="o">...</span>
- <span class="n">server_log</span> <span class="o">=</span> <span class="n">functools</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span><span class="n">log</span><span class="p">,</span> <span class="n">subsystem</span><span class="o">=</span><span class="s1">'server'</span><span class="p">)</span>
- <span class="n">server_log</span><span class="p">(</span><span class="s1">'Unable to open socket'</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>Here’s another example, from a program that uses PyGTK. Here a context-sensitive
- pop-up menu is being constructed dynamically. The callback provided
- for the menu option is a partially applied version of the <code class="xref py py-meth docutils literal notranslate"><span class="pre">open_item()</span></code>
- method, where the first argument has been provided.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="o">...</span>
- <span class="k">class</span> <span class="nc">Application</span><span class="p">:</span>
- <span class="k">def</span> <span class="nf">open_item</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
- <span class="o">...</span>
- <span class="k">def</span> <span class="nf">init</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="n">open_func</span> <span class="o">=</span> <span class="n">functools</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">open_item</span><span class="p">,</span> <span class="n">item_path</span><span class="p">)</span>
- <span class="n">popup_menu</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="s2">"Open"</span><span class="p">,</span> <span class="n">open_func</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
- </pre></div>
- </div>
- <p>Another function in the <a class="reference internal" href="../library/functools.html#module-functools" title="functools: Higher-order functions and operations on callable objects."><code class="xref py py-mod docutils literal notranslate"><span class="pre">functools</span></code></a> module is the
- <code class="docutils literal notranslate"><span class="pre">update_wrapper(wrapper,</span> <span class="pre">wrapped)</span></code> function that helps you write
- well-behaved decorators. <code class="xref py py-func docutils literal notranslate"><span class="pre">update_wrapper()</span></code> copies the name, module, and
- docstring attribute to a wrapper function so that tracebacks inside the wrapped
- function are easier to understand. For example, you might write:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">my_decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span>
- <span class="nb">print</span> <span class="s1">'Calling decorated function'</span>
- <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">)</span>
- <span class="n">functools</span><span class="o">.</span><span class="n">update_wrapper</span><span class="p">(</span><span class="n">wrapper</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">wrapper</span>
- </pre></div>
- </div>
- <p><code class="xref py py-func docutils literal notranslate"><span class="pre">wraps()</span></code> is a decorator that can be used inside your own decorators to copy
- the wrapped function’s information. An alternate version of the previous
- example would be:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">my_decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="nd">@functools</span><span class="o">.</span><span class="n">wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span>
- <span class="nb">print</span> <span class="s1">'Calling decorated function'</span>
- <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">wrapper</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-0309/"><strong>PEP 309</strong></a> - Partial Function Application</dt><dd><p>PEP proposed and written by Peter Harris; implemented by Hye-Shik Chang and Nick
- Coghlan, with adaptations by Raymond Hettinger.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-314-metadata-for-python-software-packages-v1-1">
- <span id="pep-314"></span><h2>PEP 314: Metadata for Python Software Packages v1.1<a class="headerlink" href="#pep-314-metadata-for-python-software-packages-v1-1" title="Permalink to this headline">¶</a></h2>
- <p>Some simple dependency support was added to Distutils. The <code class="xref py py-func docutils literal notranslate"><span class="pre">setup()</span></code>
- function now has <code class="docutils literal notranslate"><span class="pre">requires</span></code>, <code class="docutils literal notranslate"><span class="pre">provides</span></code>, and <code class="docutils literal notranslate"><span class="pre">obsoletes</span></code> keyword
- parameters. When you build a source distribution using the <code class="docutils literal notranslate"><span class="pre">sdist</span></code> command,
- the dependency information will be recorded in the <code class="file docutils literal notranslate"><span class="pre">PKG-INFO</span></code> file.</p>
- <p>Another new keyword parameter is <code class="docutils literal notranslate"><span class="pre">download_url</span></code>, which should be set to a URL
- for the package’s source code. This means it’s now possible to look up an entry
- in the package index, determine the dependencies for a package, and download the
- required packages.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">VERSION</span> <span class="o">=</span> <span class="s1">'1.0'</span>
- <span class="n">setup</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">'PyPackage'</span><span class="p">,</span>
- <span class="n">version</span><span class="o">=</span><span class="n">VERSION</span><span class="p">,</span>
- <span class="n">requires</span><span class="o">=</span><span class="p">[</span><span class="s1">'numarray'</span><span class="p">,</span> <span class="s1">'zlib (>=1.1.4)'</span><span class="p">],</span>
- <span class="n">obsoletes</span><span class="o">=</span><span class="p">[</span><span class="s1">'OldPackage'</span><span class="p">]</span>
- <span class="n">download_url</span><span class="o">=</span><span class="p">(</span><span class="s1">'http://www.example.com/pypackage/dist/pkg-</span><span class="si">%s</span><span class="s1">.tar.gz'</span>
- <span class="o">%</span> <span class="n">VERSION</span><span class="p">),</span>
- <span class="p">)</span>
- </pre></div>
- </div>
- <p>Another new enhancement to the Python package index at
- <a class="reference external" href="https://pypi.org">https://pypi.org</a> is storing source and binary archives for a
- package. The new <strong class="command">upload</strong> Distutils command will upload a package to
- the repository.</p>
- <p>Before a package can be uploaded, you must be able to build a distribution using
- the <strong class="command">sdist</strong> Distutils command. Once that works, you can run <code class="docutils literal notranslate"><span class="pre">python</span>
- <span class="pre">setup.py</span> <span class="pre">upload</span></code> to add your package to the PyPI archive. Optionally you can
- GPG-sign the package by supplying the <code class="xref std std-option docutils literal notranslate"><span class="pre">--sign</span></code> and <code class="xref std std-option docutils literal notranslate"><span class="pre">--identity</span></code>
- options.</p>
- <p>Package uploading was implemented by Martin von Löwis and Richard Jones.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-4"></span><a class="pep reference external" href="https://peps.python.org/pep-0314/"><strong>PEP 314</strong></a> - Metadata for Python Software Packages v1.1</dt><dd><p>PEP proposed and written by A.M. Kuchling, Richard Jones, and Fred Drake;
- implemented by Richard Jones and Fred Drake.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-328-absolute-and-relative-imports">
- <span id="pep-328"></span><h2>PEP 328: Absolute and Relative Imports<a class="headerlink" href="#pep-328-absolute-and-relative-imports" title="Permalink to this headline">¶</a></h2>
- <p>The simpler part of <span class="target" id="index-5"></span><a class="pep reference external" href="https://peps.python.org/pep-0328/"><strong>PEP 328</strong></a> was implemented in Python 2.4: parentheses could now
- be used to enclose the names imported from a module using the <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">...</span> <span class="pre">import</span>
- <span class="pre">...</span></code> statement, making it easier to import many different names.</p>
- <p>The more complicated part has been implemented in Python 2.5: importing a module
- can be specified to use absolute or package-relative imports. The plan is to
- move toward making absolute imports the default in future versions of Python.</p>
- <p>Let’s say you have a package directory like this:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">pkg</span><span class="o">/</span>
- <span class="n">pkg</span><span class="o">/</span><span class="fm">__init__</span><span class="o">.</span><span class="n">py</span>
- <span class="n">pkg</span><span class="o">/</span><span class="n">main</span><span class="o">.</span><span class="n">py</span>
- <span class="n">pkg</span><span class="o">/</span><span class="n">string</span><span class="o">.</span><span class="n">py</span>
- </pre></div>
- </div>
- <p>This defines a package named <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg</span></code> containing the <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.main</span></code> and
- <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.string</span></code> submodules.</p>
- <p>Consider the code in the <code class="file docutils literal notranslate"><span class="pre">main.py</span></code> module. What happens if it executes
- the statement <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">string</span></code>? In Python 2.4 and earlier, it will first look
- in the package’s directory to perform a relative import, finds
- <code class="file docutils literal notranslate"><span class="pre">pkg/string.py</span></code>, imports the contents of that file as the
- <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.string</span></code> module, and that module is bound to the name <code class="docutils literal notranslate"><span class="pre">string</span></code> in the
- <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.main</span></code> module’s namespace.</p>
- <p>That’s fine if <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.string</span></code> was what you wanted. But what if you wanted
- Python’s standard <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? There’s no clean way to ignore
- <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.string</span></code> and look for the standard module; generally you had to look at
- the contents of <code class="docutils literal notranslate"><span class="pre">sys.modules</span></code>, which is slightly unclean. Holger Krekel’s
- <code class="xref py py-mod docutils literal notranslate"><span class="pre">py.std</span></code> package provides a tidier way to perform imports from the standard
- library, <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">py;</span> <span class="pre">py.std.string.join()</span></code>, but that package isn’t available
- on all Python installations.</p>
- <p>Reading code which relies on relative imports is also less clear, because a
- reader may be confused about which module, <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> or <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.string</span></code>,
- is intended to be used. Python users soon learned not to duplicate the names of
- standard library modules in the names of their packages’ submodules, but you
- can’t protect against having your submodule’s name being used for a new module
- added in a future version of Python.</p>
- <p>In Python 2.5, you can switch <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>’s behaviour to absolute imports
- using a <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">__future__</span> <span class="pre">import</span> <span class="pre">absolute_import</span></code> directive. This absolute-import
- behaviour will become the default in a future version (probably Python
- 2.7). Once absolute imports are the default, <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">string</span></code> will always
- find the standard library’s version. It’s suggested that users should begin
- using absolute imports as much as possible, so it’s preferable to begin writing
- <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">pkg</span> <span class="pre">import</span> <span class="pre">string</span></code> in your code.</p>
- <p>Relative imports are still possible by adding a leading period to the module
- name when using the <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">...</span> <span class="pre">import</span></code> form:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Import names from pkg.string</span>
- <span class="kn">from</span> <span class="nn">.string</span> <span class="kn">import</span> <span class="n">name1</span><span class="p">,</span> <span class="n">name2</span>
- <span class="c1"># Import pkg.string</span>
- <span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">string</span>
- </pre></div>
- </div>
- <p>This imports 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 relative to the current package, so in
- <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.main</span></code> this will import <em>name1</em> and <em>name2</em> from <code class="xref py py-mod docutils literal notranslate"><span class="pre">pkg.string</span></code>.
- Additional leading periods perform the relative import starting from the parent
- of the current package. For example, code in the <code class="xref py py-mod docutils literal notranslate"><span class="pre">A.B.C</span></code> module can do:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">D</span> <span class="c1"># Imports A.B.D</span>
- <span class="kn">from</span> <span class="nn">..</span> <span class="kn">import</span> <span class="n">E</span> <span class="c1"># Imports A.E</span>
- <span class="kn">from</span> <span class="nn">..F</span> <span class="kn">import</span> <span class="n">G</span> <span class="c1"># Imports A.F.G</span>
- </pre></div>
- </div>
- <p>Leading periods cannot be used with the <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">modname</span></code> form of the import
- statement, only the <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">...</span> <span class="pre">import</span></code> form.</p>
- <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-0328/"><strong>PEP 328</strong></a> - Imports: Multi-Line and Absolute/Relative</dt><dd><p>PEP written by Aahz; implemented by Thomas Wouters.</p>
- </dd>
- <dt><a class="reference external" href="https://pylib.readthedocs.io/">https://pylib.readthedocs.io/</a></dt><dd><p>The py library by Holger Krekel, which contains the <code class="xref py py-mod docutils literal notranslate"><span class="pre">py.std</span></code> package.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-338-executing-modules-as-scripts">
- <span id="pep-338"></span><h2>PEP 338: Executing Modules as Scripts<a class="headerlink" href="#pep-338-executing-modules-as-scripts" title="Permalink to this headline">¶</a></h2>
- <p>The <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> switch added in Python 2.4 to execute a module as a script
- gained a few more abilities. Instead of being implemented in C code inside the
- Python interpreter, the switch now uses an implementation in a new module,
- <a class="reference internal" href="../library/runpy.html#module-runpy" title="runpy: Locate and run Python modules without importing them first."><code class="xref py py-mod docutils literal notranslate"><span class="pre">runpy</span></code></a>.</p>
- <p>The <a class="reference internal" href="../library/runpy.html#module-runpy" title="runpy: Locate and run Python modules without importing them first."><code class="xref py py-mod docutils literal notranslate"><span class="pre">runpy</span></code></a> module implements a more sophisticated import mechanism so that
- it’s now possible to run modules in a package such as <code class="xref py py-mod docutils literal notranslate"><span class="pre">pychecker.checker</span></code>.
- The module also supports alternative import mechanisms such as the
- <a class="reference internal" href="../library/zipimport.html#module-zipimport" title="zipimport: Support for importing Python modules from ZIP archives."><code class="xref py py-mod docutils literal notranslate"><span class="pre">zipimport</span></code></a> module. This means you can add a .zip archive’s path to
- <code class="docutils literal notranslate"><span class="pre">sys.path</span></code> and then use the <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> switch to execute code from the
- archive.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-7"></span><a class="pep reference external" href="https://peps.python.org/pep-0338/"><strong>PEP 338</strong></a> - Executing modules as scripts</dt><dd><p>PEP written and implemented by Nick Coghlan.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-341-unified-try-except-finally">
- <span id="pep-341"></span><h2>PEP 341: Unified try/except/finally<a class="headerlink" href="#pep-341-unified-try-except-finally" title="Permalink to this headline">¶</a></h2>
- <p>Until Python 2.5, the <a class="reference internal" href="../reference/compound_stmts.html#try"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">try</span></code></a> statement came in two flavours. You could
- use a <a class="reference internal" href="../reference/compound_stmts.html#finally"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">finally</span></code></a> block to ensure that code is always executed, or one or
- more <a class="reference internal" href="../reference/compound_stmts.html#except"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">except</span></code></a> blocks to catch specific exceptions. You couldn’t
- combine both <code class="xref std std-keyword docutils literal notranslate"><span class="pre">except</span></code> blocks and a <code class="xref std std-keyword docutils literal notranslate"><span class="pre">finally</span></code> block, because
- generating the right bytecode for the combined version was complicated and it
- wasn’t clear what the semantics of the combined statement should be.</p>
- <p>Guido van Rossum spent some time working with Java, which does support the
- equivalent of combining <a class="reference internal" href="../reference/compound_stmts.html#except"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">except</span></code></a> blocks and a <a class="reference internal" href="../reference/compound_stmts.html#finally"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">finally</span></code></a> block,
- and this clarified what the statement should mean. In Python 2.5, you can now
- write:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
- <span class="n">block</span><span class="o">-</span><span class="mi">1</span> <span class="o">...</span>
- <span class="k">except</span> <span class="n">Exception1</span><span class="p">:</span>
- <span class="n">handler</span><span class="o">-</span><span class="mi">1</span> <span class="o">...</span>
- <span class="k">except</span> <span class="n">Exception2</span><span class="p">:</span>
- <span class="n">handler</span><span class="o">-</span><span class="mi">2</span> <span class="o">...</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">else</span><span class="o">-</span><span class="n">block</span>
- <span class="k">finally</span><span class="p">:</span>
- <span class="n">final</span><span class="o">-</span><span class="n">block</span>
- </pre></div>
- </div>
- <p>The code in <em>block-1</em> is executed. If the code raises an exception, the various
- <a class="reference internal" href="../reference/compound_stmts.html#except"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">except</span></code></a> blocks are tested: if the exception is of class
- <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception1</span></code>, <em>handler-1</em> is executed; otherwise if it’s of class
- <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception2</span></code>, <em>handler-2</em> is executed, and so forth. If no exception is
- raised, the <em>else-block</em> is executed.</p>
- <p>No matter what happened previously, the <em>final-block</em> is executed once the code
- block is complete and any raised exceptions handled. Even if there’s an error in
- an exception handler or the <em>else-block</em> and a new exception is raised, the code
- in the <em>final-block</em> is still run.</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-0341/"><strong>PEP 341</strong></a> - Unifying try-except and try-finally</dt><dd><p>PEP written by Georg Brandl; implementation by Thomas Lee.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-342-new-generator-features">
- <span id="pep-342"></span><h2>PEP 342: New Generator Features<a class="headerlink" href="#pep-342-new-generator-features" title="Permalink to this headline">¶</a></h2>
- <p>Python 2.5 adds a simple way to pass values <em>into</em> a generator. As introduced in
- Python 2.3, generators only produce output; once a generator’s code was invoked
- to create an iterator, there was no way to pass any new information into the
- function when its execution is resumed. Sometimes the ability to pass in some
- information would be useful. Hackish solutions to this include making the
- generator’s code look at a global variable and then changing the global
- variable’s value, or passing in some mutable object that callers then modify.</p>
- <p>To refresh your memory of basic generators, here’s a simple example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">counter</span> <span class="p">(</span><span class="n">maximum</span><span class="p">):</span>
- <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
- <span class="k">while</span> <span class="n">i</span> <span class="o"><</span> <span class="n">maximum</span><span class="p">:</span>
- <span class="k">yield</span> <span class="n">i</span>
- <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
- </pre></div>
- </div>
- <p>When you call <code class="docutils literal notranslate"><span class="pre">counter(10)</span></code>, the result is an iterator that returns the values
- from 0 up to 9. On encountering the <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> statement, the iterator
- returns the provided value and suspends the function’s execution, preserving the
- local variables. Execution resumes on the following call to the iterator’s
- <a class="reference internal" href="../library/functions.html#next" title="next"><code class="xref py py-meth docutils literal notranslate"><span class="pre">next()</span></code></a> method, picking up after the <code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> statement.</p>
- <p>In Python 2.3, <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> was a statement; it didn’t return any value. In
- 2.5, <code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> is now an expression, returning a value that can be
- assigned to a variable or otherwise operated on:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">val</span> <span class="o">=</span> <span class="p">(</span><span class="k">yield</span> <span class="n">i</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>I recommend that you always put parentheses around a <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> expression
- when you’re doing something with the returned value, as in the above example.
- The parentheses aren’t always necessary, but it’s easier to always add them
- instead of having to remember when they’re needed.</p>
- <p>(<span class="target" id="index-9"></span><a class="pep reference external" href="https://peps.python.org/pep-0342/"><strong>PEP 342</strong></a> explains the exact rules, which are that a
- <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a>-expression must always be parenthesized except when it
- occurs at the top-level
- expression on the right-hand side of an assignment. This means you can write
- <code class="docutils literal notranslate"><span class="pre">val</span> <span class="pre">=</span> <span class="pre">yield</span> <span class="pre">i</span></code> but have to use parentheses when there’s an operation, as in
- <code class="docutils literal notranslate"><span class="pre">val</span> <span class="pre">=</span> <span class="pre">(yield</span> <span class="pre">i)</span> <span class="pre">+</span> <span class="pre">12</span></code>.)</p>
- <p>Values are sent into a generator by calling its <code class="docutils literal notranslate"><span class="pre">send(value)</span></code> method. The
- generator’s code is then resumed and the <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> expression returns the
- specified <em>value</em>. If the regular <a class="reference internal" href="../library/functions.html#next" title="next"><code class="xref py py-meth docutils literal notranslate"><span class="pre">next()</span></code></a> method is called, the
- <code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> returns <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>.</p>
- <p>Here’s the previous example, modified to allow changing the value of the
- internal counter.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">counter</span> <span class="p">(</span><span class="n">maximum</span><span class="p">):</span>
- <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
- <span class="k">while</span> <span class="n">i</span> <span class="o"><</span> <span class="n">maximum</span><span class="p">:</span>
- <span class="n">val</span> <span class="o">=</span> <span class="p">(</span><span class="k">yield</span> <span class="n">i</span><span class="p">)</span>
- <span class="c1"># If value provided, change counter</span>
- <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">i</span> <span class="o">=</span> <span class="n">val</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
- </pre></div>
- </div>
- <p>And here’s an example of changing the counter:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">it</span> <span class="o">=</span> <span class="n">counter</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="nb">print</span> <span class="n">it</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
- <span class="go">0</span>
- <span class="gp">>>> </span><span class="nb">print</span> <span class="n">it</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
- <span class="go">1</span>
- <span class="gp">>>> </span><span class="nb">print</span> <span class="n">it</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
- <span class="go">8</span>
- <span class="gp">>>> </span><span class="nb">print</span> <span class="n">it</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
- <span class="go">9</span>
- <span class="gp">>>> </span><span class="nb">print</span> <span class="n">it</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
- <span class="gt">Traceback (most recent call last):</span>
- File <span class="nb">"t.py"</span>, line <span class="m">15</span>, in <span class="n">?</span>
- <span class="w"> </span><span class="nb">print</span> <span class="n">it</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
- <span class="gr">StopIteration</span>
- </pre></div>
- </div>
- <p><a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> will usually return <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>, so you should always check
- for this case. Don’t just use its value in expressions unless you’re sure that
- the <code class="xref py py-meth docutils literal notranslate"><span class="pre">send()</span></code> method will be the only method used to resume your generator
- function.</p>
- <p>In addition to <code class="xref py py-meth docutils literal notranslate"><span class="pre">send()</span></code>, there are two other new methods on generators:</p>
- <ul>
- <li><p><code class="docutils literal notranslate"><span class="pre">throw(type,</span> <span class="pre">value=None,</span> <span class="pre">traceback=None)</span></code> is used to raise an exception
- inside the generator; the exception is raised by the <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> expression
- where the generator’s execution is paused.</p></li>
- <li><p><code class="xref py py-meth docutils literal notranslate"><span class="pre">close()</span></code> raises a new <a class="reference internal" href="../library/exceptions.html#GeneratorExit" title="GeneratorExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GeneratorExit</span></code></a> exception inside the generator
- to terminate the iteration. On receiving this exception, the generator’s code
- must either raise <a class="reference internal" href="../library/exceptions.html#GeneratorExit" title="GeneratorExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GeneratorExit</span></code></a> or <a class="reference internal" href="../library/exceptions.html#StopIteration" title="StopIteration"><code class="xref py py-exc docutils literal notranslate"><span class="pre">StopIteration</span></code></a>. Catching the
- <a class="reference internal" href="../library/exceptions.html#GeneratorExit" title="GeneratorExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GeneratorExit</span></code></a> exception and returning a value is illegal and will trigger
- 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>; if the function raises some other exception, that
- exception is propagated to the caller. <code class="xref py py-meth docutils literal notranslate"><span class="pre">close()</span></code> will also be called by
- Python’s garbage collector when the generator is garbage-collected.</p>
- <p>If you need to run cleanup code when a <a class="reference internal" href="../library/exceptions.html#GeneratorExit" title="GeneratorExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GeneratorExit</span></code></a> occurs, I suggest
- using a <code class="docutils literal notranslate"><span class="pre">try:</span> <span class="pre">...</span> <span class="pre">finally:</span></code> suite instead of catching <a class="reference internal" href="../library/exceptions.html#GeneratorExit" title="GeneratorExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">GeneratorExit</span></code></a>.</p>
- </li>
- </ul>
- <p>The cumulative effect of these changes is to turn generators from one-way
- producers of information into both producers and consumers.</p>
- <p>Generators also become <em>coroutines</em>, a more generalized form of subroutines.
- Subroutines are entered at one point and exited at another point (the top of the
- function, and a <a class="reference internal" href="../reference/simple_stmts.html#return"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code></a> statement), but coroutines can be entered,
- exited, and resumed at many different points (the <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> statements).
- We’ll have to figure out patterns for using coroutines effectively in Python.</p>
- <p>The addition of the <code class="xref py py-meth docutils literal notranslate"><span class="pre">close()</span></code> method has one side effect that isn’t obvious.
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">close()</span></code> is called when a generator is garbage-collected, so this means the
- generator’s code gets one last chance to run before the generator is destroyed.
- This last chance means that <code class="docutils literal notranslate"><span class="pre">try...finally</span></code> statements in generators can now
- be guaranteed to work; the <a class="reference internal" href="../reference/compound_stmts.html#finally"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">finally</span></code></a> clause will now always get a
- chance to run. The syntactic restriction that you couldn’t mix <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a>
- statements with a <code class="docutils literal notranslate"><span class="pre">try...finally</span></code> suite has therefore been removed. This
- seems like a minor bit of language trivia, but using generators and
- <code class="docutils literal notranslate"><span class="pre">try...finally</span></code> is actually necessary in order to implement the
- <a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a> statement described by <span class="target" id="index-10"></span><a class="pep reference external" href="https://peps.python.org/pep-0343/"><strong>PEP 343</strong></a>. I’ll look at this new statement
- in the following section.</p>
- <p>Another even more esoteric effect of this change: previously, the
- <code class="xref py py-attr docutils literal notranslate"><span class="pre">gi_frame</span></code> attribute of a generator was always a frame object. It’s now
- possible for <code class="xref py py-attr docutils literal notranslate"><span class="pre">gi_frame</span></code> to be <code class="docutils literal notranslate"><span class="pre">None</span></code> once the generator has been
- exhausted.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl>
- <dt><span class="target" id="index-11"></span><a class="pep reference external" href="https://peps.python.org/pep-0342/"><strong>PEP 342</strong></a> - Coroutines via Enhanced Generators</dt><dd><p>PEP written by Guido van Rossum and Phillip J. Eby; implemented by Phillip J.
- Eby. Includes examples of some fancier uses of generators as coroutines.</p>
- <p>Earlier versions of these features were proposed in <span class="target" id="index-12"></span><a class="pep reference external" href="https://peps.python.org/pep-0288/"><strong>PEP 288</strong></a> by Raymond
- Hettinger and <span class="target" id="index-13"></span><a class="pep reference external" href="https://peps.python.org/pep-0325/"><strong>PEP 325</strong></a> by Samuele Pedroni.</p>
- </dd>
- <dt><a class="reference external" href="https://en.wikipedia.org/wiki/Coroutine">https://en.wikipedia.org/wiki/Coroutine</a></dt><dd><p>The Wikipedia entry for coroutines.</p>
- </dd>
- <dt><a class="reference external" href="https://web.archive.org/web/20160321211320/http://www.sidhe.org/~dan/blog/archives/000178.html">https://web.archive.org/web/20160321211320/http://www.sidhe.org/~dan/blog/archives/000178.html</a></dt><dd><p>An explanation of coroutines from a Perl point of view, written by Dan Sugalski.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-343-the-with-statement">
- <span id="pep-343"></span><h2>PEP 343: The ‘with’ statement<a class="headerlink" href="#pep-343-the-with-statement" title="Permalink to this headline">¶</a></h2>
- <p>The ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement clarifies code that previously would use
- <code class="docutils literal notranslate"><span class="pre">try...finally</span></code> blocks to ensure that clean-up code is executed. In this
- section, I’ll discuss the statement as it will commonly be used. In the next
- section, I’ll examine the implementation details and show how to write objects
- for use with this statement.</p>
- <p>The ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement is a new control-flow structure whose basic
- structure is:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">expression</span> <span class="p">[</span><span class="k">as</span> <span class="n">variable</span><span class="p">]:</span>
- <span class="k">with</span><span class="o">-</span><span class="n">block</span>
- </pre></div>
- </div>
- <p>The expression is evaluated, and it should result in an object that supports the
- context management protocol (that is, has <code class="xref py py-meth docutils literal notranslate"><span class="pre">__enter__()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">__exit__()</span></code>
- methods.</p>
- <p>The object’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">__enter__()</span></code> is called before <em>with-block</em> is executed and
- therefore can run set-up code. It also may return a value that is bound to the
- name <em>variable</em>, if given. (Note carefully that <em>variable</em> is <em>not</em> assigned
- the result of <em>expression</em>.)</p>
- <p>After execution of the <em>with-block</em> is finished, the object’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">__exit__()</span></code>
- method is called, even if the block raised an exception, and can therefore run
- clean-up code.</p>
- <p>To enable the statement in Python 2.5, you need to add the following directive
- to your module:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">with_statement</span>
- </pre></div>
- </div>
- <p>The statement will always be enabled in Python 2.6.</p>
- <p>Some standard Python objects now support the context management protocol and can
- be used with the ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement. File objects are one example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">with</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="k">as</span> <span class="n">f</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
- <span class="nb">print</span> <span class="n">line</span>
- <span class="o">...</span> <span class="n">more</span> <span class="n">processing</span> <span class="n">code</span> <span class="o">...</span>
- </pre></div>
- </div>
- <p>After this statement has executed, the file object in <em>f</em> will have been
- automatically closed, even if the <a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a> loop raised an exception
- part-way through the block.</p>
- <div class="admonition note">
- <p class="admonition-title">Note</p>
- <p>In this case, <em>f</em> is the same object created by <a class="reference internal" href="../library/functions.html#open" title="open"><code class="xref py py-func docutils literal notranslate"><span class="pre">open()</span></code></a>, because
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">file.__enter__()</span></code> returns <em>self</em>.</p>
- </div>
- <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’s locks and condition variables also support the
- ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
- <span class="k">with</span> <span class="n">lock</span><span class="p">:</span>
- <span class="c1"># Critical section of code</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>The lock is acquired before the block is executed and always released once the
- block is complete.</p>
- <p>The new <code class="xref py py-func docutils literal notranslate"><span class="pre">localcontext()</span></code> function in 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 makes it easy
- to save and restore the current decimal context, which encapsulates the desired
- precision and rounding characteristics for computations:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">decimal</span> <span class="kn">import</span> <span class="n">Decimal</span><span class="p">,</span> <span class="n">Context</span><span class="p">,</span> <span class="n">localcontext</span>
- <span class="c1"># Displays with default precision of 28 digits</span>
- <span class="n">v</span> <span class="o">=</span> <span class="n">Decimal</span><span class="p">(</span><span class="s1">'578'</span><span class="p">)</span>
- <span class="nb">print</span> <span class="n">v</span><span class="o">.</span><span class="n">sqrt</span><span class="p">()</span>
- <span class="k">with</span> <span class="n">localcontext</span><span class="p">(</span><span class="n">Context</span><span class="p">(</span><span class="n">prec</span><span class="o">=</span><span class="mi">16</span><span class="p">)):</span>
- <span class="c1"># All code in this block uses a precision of 16 digits.</span>
- <span class="c1"># The original context is restored on exiting the block.</span>
- <span class="nb">print</span> <span class="n">v</span><span class="o">.</span><span class="n">sqrt</span><span class="p">()</span>
- </pre></div>
- </div>
- <section id="writing-context-managers">
- <span id="new-25-context-managers"></span><h3>Writing Context Managers<a class="headerlink" href="#writing-context-managers" title="Permalink to this headline">¶</a></h3>
- <p>Under the hood, the ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement is fairly complicated. Most
- people will only use ‘<code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code>’ in company with existing objects and
- don’t need to know these details, so you can skip the rest of this section if
- you like. Authors of new objects will need to understand the details of the
- underlying implementation and should keep reading.</p>
- <p>A high-level explanation of the context management protocol is:</p>
- <ul class="simple">
- <li><p>The expression is evaluated and should result in an object called a “context
- manager”. The context manager must have <code class="xref py py-meth docutils literal notranslate"><span class="pre">__enter__()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">__exit__()</span></code>
- methods.</p></li>
- <li><p>The context manager’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">__enter__()</span></code> method is called. The value returned
- is assigned to <em>VAR</em>. If no <code class="docutils literal notranslate"><span class="pre">'as</span> <span class="pre">VAR'</span></code> clause is present, the value is simply
- discarded.</p></li>
- <li><p>The code in <em>BLOCK</em> is executed.</p></li>
- <li><p>If <em>BLOCK</em> raises an exception, the <code class="docutils literal notranslate"><span class="pre">__exit__(type,</span> <span class="pre">value,</span> <span class="pre">traceback)</span></code>
- is called with the exception details, the same values returned by
- <a class="reference internal" href="../library/sys.html#sys.exc_info" title="sys.exc_info"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.exc_info()</span></code></a>. The method’s return value controls whether the exception
- is re-raised: any false value re-raises the exception, and <code class="docutils literal notranslate"><span class="pre">True</span></code> will result
- in suppressing it. You’ll only rarely want to suppress the exception, because
- if you do the author of the code containing the ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement will
- never realize anything went wrong.</p></li>
- <li><p>If <em>BLOCK</em> didn’t raise an exception, the <code class="xref py py-meth docutils literal notranslate"><span class="pre">__exit__()</span></code> method is still
- called, but <em>type</em>, <em>value</em>, and <em>traceback</em> are all <code class="docutils literal notranslate"><span class="pre">None</span></code>.</p></li>
- </ul>
- <p>Let’s think through an example. I won’t present detailed code but will only
- sketch the methods necessary for a database that supports transactions.</p>
- <p>(For people unfamiliar with database terminology: a set of changes to the
- database are grouped into a transaction. Transactions can be either committed,
- meaning that all the changes are written into the database, or rolled back,
- meaning that the changes are all discarded and the database is unchanged. See
- any database textbook for more information.)</p>
- <p>Let’s assume there’s an object representing a database connection. Our goal will
- be to let the user write code like this:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">db_connection</span> <span class="o">=</span> <span class="n">DatabaseConnection</span><span class="p">()</span>
- <span class="k">with</span> <span class="n">db_connection</span> <span class="k">as</span> <span class="n">cursor</span><span class="p">:</span>
- <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'insert into ...'</span><span class="p">)</span>
- <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'delete from ...'</span><span class="p">)</span>
- <span class="c1"># ... more operations ...</span>
- </pre></div>
- </div>
- <p>The transaction should be committed if the code in the block runs flawlessly or
- rolled back if there’s an exception. Here’s the basic interface for
- <code class="xref py py-class docutils literal notranslate"><span class="pre">DatabaseConnection</span></code> that I’ll assume:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">DatabaseConnection</span><span class="p">:</span>
- <span class="c1"># Database interface</span>
- <span class="k">def</span> <span class="nf">cursor</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="s2">"Returns a cursor object and starts a new transaction"</span>
- <span class="k">def</span> <span class="nf">commit</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="s2">"Commits current transaction"</span>
- <span class="k">def</span> <span class="nf">rollback</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="s2">"Rolls back current transaction"</span>
- </pre></div>
- </div>
- <p>The <code class="xref py py-meth docutils literal notranslate"><span class="pre">__enter__()</span></code> method is pretty easy, having only to start a new
- transaction. For this application the resulting cursor object would be a useful
- result, so the method will return it. The user can then add <code class="docutils literal notranslate"><span class="pre">as</span> <span class="pre">cursor</span></code> to
- their ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement to bind the cursor to a variable name.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">DatabaseConnection</span><span class="p">:</span>
- <span class="o">...</span>
- <span class="k">def</span> <span class="fm">__enter__</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="c1"># Code to start a new transaction</span>
- <span class="n">cursor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
- <span class="k">return</span> <span class="n">cursor</span>
- </pre></div>
- </div>
- <p>The <code class="xref py py-meth docutils literal notranslate"><span class="pre">__exit__()</span></code> method is the most complicated because it’s where most of
- the work has to be done. The method has to check if an exception occurred. If
- there was no exception, the transaction is committed. The transaction is rolled
- back if there was an exception.</p>
- <p>In the code below, execution will just fall off the end of the function,
- returning the default value of <code class="docutils literal notranslate"><span class="pre">None</span></code>. <code class="docutils literal notranslate"><span class="pre">None</span></code> is false, so the exception
- will be re-raised automatically. If you wished, you could be more explicit and
- add a <a class="reference internal" href="../reference/simple_stmts.html#return"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code></a> statement at the marked location.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">DatabaseConnection</span><span class="p">:</span>
- <span class="o">...</span>
- <span class="k">def</span> <span class="fm">__exit__</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">tb</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="c1"># No exception, so commit</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># Exception occurred, so rollback.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
- <span class="c1"># return False</span>
- </pre></div>
- </div>
- </section>
- <section id="the-contextlib-module">
- <span id="contextlibmod"></span><h3>The contextlib module<a class="headerlink" href="#the-contextlib-module" title="Permalink to this headline">¶</a></h3>
- <p>The new <a class="reference internal" href="../library/contextlib.html#module-contextlib" title="contextlib: Utilities for with-statement contexts."><code class="xref py py-mod docutils literal notranslate"><span class="pre">contextlib</span></code></a> module provides some functions and a decorator that
- are useful for writing objects for use with the ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement.</p>
- <p>The decorator is called <code class="xref py py-func docutils literal notranslate"><span class="pre">contextmanager()</span></code>, and lets you write a single
- generator function instead of defining a new class. The generator should yield
- exactly one value. The code up to the <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> will be executed as the
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">__enter__()</span></code> method, and the value yielded will be the method’s return
- value that will get bound to the variable in the ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement’s
- <code class="xref std std-keyword docutils literal notranslate"><span class="pre">as</span></code> clause, if any. The code after the <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> will be
- executed in the <code class="xref py py-meth docutils literal notranslate"><span class="pre">__exit__()</span></code> method. Any exception raised in the block will
- be raised by the <code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> statement.</p>
- <p>Our database example from the previous section could be written using this
- decorator as:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>
- <span class="nd">@contextmanager</span>
- <span class="k">def</span> <span class="nf">db_transaction</span> <span class="p">(</span><span class="n">connection</span><span class="p">):</span>
- <span class="n">cursor</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="k">yield</span> <span class="n">cursor</span>
- <span class="k">except</span><span class="p">:</span>
- <span class="n">connection</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
- <span class="k">raise</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">connection</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
- <span class="n">db</span> <span class="o">=</span> <span class="n">DatabaseConnection</span><span class="p">()</span>
- <span class="k">with</span> <span class="n">db_transaction</span><span class="p">(</span><span class="n">db</span><span class="p">)</span> <span class="k">as</span> <span class="n">cursor</span><span class="p">:</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>The <a class="reference internal" href="../library/contextlib.html#module-contextlib" title="contextlib: Utilities for with-statement contexts."><code class="xref py py-mod docutils literal notranslate"><span class="pre">contextlib</span></code></a> module also has a <code class="docutils literal notranslate"><span class="pre">nested(mgr1,</span> <span class="pre">mgr2,</span> <span class="pre">...)</span></code> function
- that combines a number of context managers so you don’t need to write nested
- ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statements. In this example, the single ‘<code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code>’
- statement both starts a database transaction and acquires a thread lock:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
- <span class="k">with</span> <span class="n">nested</span> <span class="p">(</span><span class="n">db_transaction</span><span class="p">(</span><span class="n">db</span><span class="p">),</span> <span class="n">lock</span><span class="p">)</span> <span class="k">as</span> <span class="p">(</span><span class="n">cursor</span><span class="p">,</span> <span class="n">locked</span><span class="p">):</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>Finally, the <code class="docutils literal notranslate"><span class="pre">closing(object)</span></code> function returns <em>object</em> so that it can be
- bound to a variable, and calls <code class="docutils literal notranslate"><span class="pre">object.close</span></code> at the end of the block.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">urllib</span><span class="o">,</span> <span class="nn">sys</span>
- <span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">closing</span>
- <span class="k">with</span> <span class="n">closing</span><span class="p">(</span><span class="n">urllib</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="s1">'http://www.yahoo.com'</span><span class="p">))</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
- <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
- </pre></div>
- </div>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-14"></span><a class="pep reference external" href="https://peps.python.org/pep-0343/"><strong>PEP 343</strong></a> - The “with” statement</dt><dd><p>PEP written by Guido van Rossum and Nick Coghlan; implemented by Mike Bland,
- Guido van Rossum, and Neal Norwitz. The PEP shows the code generated for a
- ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement, which can be helpful in learning how the statement
- works.</p>
- </dd>
- </dl>
- <p>The documentation for the <a class="reference internal" href="../library/contextlib.html#module-contextlib" title="contextlib: Utilities for with-statement contexts."><code class="xref py py-mod docutils literal notranslate"><span class="pre">contextlib</span></code></a> module.</p>
- </div>
- </section>
- </section>
- <section id="pep-352-exceptions-as-new-style-classes">
- <span id="pep-352"></span><h2>PEP 352: Exceptions as New-Style Classes<a class="headerlink" href="#pep-352-exceptions-as-new-style-classes" title="Permalink to this headline">¶</a></h2>
- <p>Exception classes can now be new-style classes, not just classic classes, and
- the built-in <a class="reference internal" href="../library/exceptions.html#Exception" title="Exception"><code class="xref py py-exc docutils literal notranslate"><span class="pre">Exception</span></code></a> class and all the standard built-in exceptions
- (<a class="reference internal" href="../library/exceptions.html#NameError" title="NameError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NameError</span></code></a>, <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>, etc.) are now new-style classes.</p>
- <p>The inheritance hierarchy for exceptions has been rearranged a bit. In 2.5, the
- inheritance relationships are:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="ne">BaseException</span> <span class="c1"># New in Python 2.5</span>
- <span class="o">|-</span> <span class="ne">KeyboardInterrupt</span>
- <span class="o">|-</span> <span class="ne">SystemExit</span>
- <span class="o">|-</span> <span class="ne">Exception</span>
- <span class="o">|-</span> <span class="p">(</span><span class="nb">all</span> <span class="n">other</span> <span class="n">current</span> <span class="n">built</span><span class="o">-</span><span class="ow">in</span> <span class="n">exceptions</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>This rearrangement was done because people often want to catch all exceptions
- that indicate program errors. <a class="reference internal" href="../library/exceptions.html#KeyboardInterrupt" title="KeyboardInterrupt"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code></a> and <a class="reference internal" href="../library/exceptions.html#SystemExit" title="SystemExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SystemExit</span></code></a>
- aren’t errors, though, and usually represent an explicit action such as the user
- hitting <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">Control</kbd>-<kbd class="kbd docutils literal notranslate">C</kbd></kbd> or code calling <a class="reference internal" href="../library/sys.html#sys.exit" title="sys.exit"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.exit()</span></code></a>. A bare <code class="docutils literal notranslate"><span class="pre">except:</span></code> will
- catch all exceptions, so you commonly need to list <a class="reference internal" href="../library/exceptions.html#KeyboardInterrupt" title="KeyboardInterrupt"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code></a> and
- <a class="reference internal" href="../library/exceptions.html#SystemExit" title="SystemExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SystemExit</span></code></a> in order to re-raise them. The usual pattern is:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
- <span class="o">...</span>
- <span class="k">except</span> <span class="p">(</span><span class="ne">KeyboardInterrupt</span><span class="p">,</span> <span class="ne">SystemExit</span><span class="p">):</span>
- <span class="k">raise</span>
- <span class="k">except</span><span class="p">:</span>
- <span class="c1"># Log error...</span>
- <span class="c1"># Continue running program...</span>
- </pre></div>
- </div>
- <p>In Python 2.5, you can now write <code class="docutils literal notranslate"><span class="pre">except</span> <span class="pre">Exception</span></code> to achieve the same
- result, catching all the exceptions that usually indicate errors but leaving
- <a class="reference internal" href="../library/exceptions.html#KeyboardInterrupt" title="KeyboardInterrupt"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code></a> and <a class="reference internal" href="../library/exceptions.html#SystemExit" title="SystemExit"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SystemExit</span></code></a> alone. As in previous versions,
- a bare <code class="docutils literal notranslate"><span class="pre">except:</span></code> still catches all exceptions.</p>
- <p>The goal for Python 3.0 is to require any class raised as an exception to derive
- from <a class="reference internal" href="../library/exceptions.html#BaseException" title="BaseException"><code class="xref py py-exc docutils literal notranslate"><span class="pre">BaseException</span></code></a> or some descendant of <a class="reference internal" href="../library/exceptions.html#BaseException" title="BaseException"><code class="xref py py-exc docutils literal notranslate"><span class="pre">BaseException</span></code></a>, and future
- releases in the Python 2.x series may begin to enforce this constraint.
- Therefore, I suggest you begin making all your exception classes derive from
- <a class="reference internal" href="../library/exceptions.html#Exception" title="Exception"><code class="xref py py-exc docutils literal notranslate"><span class="pre">Exception</span></code></a> now. It’s been suggested that the bare <code class="docutils literal notranslate"><span class="pre">except:</span></code> form should
- be removed in Python 3.0, but Guido van Rossum hasn’t decided whether to do this
- or not.</p>
- <p>Raising of strings as exceptions, as in the statement <code class="docutils literal notranslate"><span class="pre">raise</span> <span class="pre">"Error</span>
- <span class="pre">occurred"</span></code>, is deprecated in Python 2.5 and will trigger a warning. The aim is
- to be able to remove the string-exception feature in a few releases.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-15"></span><a class="pep reference external" href="https://peps.python.org/pep-0352/"><strong>PEP 352</strong></a> - Required Superclass for Exceptions</dt><dd><p>PEP written by Brett Cannon and Guido van Rossum; implemented by Brett Cannon.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-353-using-ssize-t-as-the-index-type">
- <span id="pep-353"></span><h2>PEP 353: Using ssize_t as the index type<a class="headerlink" href="#pep-353-using-ssize-t-as-the-index-type" title="Permalink to this headline">¶</a></h2>
- <p>A wide-ranging change to Python’s C API, using a new <a class="reference internal" href="../c-api/intro.html#c.Py_ssize_t" title="Py_ssize_t"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a> type
- definition instead of <span class="c-expr sig sig-inline c"><span class="kt">int</span></span>, will permit the interpreter to handle more
- data on 64-bit platforms. This change doesn’t affect Python’s capacity on 32-bit
- platforms.</p>
- <p>Various pieces of the Python interpreter used C’s <span class="c-expr sig sig-inline c"><span class="kt">int</span></span> type to store
- sizes or counts; for example, the number of items in a list or tuple were stored
- in an <span class="c-expr sig sig-inline c"><span class="kt">int</span></span>. The C compilers for most 64-bit platforms still define
- <span class="c-expr sig sig-inline c"><span class="kt">int</span></span> as a 32-bit type, so that meant that lists could only hold up to
- <code class="docutils literal notranslate"><span class="pre">2**31</span> <span class="pre">-</span> <span class="pre">1</span></code> = 2147483647 items. (There are actually a few different
- programming models that 64-bit C compilers can use – see
- <a class="reference external" href="https://unix.org/version2/whatsnew/lp64_wp.html">https://unix.org/version2/whatsnew/lp64_wp.html</a> for a discussion – but the
- most commonly available model leaves <span class="c-expr sig sig-inline c"><span class="kt">int</span></span> as 32 bits.)</p>
- <p>A limit of 2147483647 items doesn’t really matter on a 32-bit platform because
- you’ll run out of memory before hitting the length limit. Each list item
- requires space for a pointer, which is 4 bytes, plus space for a
- <a class="reference internal" href="../c-api/structures.html#c.PyObject" title="PyObject"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyObject</span></code></a> representing the item. 2147483647*4 is already more bytes
- than a 32-bit address space can contain.</p>
- <p>It’s possible to address that much memory on a 64-bit platform, however. The
- pointers for a list that size would only require 16 GiB of space, so it’s not
- unreasonable that Python programmers might construct lists that large.
- Therefore, the Python interpreter had to be changed to use some type other than
- <span class="c-expr sig sig-inline c"><span class="kt">int</span></span>, and this will be a 64-bit type on 64-bit platforms. The change
- will cause incompatibilities on 64-bit machines, so it was deemed worth making
- the transition now, while the number of 64-bit users is still relatively small.
- (In 5 or 10 years, we may <em>all</em> be on 64-bit machines, and the transition would
- be more painful then.)</p>
- <p>This change most strongly affects authors of C extension modules. Python
- strings and container types such as lists and tuples now use
- <a class="reference internal" href="../c-api/intro.html#c.Py_ssize_t" title="Py_ssize_t"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a> to store their size. Functions such as
- <a class="reference internal" href="../c-api/list.html#c.PyList_Size" title="PyList_Size"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyList_Size()</span></code></a> now return <a class="reference internal" href="../c-api/intro.html#c.Py_ssize_t" title="Py_ssize_t"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a>. Code in extension modules
- may therefore need to have some variables changed to <a class="reference internal" href="../c-api/intro.html#c.Py_ssize_t" title="Py_ssize_t"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a>.</p>
- <p>The <a class="reference internal" href="../c-api/arg.html#c.PyArg_ParseTuple" title="PyArg_ParseTuple"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyArg_ParseTuple()</span></code></a> and <a class="reference internal" href="../c-api/arg.html#c.Py_BuildValue" title="Py_BuildValue"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_BuildValue()</span></code></a> functions have a new
- conversion code, <code class="docutils literal notranslate"><span class="pre">n</span></code>, for <a class="reference internal" href="../c-api/intro.html#c.Py_ssize_t" title="Py_ssize_t"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a>. <a class="reference internal" href="../c-api/arg.html#c.PyArg_ParseTuple" title="PyArg_ParseTuple"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyArg_ParseTuple()</span></code></a>’s
- <code class="docutils literal notranslate"><span class="pre">s#</span></code> and <code class="docutils literal notranslate"><span class="pre">t#</span></code> still output <span class="c-expr sig sig-inline c"><span class="kt">int</span></span> by default, but you can define the
- macro <code class="xref c c-macro docutils literal notranslate"><span class="pre">PY_SSIZE_T_CLEAN</span></code> before including <code class="file docutils literal notranslate"><span class="pre">Python.h</span></code> to make
- them return <a class="reference internal" href="../c-api/intro.html#c.Py_ssize_t" title="Py_ssize_t"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a>.</p>
- <p><span class="target" id="index-16"></span><a class="pep reference external" href="https://peps.python.org/pep-0353/"><strong>PEP 353</strong></a> has a section on conversion guidelines that extension authors should
- read to learn about supporting 64-bit platforms.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-17"></span><a class="pep reference external" href="https://peps.python.org/pep-0353/"><strong>PEP 353</strong></a> - Using ssize_t as the index type</dt><dd><p>PEP written and implemented by Martin von Löwis.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="pep-357-the-index-method">
- <span id="pep-357"></span><h2>PEP 357: The ‘__index__’ method<a class="headerlink" href="#pep-357-the-index-method" title="Permalink to this headline">¶</a></h2>
- <p>The NumPy developers had a problem that could only be solved by adding a new
- special method, <code class="xref py py-meth docutils literal notranslate"><span class="pre">__index__()</span></code>. When using slice notation, as in
- <code class="docutils literal notranslate"><span class="pre">[start:stop:step]</span></code>, the values of the <em>start</em>, <em>stop</em>, and <em>step</em> indexes
- must all be either integers or long integers. NumPy defines a variety of
- specialized integer types corresponding to unsigned and signed integers of 8,
- 16, 32, and 64 bits, but there was no way to signal that these types could be
- used as slice indexes.</p>
- <p>Slicing can’t just use the existing <code class="xref py py-meth docutils literal notranslate"><span class="pre">__int__()</span></code> method because that method
- is also used to implement coercion to integers. If slicing used
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">__int__()</span></code>, floating-point numbers would also become legal slice indexes
- and that’s clearly an undesirable behaviour.</p>
- <p>Instead, a new special method called <code class="xref py py-meth docutils literal notranslate"><span class="pre">__index__()</span></code> was added. It takes no
- arguments and returns an integer giving the slice index to use. For example:</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="fm">__index__</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span>
- </pre></div>
- </div>
- <p>The return value must be either a Python integer or long integer. The
- interpreter will check that the type returned is correct, and raises a
- <a class="reference internal" href="../library/exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a> if this requirement isn’t met.</p>
- <p>A corresponding <a class="reference internal" href="../c-api/typeobj.html#c.PyNumberMethods.nb_index" title="PyNumberMethods.nb_index"><code class="xref c c-member docutils literal notranslate"><span class="pre">nb_index</span></code></a> slot was added to the C-level
- <a class="reference internal" href="../c-api/typeobj.html#c.PyNumberMethods" title="PyNumberMethods"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyNumberMethods</span></code></a> structure to let C extensions implement this protocol.
- <code class="docutils literal notranslate"><span class="pre">PyNumber_Index(obj)</span></code> can be used in extension code to call the
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">__index__()</span></code> function and retrieve its result.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><span class="target" id="index-18"></span><a class="pep reference external" href="https://peps.python.org/pep-0357/"><strong>PEP 357</strong></a> - Allowing Any Object to be Used for Slicing</dt><dd><p>PEP written and implemented by Travis Oliphant.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="other-language-changes">
- <span id="other-lang"></span><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.5 makes to the core Python language.</p>
- <ul>
- <li><p>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> type has a new hook for letting subclasses provide a default
- value when a key isn’t contained in the dictionary. When a key isn’t found, the
- dictionary’s <code class="docutils literal notranslate"><span class="pre">__missing__(key)</span></code> method will be called. This hook is used
- to implement the new <code class="xref py py-class docutils literal notranslate"><span class="pre">defaultdict</span></code> class in the <a class="reference internal" href="../library/collections.html#module-collections" title="collections: Container datatypes"><code class="xref py py-mod docutils literal notranslate"><span class="pre">collections</span></code></a>
- module. The following example defines a dictionary that returns zero for any
- missing key:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">zerodict</span> <span class="p">(</span><span class="nb">dict</span><span class="p">):</span>
- <span class="k">def</span> <span class="fm">__missing__</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
- <span class="k">return</span> <span class="mi">0</span>
- <span class="n">d</span> <span class="o">=</span> <span class="n">zerodict</span><span class="p">({</span><span class="mi">1</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">2</span><span class="p">})</span>
- <span class="nb">print</span> <span class="n">d</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># Prints 1, 2</span>
- <span class="nb">print</span> <span class="n">d</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="c1"># Prints 0, 0</span>
- </pre></div>
- </div>
- </li>
- <li><p>Both 8-bit and Unicode strings have new <code class="docutils literal notranslate"><span class="pre">partition(sep)</span></code> and
- <code class="docutils literal notranslate"><span class="pre">rpartition(sep)</span></code> methods that simplify a common use case.</p>
- <p>The <code class="docutils literal notranslate"><span class="pre">find(S)</span></code> method is often used to get an index which is then used to
- slice the string and obtain the pieces that are before and after the separator.
- <code class="docutils literal notranslate"><span class="pre">partition(sep)</span></code> condenses this pattern into a single method call that
- returns a 3-tuple containing the substring before the separator, the separator
- itself, and the substring after the separator. If the separator isn’t found,
- the first element of the tuple is the entire string and the other two elements
- are empty. <code class="docutils literal notranslate"><span class="pre">rpartition(sep)</span></code> also returns a 3-tuple but starts searching
- from the end of the string; the <code class="docutils literal notranslate"><span class="pre">r</span></code> stands for ‘reverse’.</p>
- <p>Some examples:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="p">(</span><span class="s1">'http://www.python.org'</span><span class="p">)</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s1">'://'</span><span class="p">)</span>
- <span class="go">('http', '://', 'www.python.org')</span>
- <span class="gp">>>> </span><span class="p">(</span><span class="s1">'file:/usr/share/doc/index.html'</span><span class="p">)</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s1">'://'</span><span class="p">)</span>
- <span class="go">('file:/usr/share/doc/index.html', '', '')</span>
- <span class="gp">>>> </span><span class="p">(</span><span class="sa">u</span><span class="s1">'Subject: a quick question'</span><span class="p">)</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s1">':'</span><span class="p">)</span>
- <span class="go">(u'Subject', u':', u' a quick question')</span>
- <span class="gp">>>> </span><span class="s1">'www.python.org'</span><span class="o">.</span><span class="n">rpartition</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span>
- <span class="go">('www.python', '.', 'org')</span>
- <span class="gp">>>> </span><span class="s1">'www.python.org'</span><span class="o">.</span><span class="n">rpartition</span><span class="p">(</span><span class="s1">':'</span><span class="p">)</span>
- <span class="go">('', '', 'www.python.org')</span>
- </pre></div>
- </div>
- <p>(Implemented by Fredrik Lundh following a suggestion by Raymond Hettinger.)</p>
- </li>
- <li><p>The <code class="xref py py-meth docutils literal notranslate"><span class="pre">startswith()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">endswith()</span></code> methods of string types now accept
- tuples of strings to check for.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">is_image_file</span> <span class="p">(</span><span class="n">filename</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">((</span><span class="s1">'.gif'</span><span class="p">,</span> <span class="s1">'.jpg'</span><span class="p">,</span> <span class="s1">'.tiff'</span><span class="p">))</span>
- </pre></div>
- </div>
- <p>(Implemented by Georg Brandl following a suggestion by Tom Lynn.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/functions.html#min" title="min"><code class="xref py py-func docutils literal notranslate"><span class="pre">min()</span></code></a> and <a class="reference internal" href="../library/functions.html#max" title="max"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> built-in functions gained a <code class="docutils literal notranslate"><span class="pre">key</span></code> keyword
- parameter analogous to the <code class="docutils literal notranslate"><span class="pre">key</span></code> argument for <code class="xref py py-meth docutils literal notranslate"><span class="pre">sort()</span></code>. This parameter
- supplies a function that takes a single argument and is called for every value
- in the list; <a class="reference internal" href="../library/functions.html#min" title="min"><code class="xref py py-func docutils literal notranslate"><span class="pre">min()</span></code></a>/<a class="reference internal" href="../library/functions.html#max" title="max"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> will return the element with the
- smallest/largest return value from this function. For example, to find the
- longest string in a list, you can do:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'medium'</span><span class="p">,</span> <span class="s1">'longest'</span><span class="p">,</span> <span class="s1">'short'</span><span class="p">]</span>
- <span class="c1"># Prints 'longest'</span>
- <span class="nb">print</span> <span class="nb">max</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="nb">len</span><span class="p">)</span>
- <span class="c1"># Prints 'short', because lexicographically 'short' has the largest value</span>
- <span class="nb">print</span> <span class="nb">max</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>(Contributed by Steven Bethard and Raymond Hettinger.)</p>
- </li>
- <li><p>Two new built-in functions, <a class="reference internal" href="../library/functions.html#any" title="any"><code class="xref py py-func docutils literal notranslate"><span class="pre">any()</span></code></a> and <a class="reference internal" href="../library/functions.html#all" title="all"><code class="xref py py-func docutils literal notranslate"><span class="pre">all()</span></code></a>, evaluate whether an
- iterator contains any true or false values. <a class="reference internal" href="../library/functions.html#any" title="any"><code class="xref py py-func docutils literal notranslate"><span class="pre">any()</span></code></a> returns <a class="reference internal" href="../library/constants.html#True" title="True"><code class="xref py py-const docutils literal notranslate"><span class="pre">True</span></code></a>
- if any value returned by the iterator is true; otherwise it will return
- <a class="reference internal" href="../library/constants.html#False" title="False"><code class="xref py py-const docutils literal notranslate"><span class="pre">False</span></code></a>. <a class="reference internal" href="../library/functions.html#all" title="all"><code class="xref py py-func docutils literal notranslate"><span class="pre">all()</span></code></a> returns <a class="reference internal" href="../library/constants.html#True" title="True"><code class="xref py py-const docutils literal notranslate"><span class="pre">True</span></code></a> only if all of the values
- returned by the iterator evaluate as true. (Suggested by Guido van Rossum, and
- implemented by Raymond Hettinger.)</p></li>
- <li><p>The result of a class’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">__hash__()</span></code> method can now be either a long
- integer or a regular integer. If a long integer is returned, the hash of that
- value is taken. In earlier versions the hash value was required to be a
- regular integer, but in 2.5 the <a class="reference internal" href="../library/functions.html#id" title="id"><code class="xref py py-func docutils literal notranslate"><span class="pre">id()</span></code></a> built-in was changed to always
- return non-negative numbers, and users often seem to use <code class="docutils literal notranslate"><span class="pre">id(self)</span></code> in
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">__hash__()</span></code> methods (though this is discouraged).</p>
- </li>
- <li><p>ASCII is now the default encoding for modules. It’s now a syntax error if a
- module contains string literals with 8-bit characters but doesn’t have an
- encoding declaration. In Python 2.4 this triggered a warning, not a syntax
- error. See <span class="target" id="index-19"></span><a class="pep reference external" href="https://peps.python.org/pep-0263/"><strong>PEP 263</strong></a> for how to declare a module’s encoding; for example, you
- might add a line like this near the top of the source file:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- coding: latin1 -*-</span>
- </pre></div>
- </div>
- </li>
- <li><p>A new warning, <a class="reference internal" href="../library/exceptions.html#UnicodeWarning" title="UnicodeWarning"><code class="xref py py-class docutils literal notranslate"><span class="pre">UnicodeWarning</span></code></a>, is triggered when you attempt to
- compare a Unicode string and an 8-bit string that can’t be converted to Unicode
- using the default ASCII encoding. The result of the comparison is false:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">chr</span><span class="p">(</span><span class="mi">128</span><span class="p">)</span> <span class="o">==</span> <span class="n">unichr</span><span class="p">(</span><span class="mi">128</span><span class="p">)</span> <span class="c1"># Can't convert chr(128) to Unicode</span>
- <span class="go">__main__:1: UnicodeWarning: Unicode equal comparison failed</span>
- <span class="go"> to convert both arguments to Unicode - interpreting them</span>
- <span class="go"> as being unequal</span>
- <span class="go">False</span>
- <span class="gp">>>> </span><span class="nb">chr</span><span class="p">(</span><span class="mi">127</span><span class="p">)</span> <span class="o">==</span> <span class="n">unichr</span><span class="p">(</span><span class="mi">127</span><span class="p">)</span> <span class="c1"># chr(127) can be converted</span>
- <span class="go">True</span>
- </pre></div>
- </div>
- <p>Previously this would raise a <a class="reference internal" href="../library/exceptions.html#UnicodeDecodeError" title="UnicodeDecodeError"><code class="xref py py-class docutils literal notranslate"><span class="pre">UnicodeDecodeError</span></code></a> exception, but in 2.5
- this could result in puzzling problems when accessing a dictionary. If you
- looked up <code class="docutils literal notranslate"><span class="pre">unichr(128)</span></code> and <code class="docutils literal notranslate"><span class="pre">chr(128)</span></code> was being used as a key, you’d get a
- <a class="reference internal" href="../library/exceptions.html#UnicodeDecodeError" title="UnicodeDecodeError"><code class="xref py py-class docutils literal notranslate"><span class="pre">UnicodeDecodeError</span></code></a> exception. Other changes in 2.5 resulted in this
- exception being raised instead of suppressed by the code in <code class="file docutils literal notranslate"><span class="pre">dictobject.c</span></code>
- that implements dictionaries.</p>
- <p>Raising an exception for such a comparison is strictly correct, but the change
- might have broken code, so instead <a class="reference internal" href="../library/exceptions.html#UnicodeWarning" title="UnicodeWarning"><code class="xref py py-class docutils literal notranslate"><span class="pre">UnicodeWarning</span></code></a> was introduced.</p>
- <p>(Implemented by Marc-André Lemburg.)</p>
- </li>
- <li><p>One error that Python programmers sometimes make is forgetting to include an
- <code class="file docutils literal notranslate"><span class="pre">__init__.py</span></code> module in a package directory. Debugging this mistake can be
- confusing, and usually requires running Python with the <a class="reference internal" href="../using/cmdline.html#cmdoption-1"><code class="xref std std-option docutils literal notranslate"><span class="pre">-v</span></code></a> switch to
- log all the paths searched. In Python 2.5, a new <a class="reference internal" href="../library/exceptions.html#ImportWarning" title="ImportWarning"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ImportWarning</span></code></a> warning is
- triggered when an import would have picked up a directory as a package but no
- <code class="file docutils literal notranslate"><span class="pre">__init__.py</span></code> was found. This warning is silently ignored by default;
- provide the <a class="reference internal" href="../using/cmdline.html#cmdoption-W"><code class="xref std std-option docutils literal notranslate"><span class="pre">-Wd</span></code></a> option when running the Python executable to display
- the warning message. (Implemented by Thomas Wouters.)</p></li>
- <li><p>The list of base classes in a class definition can now be empty. As an
- example, this is now legal:</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">pass</span>
- </pre></div>
- </div>
- <p>(Implemented by Brett Cannon.)</p>
- </li>
- </ul>
- <section id="interactive-interpreter-changes">
- <span id="interactive"></span><h3>Interactive Interpreter Changes<a class="headerlink" href="#interactive-interpreter-changes" title="Permalink to this headline">¶</a></h3>
- <p>In the interactive interpreter, <code class="docutils literal notranslate"><span class="pre">quit</span></code> and <code class="docutils literal notranslate"><span class="pre">exit</span></code> have long been strings so
- that new users get a somewhat helpful message when they try to quit:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">quit</span>
- <span class="go">'Use Ctrl-D (i.e. EOF) to exit.'</span>
- </pre></div>
- </div>
- <p>In Python 2.5, <code class="docutils literal notranslate"><span class="pre">quit</span></code> and <code class="docutils literal notranslate"><span class="pre">exit</span></code> are now objects that still produce string
- representations of themselves, but are also callable. Newbies who try <code class="docutils literal notranslate"><span class="pre">quit()</span></code>
- or <code class="docutils literal notranslate"><span class="pre">exit()</span></code> will now exit the interpreter as they expect. (Implemented by
- Georg Brandl.)</p>
- <p>The Python executable now accepts the standard long options <a class="reference internal" href="../using/cmdline.html#cmdoption-help"><code class="xref std std-option docutils literal notranslate"><span class="pre">--help</span></code></a>
- and <a class="reference internal" href="../using/cmdline.html#cmdoption-version"><code class="xref std std-option docutils literal notranslate"><span class="pre">--version</span></code></a>; on Windows, it also accepts the <a class="reference internal" href="../using/cmdline.html#cmdoption-0"><code class="xref std std-option docutils literal notranslate"><span class="pre">/?</span></code></a> option
- for displaying a help message. (Implemented by Georg Brandl.)</p>
- </section>
- <section id="optimizations">
- <span id="opts"></span><h3>Optimizations<a class="headerlink" href="#optimizations" title="Permalink to this headline">¶</a></h3>
- <p>Several of the optimizations were developed at the NeedForSpeed sprint, an event
- held in Reykjavik, Iceland, from May 21–28 2006. The sprint focused on speed
- enhancements to the CPython implementation and was funded by EWT LLC with local
- support from CCP Games. Those optimizations added at this sprint are specially
- marked in the following list.</p>
- <ul class="simple">
- <li><p>When they were introduced in Python 2.4, the built-in <a class="reference internal" href="../library/stdtypes.html#set" title="set"><code class="xref py py-class docutils literal notranslate"><span class="pre">set</span></code></a> and
- <a class="reference internal" href="../library/stdtypes.html#frozenset" title="frozenset"><code class="xref py py-class docutils literal notranslate"><span class="pre">frozenset</span></code></a> types were built on top of Python’s dictionary type. In 2.5
- the internal data structure has been customized for implementing sets, and as a
- result sets will use a third less memory and are somewhat faster. (Implemented
- by Raymond Hettinger.)</p></li>
- <li><p>The speed of some Unicode operations, such as finding substrings, string
- splitting, and character map encoding and decoding, has been improved.
- (Substring search and splitting improvements were added by Fredrik Lundh and
- Andrew Dalke at the NeedForSpeed sprint. Character maps were improved by Walter
- Dörwald and Martin von Löwis.)</p>
- </li>
- <li><p>The <code class="docutils literal notranslate"><span class="pre">long(str,</span> <span class="pre">base)</span></code> function is now faster on long digit strings
- because fewer intermediate results are calculated. The peak is for strings of
- around 800–1000 digits where the function is 6 times faster. (Contributed by
- Alan McIntyre and committed at the NeedForSpeed sprint.)</p>
- </li>
- <li><p>It’s now illegal to mix iterating over a file with <code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">line</span> <span class="pre">in</span> <span class="pre">file</span></code> and
- calling the file object’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">read()</span></code>/<a class="reference internal" href="../library/readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><code class="xref py py-meth docutils literal notranslate"><span class="pre">readline()</span></code></a>/<code class="xref py py-meth docutils literal notranslate"><span class="pre">readlines()</span></code>
- methods. Iteration uses an internal buffer and the <code class="xref py py-meth docutils literal notranslate"><span class="pre">read*()</span></code> methods
- don’t use that buffer. Instead they would return the data following the
- buffer, causing the data to appear out of order. Mixing iteration and these
- methods will now trigger a <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> from the <code class="xref py py-meth docutils literal notranslate"><span class="pre">read*()</span></code> method.
- (Implemented by Thomas Wouters.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/struct.html#module-struct" title="struct: Interpret bytes as packed binary data."><code class="xref py py-mod docutils literal notranslate"><span class="pre">struct</span></code></a> module now compiles structure format strings into an
- internal representation and caches this representation, yielding a 20% speedup.
- (Contributed by Bob Ippolito at the NeedForSpeed sprint.)</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 got a 1 or 2% speedup by switching to Python’s allocator
- functions instead of the system’s <code class="xref c c-func docutils literal notranslate"><span class="pre">malloc()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">free()</span></code>.
- (Contributed by Jack Diederich at the NeedForSpeed sprint.)</p></li>
- <li><p>The code generator’s peephole optimizer now performs simple constant folding
- in expressions. If you write something like <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">=</span> <span class="pre">2+3</span></code>, the code generator
- will do the arithmetic and produce code corresponding to <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">=</span> <span class="pre">5</span></code>. (Proposed
- and implemented by Raymond Hettinger.)</p></li>
- <li><p>Function calls are now faster because code objects now keep the most recently
- finished frame (a “zombie frame”) in an internal field of the code object,
- reusing it the next time the code object is invoked. (Original patch by Michael
- Hudson, modified by Armin Rigo and Richard Jones; committed at the NeedForSpeed
- sprint.) Frame objects are also slightly smaller, which may improve cache
- locality and reduce memory usage a bit. (Contributed by Neal Norwitz.)</p>
- </li>
- <li><p>Python’s built-in exceptions are now new-style classes, a change that speeds
- up instantiation considerably. Exception handling in Python 2.5 is therefore
- about 30% faster than in 2.4. (Contributed by Richard Jones, Georg Brandl and
- Sean Reifschneider at the NeedForSpeed sprint.)</p></li>
- <li><p>Importing now caches the paths tried, recording whether they exist or not so
- that the interpreter makes fewer <code class="xref c c-func docutils literal notranslate"><span class="pre">open()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">stat()</span></code> calls on
- startup. (Contributed by Martin von Löwis and Georg Brandl.)</p>
- </li>
- </ul>
- </section>
- </section>
- <section id="new-improved-and-removed-modules">
- <span id="modules"></span><h2>New, Improved, and Removed Modules<a class="headerlink" href="#new-improved-and-removed-modules" title="Permalink to this headline">¶</a></h2>
- <p>The standard library received many enhancements and bug fixes in Python 2.5.
- 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 SVN logs for all the details.</p>
- <ul>
- <li><p>The <a class="reference internal" href="../library/audioop.html#module-audioop" title="audioop: Manipulate raw audio data. (deprecated)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">audioop</span></code></a> module now supports the a-LAW encoding, and the code for
- u-LAW encoding has been improved. (Contributed by Lars Immisch.)</p></li>
- <li><p>The <a class="reference internal" href="../library/codecs.html#module-codecs" title="codecs: Encode and decode data and streams."><code class="xref py py-mod docutils literal notranslate"><span class="pre">codecs</span></code></a> module gained support for incremental codecs. The
- <code class="xref py py-func docutils literal notranslate"><span class="pre">codec.lookup()</span></code> function now returns a <code class="xref py py-class docutils literal notranslate"><span class="pre">CodecInfo</span></code> instance instead
- of a tuple. <code class="xref py py-class docutils literal notranslate"><span class="pre">CodecInfo</span></code> instances behave like a 4-tuple to preserve
- backward compatibility but also have the attributes <code class="xref py py-attr docutils literal notranslate"><span class="pre">encode</span></code>,
- <code class="xref py py-attr docutils literal notranslate"><span class="pre">decode</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">incrementalencoder</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">incrementaldecoder</span></code>,
- <code class="xref py py-attr docutils literal notranslate"><span class="pre">streamwriter</span></code>, and <code class="xref py py-attr docutils literal notranslate"><span class="pre">streamreader</span></code>. Incremental codecs can receive
- input and produce output in multiple chunks; the output is the same as if the
- entire input was fed to the non-incremental codec. See the <a class="reference internal" href="../library/codecs.html#module-codecs" title="codecs: Encode and decode data and streams."><code class="xref py py-mod docutils literal notranslate"><span class="pre">codecs</span></code></a> module
- documentation for details. (Designed and implemented by Walter Dörwald.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/collections.html#module-collections" title="collections: Container datatypes"><code class="xref py py-mod docutils literal notranslate"><span class="pre">collections</span></code></a> module gained a new type, <code class="xref py py-class docutils literal notranslate"><span class="pre">defaultdict</span></code>, that
- subclasses the standard <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> type. The new type mostly behaves like a
- dictionary but constructs a default value when a key isn’t present,
- automatically adding it to the dictionary for the requested key value.</p>
- <p>The first argument to <code class="xref py py-class docutils literal notranslate"><span class="pre">defaultdict</span></code>’s constructor is a factory function
- that gets called whenever a key is requested but not found. This factory
- function receives no arguments, so you can use built-in type constructors such
- as <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> or <a class="reference internal" href="../library/functions.html#int" title="int"><code class="xref py py-func docutils literal notranslate"><span class="pre">int()</span></code></a>. For example, you can make an index of words
- based on their initial letter like this:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">words</span> <span class="o">=</span> <span class="s2">"""Nel mezzo del cammin di nostra vita</span>
- <span class="s2">mi ritrovai per una selva oscura</span>
- <span class="s2">che la diritta via era smarrita"""</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
- <span class="n">index</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">words</span><span class="p">:</span>
- <span class="n">init_letter</span> <span class="o">=</span> <span class="n">w</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
- <span class="n">index</span><span class="p">[</span><span class="n">init_letter</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>Printing <code class="docutils literal notranslate"><span class="pre">index</span></code> results in the following output:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">defaultdict</span><span class="p">(</span><span class="o"><</span><span class="nb">type</span> <span class="s1">'list'</span><span class="o">></span><span class="p">,</span> <span class="p">{</span><span class="s1">'c'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'cammin'</span><span class="p">,</span> <span class="s1">'che'</span><span class="p">],</span> <span class="s1">'e'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'era'</span><span class="p">],</span>
- <span class="s1">'d'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'del'</span><span class="p">,</span> <span class="s1">'di'</span><span class="p">,</span> <span class="s1">'diritta'</span><span class="p">],</span> <span class="s1">'m'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'mezzo'</span><span class="p">,</span> <span class="s1">'mi'</span><span class="p">],</span>
- <span class="s1">'l'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'la'</span><span class="p">],</span> <span class="s1">'o'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'oscura'</span><span class="p">],</span> <span class="s1">'n'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'nel'</span><span class="p">,</span> <span class="s1">'nostra'</span><span class="p">],</span>
- <span class="s1">'p'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'per'</span><span class="p">],</span> <span class="s1">'s'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'selva'</span><span class="p">,</span> <span class="s1">'smarrita'</span><span class="p">],</span>
- <span class="s1">'r'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'ritrovai'</span><span class="p">],</span> <span class="s1">'u'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'una'</span><span class="p">],</span> <span class="s1">'v'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'vita'</span><span class="p">,</span> <span class="s1">'via'</span><span class="p">]}</span>
- </pre></div>
- </div>
- <p>(Contributed by Guido van Rossum.)</p>
- </li>
- <li><p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">deque</span></code> double-ended queue type supplied by the <a class="reference internal" href="../library/collections.html#module-collections" title="collections: Container datatypes"><code class="xref py py-mod docutils literal notranslate"><span class="pre">collections</span></code></a>
- module now has a <code class="docutils literal notranslate"><span class="pre">remove(value)</span></code> method that removes the first occurrence
- of <em>value</em> in the queue, raising <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> if the value isn’t found.
- (Contributed by Raymond Hettinger.)</p></li>
- <li><p>New module: The <a class="reference internal" href="../library/contextlib.html#module-contextlib" title="contextlib: Utilities for with-statement contexts."><code class="xref py py-mod docutils literal notranslate"><span class="pre">contextlib</span></code></a> module contains helper functions for use
- with the new ‘<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a>’ statement. See section <a class="reference internal" href="#contextlibmod"><span class="std std-ref">The contextlib module</span></a>
- for more about this module.</p></li>
- <li><p>New module: The <a class="reference internal" href="../library/profile.html#module-cProfile" title="cProfile"><code class="xref py py-mod docutils literal notranslate"><span class="pre">cProfile</span></code></a> module is a C implementation of the existing
- <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 that has much lower overhead. The module’s interface is
- the same as <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>: you run <code class="docutils literal notranslate"><span class="pre">cProfile.run('main()')</span></code> to profile a
- function, can save profile data to a file, etc. It’s not yet known if the
- Hotshot profiler, which is also written in C but doesn’t match 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’s interface, will continue to be maintained in future
- versions of Python. (Contributed by Armin Rigo.)</p>
- <p>Also, the <a class="reference internal" href="../library/profile.html#module-pstats" title="pstats: Statistics object for use with the profiler."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pstats</span></code></a> module for analyzing the data measured by the profiler
- now supports directing the output to any file object by supplying a <em>stream</em>
- argument to the <code class="xref py py-class docutils literal notranslate"><span class="pre">Stats</span></code> constructor. (Contributed by Skip Montanaro.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/csv.html#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">csv</span></code></a> module, which parses files in comma-separated value format,
- received several enhancements and a number of bugfixes. You can now set the
- maximum size in bytes of a field by calling the
- <code class="docutils literal notranslate"><span class="pre">csv.field_size_limit(new_limit)</span></code> function; omitting the <em>new_limit</em>
- argument will return the currently set limit. The <code class="xref py py-class docutils literal notranslate"><span class="pre">reader</span></code> class now has
- a <code class="xref py py-attr docutils literal notranslate"><span class="pre">line_num</span></code> attribute that counts the number of physical lines read from
- the source; records can span multiple physical lines, so <code class="xref py py-attr docutils literal notranslate"><span class="pre">line_num</span></code> is not
- the same as the number of records read.</p>
- <p>The CSV parser is now stricter about multi-line quoted fields. Previously, if a
- line ended within a quoted field without a terminating newline character, a
- newline would be inserted into the returned field. This behavior caused problems
- when reading files that contained carriage return characters within fields, so
- the code was changed to return the field without inserting newlines. As a
- consequence, if newlines embedded within fields are important, the input should
- be split into lines in a manner that preserves the newline characters.</p>
- <p>(Contributed by Skip Montanaro and Andrew McNamara.)</p>
- </li>
- <li><p>The <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> class in 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 now has a
- <code class="docutils literal notranslate"><span class="pre">strptime(string,</span> <span class="pre">format)</span></code> method for parsing date strings, contributed
- by Josh Spoerri. It uses the same format characters as <a class="reference internal" href="../library/time.html#time.strptime" title="time.strptime"><code class="xref py py-func docutils literal notranslate"><span class="pre">time.strptime()</span></code></a> and
- <a class="reference internal" href="../library/time.html#time.strftime" title="time.strftime"><code class="xref py py-func docutils literal notranslate"><span class="pre">time.strftime()</span></code></a>:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
- <span class="n">ts</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="s1">'10:13:15 2006-03-07'</span><span class="p">,</span>
- <span class="s1">'%H:%M:%S %Y-%m-</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span>
- </pre></div>
- </div>
- </li>
- <li><p>The <code class="xref py py-meth docutils literal notranslate"><span class="pre">SequenceMatcher.get_matching_blocks()</span></code> method in 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 guarantees to return a minimal list of blocks describing matching
- subsequences. Previously, the algorithm would occasionally break a block of
- matching elements into two list entries. (Enhancement by Tim Peters.)</p></li>
- <li><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 gained a <code class="docutils literal notranslate"><span class="pre">SKIP</span></code> option that keeps an example from
- being executed at all. This is intended for code snippets that are usage
- examples intended for the reader and aren’t actually test cases.</p>
- <p>An <em>encoding</em> parameter was added to the <code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code> function and the
- <code class="xref py py-class docutils literal notranslate"><span class="pre">DocFileSuite</span></code> class to specify the file’s encoding. This makes it
- easier to use non-ASCII characters in tests contained within a docstring.
- (Contributed by Bjorn Tillenius.)</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 has been updated to version 4.0. (Contributed by
- Barry Warsaw.)</p>
- </li>
- <li id="index-20"><p>The <a class="reference internal" href="../library/fileinput.html#module-fileinput" title="fileinput: Loop over standard input or a list of files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">fileinput</span></code></a> module was made more flexible. Unicode filenames are now
- supported, and a <em>mode</em> parameter that defaults to <code class="docutils literal notranslate"><span class="pre">"r"</span></code> was added to the
- <a class="reference internal" href="../library/functions.html#input" title="input"><code class="xref py py-func docutils literal notranslate"><span class="pre">input()</span></code></a> function to allow opening files in binary or <a class="reference internal" href="../glossary.html#term-universal-newlines"><span class="xref std std-term">universal
- newlines</span></a> mode. Another new parameter, <em>openhook</em>, lets you use a function
- other than <a class="reference internal" href="../library/functions.html#open" title="open"><code class="xref py py-func docutils literal notranslate"><span class="pre">open()</span></code></a> to open the input files. Once you’re iterating over
- the set of files, the <code class="xref py py-class docutils literal notranslate"><span class="pre">FileInput</span></code> object’s new <code class="xref py py-meth docutils literal notranslate"><span class="pre">fileno()</span></code> returns
- the file descriptor for the currently opened file. (Contributed by Georg
- Brandl.)</p></li>
- <li><p>In the <a class="reference internal" href="../library/gc.html#module-gc" title="gc: Interface to the cycle-detecting garbage collector."><code class="xref py py-mod docutils literal notranslate"><span class="pre">gc</span></code></a> module, the new <code class="xref py py-func docutils literal notranslate"><span class="pre">get_count()</span></code> function returns a 3-tuple
- containing the current collection counts for the three GC generations. This is
- accounting information for the garbage collector; when these counts reach a
- specified threshold, a garbage collection sweep will be made. The existing
- <a class="reference internal" href="../library/gc.html#gc.collect" title="gc.collect"><code class="xref py py-func docutils literal notranslate"><span class="pre">gc.collect()</span></code></a> function now takes an optional <em>generation</em> argument of 0, 1,
- or 2 to specify which generation to collect. (Contributed by Barry Warsaw.)</p></li>
- <li><p>The <code class="xref py py-func docutils literal notranslate"><span class="pre">nsmallest()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">nlargest()</span></code> functions in 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 now support a <code class="docutils literal notranslate"><span class="pre">key</span></code> keyword parameter similar to the one provided by
- the <a class="reference internal" href="../library/functions.html#min" title="min"><code class="xref py py-func docutils literal notranslate"><span class="pre">min()</span></code></a>/<a class="reference internal" href="../library/functions.html#max" title="max"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> functions and the <code class="xref py py-meth docutils literal notranslate"><span class="pre">sort()</span></code> methods. For
- example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">heapq</span>
- <span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"short"</span><span class="p">,</span> <span class="s1">'medium'</span><span class="p">,</span> <span class="s1">'longest'</span><span class="p">,</span> <span class="s1">'longer still'</span><span class="p">]</span>
- <span class="gp">>>> </span><span class="n">heapq</span><span class="o">.</span><span class="n">nsmallest</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">L</span><span class="p">)</span> <span class="c1"># Return two lowest elements, lexicographically</span>
- <span class="go">['longer still', 'longest']</span>
- <span class="gp">>>> </span><span class="n">heapq</span><span class="o">.</span><span class="n">nsmallest</span><span class="p">(</span><span class="mi">2</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="nb">len</span><span class="p">)</span> <span class="c1"># Return two shortest elements</span>
- <span class="go">['short', 'medium']</span>
- </pre></div>
- </div>
- <p>(Contributed by Raymond Hettinger.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/itertools.html#itertools.islice" title="itertools.islice"><code class="xref py py-func docutils literal notranslate"><span class="pre">itertools.islice()</span></code></a> function now accepts <code class="docutils literal notranslate"><span class="pre">None</span></code> for the start and
- step arguments. This makes it more compatible with the attributes of slice
- objects, so that you can now write the following:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">s</span> <span class="o">=</span> <span class="nb">slice</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="c1"># Create slice object</span>
- <span class="n">itertools</span><span class="o">.</span><span class="n">islice</span><span class="p">(</span><span class="n">iterable</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">start</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">stop</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">step</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>(Contributed by Raymond Hettinger.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/functions.html#format" title="format"><code class="xref py py-func docutils literal notranslate"><span class="pre">format()</span></code></a> function in 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 has been modified and
- two new functions were added, <code class="xref py py-func docutils literal notranslate"><span class="pre">format_string()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">currency()</span></code>.</p>
- <p>The <a class="reference internal" href="../library/functions.html#format" title="format"><code class="xref py py-func docutils literal notranslate"><span class="pre">format()</span></code></a> function’s <em>val</em> parameter could previously be a string as
- long as no more than one %char specifier appeared; now the parameter must be
- exactly one %char specifier with no surrounding text. An optional <em>monetary</em>
- parameter was also added which, if <code class="docutils literal notranslate"><span class="pre">True</span></code>, will use the locale’s rules for
- formatting currency in placing a separator between groups of three digits.</p>
- <p>To format strings with multiple %char specifiers, use the new
- <code class="xref py py-func docutils literal notranslate"><span class="pre">format_string()</span></code> function that works like <a class="reference internal" href="../library/functions.html#format" title="format"><code class="xref py py-func docutils literal notranslate"><span class="pre">format()</span></code></a> but also supports
- mixing %char specifiers with arbitrary text.</p>
- <p>A new <code class="xref py py-func docutils literal notranslate"><span class="pre">currency()</span></code> function was also added that formats a number according
- to the current locale’s settings.</p>
- <p>(Contributed by Georg Brandl.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/mailbox.html#module-mailbox" title="mailbox: Manipulate mailboxes in various formats"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mailbox</span></code></a> module underwent a massive rewrite to add the capability to
- modify mailboxes in addition to reading them. A new set of classes that include
- <code class="xref py py-class docutils literal notranslate"><span class="pre">mbox</span></code>, <code class="xref py py-class docutils literal notranslate"><span class="pre">MH</span></code>, and <code class="xref py py-class docutils literal notranslate"><span class="pre">Maildir</span></code> are used to read mailboxes, and
- have an <code class="docutils literal notranslate"><span class="pre">add(message)</span></code> method to add messages, <code class="docutils literal notranslate"><span class="pre">remove(key)</span></code> to
- remove messages, and <code class="xref py py-meth docutils literal notranslate"><span class="pre">lock()</span></code>/<code class="xref py py-meth docutils literal notranslate"><span class="pre">unlock()</span></code> to lock/unlock the mailbox.
- The following example converts a maildir-format mailbox into an mbox-format
- one:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">mailbox</span>
- <span class="c1"># 'factory=None' uses email.Message.Message as the class representing</span>
- <span class="c1"># individual messages.</span>
- <span class="n">src</span> <span class="o">=</span> <span class="n">mailbox</span><span class="o">.</span><span class="n">Maildir</span><span class="p">(</span><span class="s1">'maildir'</span><span class="p">,</span> <span class="n">factory</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
- <span class="n">dest</span> <span class="o">=</span> <span class="n">mailbox</span><span class="o">.</span><span class="n">mbox</span><span class="p">(</span><span class="s1">'/tmp/mbox'</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">msg</span> <span class="ow">in</span> <span class="n">src</span><span class="p">:</span>
- <span class="n">dest</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>(Contributed by Gregory K. Johnson. Funding was provided by Google’s 2005
- Summer of Code.)</p>
- </li>
- <li><p>New module: the <a class="reference internal" href="../library/msilib.html#module-msilib" title="msilib: Creation of Microsoft Installer files, and CAB files. (deprecated) (Windows)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">msilib</span></code></a> module allows creating Microsoft Installer
- <code class="file docutils literal notranslate"><span class="pre">.msi</span></code> files and CAB files. Some support for reading the <code class="file docutils literal notranslate"><span class="pre">.msi</span></code>
- database is also included. (Contributed by Martin von Löwis.)</p></li>
- <li><p>The <a class="reference internal" href="../library/nis.html#module-nis" title="nis: Interface to Sun's NIS (Yellow Pages) library. (deprecated) (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">nis</span></code></a> module now supports accessing domains other than the system
- default domain by supplying a <em>domain</em> argument to the <a class="reference internal" href="../library/nis.html#nis.match" title="nis.match"><code class="xref py py-func docutils literal notranslate"><span class="pre">nis.match()</span></code></a> and
- <a class="reference internal" href="../library/nis.html#nis.maps" title="nis.maps"><code class="xref py py-func docutils literal notranslate"><span class="pre">nis.maps()</span></code></a> functions. (Contributed by Ben Bell.)</p></li>
- <li><p>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’s <code class="xref py py-func docutils literal notranslate"><span class="pre">itemgetter()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">attrgetter()</span></code>
- functions now support multiple fields. A call such as
- <code class="docutils literal notranslate"><span class="pre">operator.attrgetter('a',</span> <span class="pre">'b')</span></code> will return a function that retrieves the
- <code class="xref py py-attr docutils literal notranslate"><span class="pre">a</span></code> and <code class="xref py py-attr docutils literal notranslate"><span class="pre">b</span></code> attributes. Combining this new feature with the
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">sort()</span></code> method’s <code class="docutils literal notranslate"><span class="pre">key</span></code> parameter lets you easily sort lists using
- multiple fields. (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 to version 1.5.1 of the Optik library.
- The <code class="xref py py-class docutils literal notranslate"><span class="pre">OptionParser</span></code> class gained an <code class="xref py py-attr docutils literal notranslate"><span class="pre">epilog</span></code> attribute, a string
- that will be printed after the help message, and a <code class="xref py py-meth docutils literal notranslate"><span class="pre">destroy()</span></code> method to
- break reference cycles created by the object. (Contributed by Greg Ward.)</p></li>
- <li><p>The <a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a> module underwent several changes. The <code class="xref py py-attr docutils literal notranslate"><span class="pre">stat_float_times</span></code>
- variable now defaults to true, meaning that <a class="reference internal" href="../library/os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.stat()</span></code></a> will now return time
- values as floats. (This doesn’t necessarily mean that <a class="reference internal" href="../library/os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.stat()</span></code></a> will
- return times that are precise to fractions of a second; not all systems support
- such precision.)</p>
- <p>Constants named <a class="reference internal" href="../library/os.html#os.SEEK_SET" title="os.SEEK_SET"><code class="xref py py-const docutils literal notranslate"><span class="pre">os.SEEK_SET</span></code></a>, <a class="reference internal" href="../library/os.html#os.SEEK_CUR" title="os.SEEK_CUR"><code class="xref py py-const docutils literal notranslate"><span class="pre">os.SEEK_CUR</span></code></a>, and
- <a class="reference internal" href="../library/os.html#os.SEEK_END" title="os.SEEK_END"><code class="xref py py-const docutils literal notranslate"><span class="pre">os.SEEK_END</span></code></a> have been added; these are the parameters to the
- <a class="reference internal" href="../library/os.html#os.lseek" title="os.lseek"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.lseek()</span></code></a> function. Two new constants for locking are
- <a class="reference internal" href="../library/os.html#os.O_SHLOCK" title="os.O_SHLOCK"><code class="xref py py-const docutils literal notranslate"><span class="pre">os.O_SHLOCK</span></code></a> and <a class="reference internal" href="../library/os.html#os.O_EXLOCK" title="os.O_EXLOCK"><code class="xref py py-const docutils literal notranslate"><span class="pre">os.O_EXLOCK</span></code></a>.</p>
- <p>Two new functions, <code class="xref py py-func docutils literal notranslate"><span class="pre">wait3()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">wait4()</span></code>, were added. They’re similar
- the <code class="xref py py-func docutils literal notranslate"><span class="pre">waitpid()</span></code> function which waits for a child process to exit and returns
- a tuple of the process ID and its exit status, but <code class="xref py py-func docutils literal notranslate"><span class="pre">wait3()</span></code> and
- <code class="xref py py-func docutils literal notranslate"><span class="pre">wait4()</span></code> return additional information. <code class="xref py py-func docutils literal notranslate"><span class="pre">wait3()</span></code> doesn’t take a
- process ID as input, so it waits for any child process to exit and returns a
- 3-tuple of <em>process-id</em>, <em>exit-status</em>, <em>resource-usage</em> as returned from the
- <a class="reference internal" href="../library/resource.html#resource.getrusage" title="resource.getrusage"><code class="xref py py-func docutils literal notranslate"><span class="pre">resource.getrusage()</span></code></a> function. <code class="docutils literal notranslate"><span class="pre">wait4(pid)</span></code> does take a process ID.
- (Contributed by Chad J. Schroeder.)</p>
- <p>On FreeBSD, the <a class="reference internal" href="../library/os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.stat()</span></code></a> function now returns times with nanosecond
- resolution, and the returned object now has <code class="xref py py-attr docutils literal notranslate"><span class="pre">st_gen</span></code> and
- <code class="xref py py-attr docutils literal notranslate"><span class="pre">st_birthtime</span></code>. The <code class="xref py py-attr docutils literal notranslate"><span class="pre">st_flags</span></code> attribute is also available, if the
- platform supports it. (Contributed by Antti Louko and Diego Pettenò.)</p>
- </li>
- <li><p>The Python debugger provided by the <a class="reference internal" href="../library/pdb.html#module-pdb" title="pdb: The Python debugger for interactive interpreters."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pdb</span></code></a> module can now store lists of
- commands to execute when a breakpoint is reached and execution stops. Once
- breakpoint #1 has been created, enter <code class="docutils literal notranslate"><span class="pre">commands</span> <span class="pre">1</span></code> and enter a series of
- commands to be executed, finishing the list with <code class="docutils literal notranslate"><span class="pre">end</span></code>. The command list can
- include commands that resume execution, such as <code class="docutils literal notranslate"><span class="pre">continue</span></code> or <code class="docutils literal notranslate"><span class="pre">next</span></code>.
- (Contributed by Grégoire Dooms.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/pickle.html#module-pickle" title="pickle: Convert Python objects to streams of bytes and back."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pickle</span></code></a> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">cPickle</span></code> modules no longer accept a return value
- of <code class="docutils literal notranslate"><span class="pre">None</span></code> from the <code class="xref py py-meth docutils literal notranslate"><span class="pre">__reduce__()</span></code> method; the method must return a tuple
- of arguments instead. The ability to return <code class="docutils literal notranslate"><span class="pre">None</span></code> was deprecated in Python
- 2.4, so this completes the removal of the feature.</p></li>
- <li><p>The <a class="reference internal" href="../library/pkgutil.html#module-pkgutil" title="pkgutil: Utilities for the import system."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pkgutil</span></code></a> module, containing various utility functions for finding
- packages, was enhanced to support <span class="target" id="index-21"></span><a class="pep reference external" href="https://peps.python.org/pep-0302/"><strong>PEP 302</strong></a>’s import hooks and now also works for
- packages stored in ZIP-format archives. (Contributed by Phillip J. Eby.)</p></li>
- <li><p>The pybench benchmark suite by Marc-André Lemburg is now included in the
- <code class="file docutils literal notranslate"><span class="pre">Tools/pybench</span></code> directory. The pybench suite is an improvement on the
- commonly used <code class="file docutils literal notranslate"><span class="pre">pystone.py</span></code> program because pybench provides a more
- detailed measurement of the interpreter’s speed. It times particular operations
- such as function calls, tuple slicing, method lookups, and numeric operations,
- instead of performing many different operations and reducing the result to a
- single number as <code class="file docutils literal notranslate"><span class="pre">pystone.py</span></code> does.</p></li>
- <li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">pyexpat</span></code> module now uses version 2.0 of the Expat parser.
- (Contributed by Trent Mick.)</p></li>
- <li><p>The <a class="reference internal" href="../library/queue.html#queue.Queue" title="queue.Queue"><code class="xref py py-class docutils literal notranslate"><span class="pre">Queue</span></code></a> class provided by the <code class="xref py py-mod docutils literal notranslate"><span class="pre">Queue</span></code> module gained two new
- methods. <code class="xref py py-meth docutils literal notranslate"><span class="pre">join()</span></code> blocks until all items in the queue have been retrieved
- and all processing work on the items have been completed. Worker threads call
- the other new method, <code class="xref py py-meth docutils literal notranslate"><span class="pre">task_done()</span></code>, to signal that processing for an item
- has been completed. (Contributed by Raymond Hettinger.)</p></li>
- <li><p>The old <code class="xref py py-mod docutils literal notranslate"><span class="pre">regex</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">regsub</span></code> modules, which have been deprecated
- ever since Python 2.0, have finally been deleted. Other deleted modules:
- <code class="xref py py-mod docutils literal notranslate"><span class="pre">statcache</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">tzparse</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">whrandom</span></code>.</p></li>
- <li><p>Also deleted: the <code class="file docutils literal notranslate"><span class="pre">lib-old</span></code> directory, which includes ancient modules
- such as <code class="xref py py-mod docutils literal notranslate"><span class="pre">dircmp</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">ni</span></code>, was removed. <code class="file docutils literal notranslate"><span class="pre">lib-old</span></code> wasn’t on the
- default <code class="docutils literal notranslate"><span class="pre">sys.path</span></code>, so unless your programs explicitly added the directory to
- <code class="docutils literal notranslate"><span class="pre">sys.path</span></code>, this removal shouldn’t affect your code.</p></li>
- <li><p>The <a class="reference internal" href="../library/rlcompleter.html#module-rlcompleter" title="rlcompleter: Python identifier completion, suitable for the GNU readline library."><code class="xref py py-mod docutils literal notranslate"><span class="pre">rlcompleter</span></code></a> module is no longer dependent on importing the
- <a class="reference internal" href="../library/readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">readline</span></code></a> module and therefore now works on non-Unix platforms. (Patch
- from Robert Kiendl.)</p>
- </li>
- <li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">SimpleXMLRPCServer</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">DocXMLRPCServer</span></code> classes now have a
- <code class="xref py py-attr docutils literal notranslate"><span class="pre">rpc_paths</span></code> attribute that constrains XML-RPC operations to a limited set
- of URL paths; the default is to allow only <code class="docutils literal notranslate"><span class="pre">'/'</span></code> and <code class="docutils literal notranslate"><span class="pre">'/RPC2'</span></code>. Setting
- <code class="xref py py-attr docutils literal notranslate"><span class="pre">rpc_paths</span></code> to <code class="docutils literal notranslate"><span class="pre">None</span></code> or an empty tuple disables this path checking.</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/socket.html#module-socket" title="socket: Low-level networking interface."><code class="xref py py-mod docutils literal notranslate"><span class="pre">socket</span></code></a> module now supports <code class="xref py py-const docutils literal notranslate"><span class="pre">AF_NETLINK</span></code> sockets on Linux,
- thanks to a patch from Philippe Biondi. Netlink sockets are a Linux-specific
- mechanism for communications between a user-space process and kernel code; an
- introductory article about them is at <a class="reference external" href="https://www.linuxjournal.com/article/7356">https://www.linuxjournal.com/article/7356</a>.
- In Python code, netlink addresses are represented as a tuple of 2 integers,
- <code class="docutils literal notranslate"><span class="pre">(pid,</span> <span class="pre">group_mask)</span></code>.</p>
- <p>Two new methods on socket objects, <code class="docutils literal notranslate"><span class="pre">recv_into(buffer)</span></code> and
- <code class="docutils literal notranslate"><span class="pre">recvfrom_into(buffer)</span></code>, store the received data in an object that
- supports the buffer protocol instead of returning the data as a string. This
- means you can put the data directly into an array or a memory-mapped file.</p>
- <p>Socket objects also gained <code class="xref py py-meth docutils literal notranslate"><span class="pre">getfamily()</span></code>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">gettype()</span></code>, and
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">getproto()</span></code> accessor methods to retrieve the family, type, and protocol
- values for the socket.</p>
- </li>
- <li><p>New module: the <a class="reference internal" href="../library/spwd.html#module-spwd" title="spwd: The shadow password database (getspnam() and friends). (deprecated) (Unix)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">spwd</span></code></a> module provides functions for accessing the shadow
- password database on systems that support shadow passwords.</p></li>
- <li><p>The <a class="reference internal" href="../library/struct.html#module-struct" title="struct: Interpret bytes as packed binary data."><code class="xref py py-mod docutils literal notranslate"><span class="pre">struct</span></code></a> is now faster because it compiles format strings into
- <code class="xref py py-class docutils literal notranslate"><span class="pre">Struct</span></code> objects with <code class="xref py py-meth docutils literal notranslate"><span class="pre">pack()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">unpack()</span></code> methods. This is
- similar to how 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 lets you create compiled regular expression
- objects. You can still use the module-level <code class="xref py py-func docutils literal notranslate"><span class="pre">pack()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">unpack()</span></code>
- functions; they’ll create <code class="xref py py-class docutils literal notranslate"><span class="pre">Struct</span></code> objects and cache them. Or you can
- use <code class="xref py py-class docutils literal notranslate"><span class="pre">Struct</span></code> instances directly:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">s</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">Struct</span><span class="p">(</span><span class="s1">'ih3s'</span><span class="p">)</span>
- <span class="n">data</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="mi">1972</span><span class="p">,</span> <span class="mi">187</span><span class="p">,</span> <span class="s1">'abc'</span><span class="p">)</span>
- <span class="n">year</span><span class="p">,</span> <span class="n">number</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>You can also pack and unpack data to and from buffer objects directly using the
- <code class="docutils literal notranslate"><span class="pre">pack_into(buffer,</span> <span class="pre">offset,</span> <span class="pre">v1,</span> <span class="pre">v2,</span> <span class="pre">...)</span></code> and <code class="docutils literal notranslate"><span class="pre">unpack_from(buffer,</span>
- <span class="pre">offset)</span></code> methods. This lets you store data directly into an array or a
- memory-mapped file.</p>
- <p>(<code class="xref py py-class docutils literal notranslate"><span class="pre">Struct</span></code> objects were implemented by Bob Ippolito at the NeedForSpeed
- sprint. Support for buffer objects was added by Martin Blais, also at the
- NeedForSpeed sprint.)</p>
- </li>
- <li><p>The Python developers switched from CVS to Subversion during the 2.5
- development process. Information about the exact build version is available as
- the <code class="docutils literal notranslate"><span class="pre">sys.subversion</span></code> variable, a 3-tuple of <code class="docutils literal notranslate"><span class="pre">(interpreter-name,</span> <span class="pre">branch-name,</span>
- <span class="pre">revision-range)</span></code>. For example, at the time of writing my copy of 2.5 was
- reporting <code class="docutils literal notranslate"><span class="pre">('CPython',</span> <span class="pre">'trunk',</span> <span class="pre">'45313:45315')</span></code>.</p>
- <p>This information is also available to C extensions via the
- <a class="reference internal" href="../c-api/init.html#c.Py_GetBuildInfo" title="Py_GetBuildInfo"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_GetBuildInfo()</span></code></a> function that returns a string of build information
- like this: <code class="docutils literal notranslate"><span class="pre">"trunk:45355:45356M,</span> <span class="pre">Apr</span> <span class="pre">13</span> <span class="pre">2006,</span> <span class="pre">07:42:19"</span></code>. (Contributed by
- Barry Warsaw.)</p>
- </li>
- <li><p>Another new function, <a class="reference internal" href="../library/sys.html#sys._current_frames" title="sys._current_frames"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys._current_frames()</span></code></a>, returns the current stack
- frames for all running threads as a dictionary mapping thread identifiers to the
- topmost stack frame currently active in that thread at the time the function is
- called. (Contributed by Tim Peters.)</p></li>
- <li><p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">TarFile</span></code> class in 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 has an
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">extractall()</span></code> method that extracts all members from the archive into the
- current working directory. It’s also possible to set a different directory as
- the extraction target, and to unpack only a subset of the archive’s members.</p>
- <p>The compression used for a tarfile opened in stream mode can now be autodetected
- using the mode <code class="docutils literal notranslate"><span class="pre">'r|*'</span></code>. (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 lets you set the stack size used when new
- threads are created. The <code class="docutils literal notranslate"><span class="pre">stack_size([*size*])</span></code> function returns the
- currently configured stack size, and supplying the optional <em>size</em> parameter
- sets a new value. Not all platforms support changing the stack size, but
- Windows, POSIX threading, and OS/2 all do. (Contributed by Andrew MacIntyre.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/unicodedata.html#module-unicodedata" title="unicodedata: Access the Unicode Database."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unicodedata</span></code></a> module has been updated to use version 4.1.0 of the
- Unicode character database. Version 3.2.0 is required by some specifications,
- so it’s still available as <a class="reference internal" href="../library/unicodedata.html#unicodedata.ucd_3_2_0" title="unicodedata.ucd_3_2_0"><code class="xref py py-data docutils literal notranslate"><span class="pre">unicodedata.ucd_3_2_0</span></code></a>.</p></li>
- <li><p>New module: the <a class="reference internal" href="../library/uuid.html#module-uuid" title="uuid: UUID objects (universally unique identifiers) according to RFC 4122"><code class="xref py py-mod docutils literal notranslate"><span class="pre">uuid</span></code></a> module generates universally unique identifiers
- (UUIDs) according to <span class="target" id="index-22"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc4122.html"><strong>RFC 4122</strong></a>. The RFC defines several different UUID
- versions that are generated from a starting string, from system properties, or
- purely randomly. This module contains a <code class="xref py py-class docutils literal notranslate"><span class="pre">UUID</span></code> class and functions
- named <code class="xref py py-func docutils literal notranslate"><span class="pre">uuid1()</span></code>, <code class="xref py py-func docutils literal notranslate"><span class="pre">uuid3()</span></code>, <code class="xref py py-func docutils literal notranslate"><span class="pre">uuid4()</span></code>, and <code class="xref py py-func docutils literal notranslate"><span class="pre">uuid5()</span></code> to
- generate different versions of UUID. (Version 2 UUIDs are not specified in
- <span class="target" id="index-23"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc4122.html"><strong>RFC 4122</strong></a> and are not supported by this module.)</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">uuid</span>
- <span class="gp">>>> </span><span class="c1"># make a UUID based on the host ID and current time</span>
- <span class="gp">>>> </span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid1</span><span class="p">()</span>
- <span class="go">UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')</span>
- <span class="gp">>>> </span><span class="c1"># make a UUID using an MD5 hash of a namespace UUID and a name</span>
- <span class="gp">>>> </span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid3</span><span class="p">(</span><span class="n">uuid</span><span class="o">.</span><span class="n">NAMESPACE_DNS</span><span class="p">,</span> <span class="s1">'python.org'</span><span class="p">)</span>
- <span class="go">UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')</span>
- <span class="gp">>>> </span><span class="c1"># make a random UUID</span>
- <span class="gp">>>> </span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()</span>
- <span class="go">UUID('16fd2706-8baf-433b-82eb-8c7fada847da')</span>
- <span class="gp">>>> </span><span class="c1"># make a UUID using a SHA-1 hash of a namespace UUID and a name</span>
- <span class="gp">>>> </span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid5</span><span class="p">(</span><span class="n">uuid</span><span class="o">.</span><span class="n">NAMESPACE_DNS</span><span class="p">,</span> <span class="s1">'python.org'</span><span class="p">)</span>
- <span class="go">UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')</span>
- </pre></div>
- </div>
- <p>(Contributed by Ka-Ping Yee.)</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’s <code class="xref py py-class docutils literal notranslate"><span class="pre">WeakKeyDictionary</span></code> and
- <code class="xref py py-class docutils literal notranslate"><span class="pre">WeakValueDictionary</span></code> types gained new methods for iterating over the
- weak references contained in the dictionary. <code class="xref py py-meth docutils literal notranslate"><span class="pre">iterkeyrefs()</span></code> and
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">keyrefs()</span></code> methods were added to <code class="xref py py-class docutils literal notranslate"><span class="pre">WeakKeyDictionary</span></code>, and
- <code class="xref py py-meth docutils literal notranslate"><span class="pre">itervaluerefs()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">valuerefs()</span></code> were added to
- <code class="xref py py-class docutils literal notranslate"><span class="pre">WeakValueDictionary</span></code>. (Contributed by Fred L. Drake, Jr.)</p></li>
- <li><p>The <a class="reference internal" href="../library/webbrowser.html#module-webbrowser" title="webbrowser: Easy-to-use controller for web browsers."><code class="xref py py-mod docutils literal notranslate"><span class="pre">webbrowser</span></code></a> module received a number of enhancements. It’s now
- usable as a script with <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">webbrowser</span></code>, taking a URL as the argument;
- there are a number of switches to control the behaviour (<code class="xref std std-option docutils literal notranslate"><span class="pre">-n</span></code> for a new
- browser window, <code class="xref std std-option docutils literal notranslate"><span class="pre">-t</span></code> for a new tab). New module-level functions,
- <code class="xref py py-func docutils literal notranslate"><span class="pre">open_new()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">open_new_tab()</span></code>, were added to support this. The
- module’s <a class="reference internal" href="../library/functions.html#open" title="open"><code class="xref py py-func docutils literal notranslate"><span class="pre">open()</span></code></a> function supports an additional feature, an <em>autoraise</em>
- parameter that signals whether to raise the open window when possible. A number
- of additional browsers were added to the supported list such as Firefox, Opera,
- Konqueror, and elinks. (Contributed by Oleg Broytmann and Georg Brandl.)</p>
- </li>
- <li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpclib</span></code> module now supports returning <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> objects
- for the XML-RPC date type. Supply <code class="docutils literal notranslate"><span class="pre">use_datetime=True</span></code> to the <code class="xref py py-func docutils literal notranslate"><span class="pre">loads()</span></code>
- function or the <code class="xref py py-class docutils literal notranslate"><span class="pre">Unmarshaller</span></code> class to enable this feature. (Contributed
- by Skip Montanaro.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/zipfile.html#module-zipfile" title="zipfile: Read and write ZIP-format archive files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">zipfile</span></code></a> module now supports the ZIP64 version of the format,
- meaning that a .zip archive can now be larger than 4 GiB and can contain
- individual files larger than 4 GiB. (Contributed by Ronald Oussoren.)</p>
- </li>
- <li><p>The <a class="reference internal" href="../library/zlib.html#module-zlib" title="zlib: Low-level interface to compression and decompression routines compatible with gzip."><code class="xref py py-mod docutils literal notranslate"><span class="pre">zlib</span></code></a> module’s <code class="xref py py-class docutils literal notranslate"><span class="pre">Compress</span></code> and <code class="xref py py-class docutils literal notranslate"><span class="pre">Decompress</span></code> objects now
- support a <a class="reference internal" href="../library/copy.html#module-copy" title="copy: Shallow and deep copy operations."><code class="xref py py-meth docutils literal notranslate"><span class="pre">copy()</span></code></a> method that makes a copy of the object’s internal state
- and returns a new <code class="xref py py-class docutils literal notranslate"><span class="pre">Compress</span></code> or <code class="xref py py-class docutils literal notranslate"><span class="pre">Decompress</span></code> object.
- (Contributed by Chris AtLee.)</p>
- </li>
- </ul>
- <section id="the-ctypes-package">
- <span id="module-ctypes"></span><h3>The ctypes package<a class="headerlink" href="#the-ctypes-package" title="Permalink to this headline">¶</a></h3>
- <p>The <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> package, written by Thomas Heller, has been added to the
- standard library. <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> lets you call arbitrary functions in shared
- libraries or DLLs. Long-time users may remember the <code class="xref py py-mod docutils literal notranslate"><span class="pre">dl</span></code> module, which
- provides functions for loading shared libraries and calling functions in them.
- The <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> package is much fancier.</p>
- <p>To load a shared library or DLL, you must create an instance of the
- <code class="xref py py-class docutils literal notranslate"><span class="pre">CDLL</span></code> class and provide the name or path of the shared library or DLL.
- Once that’s done, you can call arbitrary functions by accessing them as
- attributes of the <code class="xref py py-class docutils literal notranslate"><span class="pre">CDLL</span></code> object.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">ctypes</span>
- <span class="n">libc</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">CDLL</span><span class="p">(</span><span class="s1">'libc.so.6'</span><span class="p">)</span>
- <span class="n">result</span> <span class="o">=</span> <span class="n">libc</span><span class="o">.</span><span class="n">printf</span><span class="p">(</span><span class="s2">"Line of output</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>Type constructors for the various C types are provided: <code class="xref py py-func docutils literal notranslate"><span class="pre">c_int()</span></code>,
- <code class="xref py py-func docutils literal notranslate"><span class="pre">c_float()</span></code>, <code class="xref py py-func docutils literal notranslate"><span class="pre">c_double()</span></code>, <code class="xref py py-func docutils literal notranslate"><span class="pre">c_char_p()</span></code> (equivalent to <span class="c-expr sig sig-inline c"><span class="kt">char</span><span class="p">*</span></span>), and so forth. Unlike Python’s types, the C versions are all mutable; you
- can assign to their <code class="xref py py-attr docutils literal notranslate"><span class="pre">value</span></code> attribute to change the wrapped value. Python
- integers and strings will be automatically converted to the corresponding C
- types, but for other types you must call the correct type constructor. (And I
- mean <em>must</em>; getting it wrong will often result in the interpreter crashing
- with a segmentation fault.)</p>
- <p>You shouldn’t use <code class="xref py py-func docutils literal notranslate"><span class="pre">c_char_p()</span></code> with a Python string when the C function will
- be modifying the memory area, because Python strings are supposed to be
- immutable; breaking this rule will cause puzzling bugs. When you need a
- modifiable memory area, use <code class="xref py py-func docutils literal notranslate"><span class="pre">create_string_buffer()</span></code>:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">s</span> <span class="o">=</span> <span class="s2">"this is a string"</span>
- <span class="n">buf</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_string_buffer</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
- <span class="n">libc</span><span class="o">.</span><span class="n">strfry</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>C functions are assumed to return integers, but you can set the <code class="xref py py-attr docutils literal notranslate"><span class="pre">restype</span></code>
- attribute of the function object to change this:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">libc</span><span class="o">.</span><span class="n">atof</span><span class="p">(</span><span class="s1">'2.71828'</span><span class="p">)</span>
- <span class="go">-1783957616</span>
- <span class="gp">>>> </span><span class="n">libc</span><span class="o">.</span><span class="n">atof</span><span class="o">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_double</span>
- <span class="gp">>>> </span><span class="n">libc</span><span class="o">.</span><span class="n">atof</span><span class="p">(</span><span class="s1">'2.71828'</span><span class="p">)</span>
- <span class="go">2.71828</span>
- </pre></div>
- </div>
- <p><a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> also provides a wrapper for Python’s C API as the
- <code class="docutils literal notranslate"><span class="pre">ctypes.pythonapi</span></code> object. This object does <em>not</em> release the global
- interpreter lock before calling a function, because the lock must be held when
- calling into the interpreter’s code. There’s a <code class="xref py py-class docutils literal notranslate"><span class="pre">py_object()</span></code> type
- constructor that will create a <span class="c-expr sig sig-inline c"><a class="reference internal" href="../c-api/structures.html#c.PyObject" title="PyObject"><span class="n">PyObject</span></a><span class="p">*</span></span> pointer. A simple usage:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">ctypes</span>
- <span class="n">d</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="n">ctypes</span><span class="o">.</span><span class="n">pythonapi</span><span class="o">.</span><span class="n">PyObject_SetItem</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">py_object</span><span class="p">(</span><span class="n">d</span><span class="p">),</span>
- <span class="n">ctypes</span><span class="o">.</span><span class="n">py_object</span><span class="p">(</span><span class="s2">"abc"</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">py_object</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
- <span class="c1"># d is now {'abc', 1}.</span>
- </pre></div>
- </div>
- <p>Don’t forget to use <code class="xref py py-class docutils literal notranslate"><span class="pre">py_object()</span></code>; if it’s omitted you end up with a
- segmentation fault.</p>
- <p><a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> has been around for a while, but people still write and
- distribution hand-coded extension modules because you can’t rely on
- <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> being present. Perhaps developers will begin to write Python
- wrappers atop a library accessed through <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> instead of extension
- modules, now that <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> is included with core Python.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><a class="reference external" href="https://web.archive.org/web/20180410025338/http://starship.python.net/crew/theller/ctypes/">https://web.archive.org/web/20180410025338/http://starship.python.net/crew/theller/ctypes/</a></dt><dd><p>The pre-stdlib ctypes web page, with a tutorial, reference, and FAQ.</p>
- </dd>
- </dl>
- <p>The documentation for the <a class="reference internal" href="../library/ctypes.html#module-ctypes" title="ctypes: A foreign function library for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ctypes</span></code></a> module.</p>
- </div>
- </section>
- <section id="the-elementtree-package">
- <span id="module-etree"></span><h3>The ElementTree package<a class="headerlink" href="#the-elementtree-package" title="Permalink to this headline">¶</a></h3>
- <p>A subset of Fredrik Lundh’s ElementTree library for processing XML has been
- added to the standard library as <code class="xref py py-mod docutils literal notranslate"><span class="pre">xml.etree</span></code>. The available modules are
- <code class="xref py py-mod docutils literal notranslate"><span class="pre">ElementTree</span></code>, <code class="xref py py-mod docutils literal notranslate"><span class="pre">ElementPath</span></code>, and <code class="xref py py-mod docutils literal notranslate"><span class="pre">ElementInclude</span></code> from
- ElementTree 1.2.6. The <code class="xref py py-mod docutils literal notranslate"><span class="pre">cElementTree</span></code> accelerator module is also
- included.</p>
- <p>The rest of this section will provide a brief overview of using ElementTree.
- Full documentation for ElementTree is available at
- <a class="reference external" href="https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm">https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm</a>.</p>
- <p>ElementTree represents an XML document as a tree of element nodes. The text
- content of the document is stored as the <code class="xref py py-attr docutils literal notranslate"><span class="pre">text</span></code> and <code class="xref py py-attr docutils literal notranslate"><span class="pre">tail</span></code>
- attributes of (This is one of the major differences between ElementTree and
- the Document Object Model; in the DOM there are many different types of node,
- including <code class="xref py py-class docutils literal notranslate"><span class="pre">TextNode</span></code>.)</p>
- <p>The most commonly used parsing function is <code class="xref py py-func docutils literal notranslate"><span class="pre">parse()</span></code>, that takes either a
- string (assumed to contain a filename) or a file-like object and returns an
- <code class="xref py py-class docutils literal notranslate"><span class="pre">ElementTree</span></code> instance:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">xml.etree</span> <span class="kn">import</span> <span class="n">ElementTree</span> <span class="k">as</span> <span class="n">ET</span>
- <span class="n">tree</span> <span class="o">=</span> <span class="n">ET</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="s1">'ex-1.xml'</span><span class="p">)</span>
- <span class="n">feed</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span>
- <span class="s1">'http://planet.python.org/rss10.xml'</span><span class="p">)</span>
- <span class="n">tree</span> <span class="o">=</span> <span class="n">ET</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">feed</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>Once you have an <code class="xref py py-class docutils literal notranslate"><span class="pre">ElementTree</span></code> instance, you can call its <code class="xref py py-meth docutils literal notranslate"><span class="pre">getroot()</span></code>
- method to get the root <code class="xref py py-class docutils literal notranslate"><span class="pre">Element</span></code> node.</p>
- <p>There’s also an <code class="xref py py-func docutils literal notranslate"><span class="pre">XML()</span></code> function that takes a string literal and returns an
- <code class="xref py py-class docutils literal notranslate"><span class="pre">Element</span></code> node (not an <code class="xref py py-class docutils literal notranslate"><span class="pre">ElementTree</span></code>). This function provides a
- tidy way to incorporate XML fragments, approaching the convenience of an XML
- literal:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">svg</span> <span class="o">=</span> <span class="n">ET</span><span class="o">.</span><span class="n">XML</span><span class="p">(</span><span class="s2">"""<svg width="10px" version="1.0"></span>
- <span class="s2"> </svg>"""</span><span class="p">)</span>
- <span class="n">svg</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">'height'</span><span class="p">,</span> <span class="s1">'320px'</span><span class="p">)</span>
- <span class="n">svg</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">elem1</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>Each XML element supports some dictionary-like and some list-like access
- methods. Dictionary-like operations are used to access attribute values, and
- list-like operations are used to access child nodes.</p>
- <table class="docutils align-default">
- <colgroup>
- <col style="width: 41%" />
- <col style="width: 59%" />
- </colgroup>
- <thead>
- <tr class="row-odd"><th class="head"><p>Operation</p></th>
- <th class="head"><p>Result</p></th>
- </tr>
- </thead>
- <tbody>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">elem[n]</span></code></p></td>
- <td><p>Returns n’th child element.</p></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">elem[m:n]</span></code></p></td>
- <td><p>Returns list of m’th through n’th child
- elements.</p></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">len(elem)</span></code></p></td>
- <td><p>Returns number of child elements.</p></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">list(elem)</span></code></p></td>
- <td><p>Returns list of child elements.</p></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">elem.append(elem2)</span></code></p></td>
- <td><p>Adds <em>elem2</em> as a child.</p></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">elem.insert(index,</span> <span class="pre">elem2)</span></code></p></td>
- <td><p>Inserts <em>elem2</em> at the specified location.</p></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">del</span> <span class="pre">elem[n]</span></code></p></td>
- <td><p>Deletes n’th child element.</p></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">elem.keys()</span></code></p></td>
- <td><p>Returns list of attribute names.</p></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">elem.get(name)</span></code></p></td>
- <td><p>Returns value of attribute <em>name</em>.</p></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">elem.set(name,</span> <span class="pre">value)</span></code></p></td>
- <td><p>Sets new value for attribute <em>name</em>.</p></td>
- </tr>
- <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">elem.attrib</span></code></p></td>
- <td><p>Retrieves the dictionary containing
- attributes.</p></td>
- </tr>
- <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">del</span> <span class="pre">elem.attrib[name]</span></code></p></td>
- <td><p>Deletes attribute <em>name</em>.</p></td>
- </tr>
- </tbody>
- </table>
- <p>Comments and processing instructions are also represented as <code class="xref py py-class docutils literal notranslate"><span class="pre">Element</span></code>
- nodes. To check if a node is a comment or processing instructions:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="n">elem</span><span class="o">.</span><span class="n">tag</span> <span class="ow">is</span> <span class="n">ET</span><span class="o">.</span><span class="n">Comment</span><span class="p">:</span>
- <span class="o">...</span>
- <span class="k">elif</span> <span class="n">elem</span><span class="o">.</span><span class="n">tag</span> <span class="ow">is</span> <span class="n">ET</span><span class="o">.</span><span class="n">ProcessingInstruction</span><span class="p">:</span>
- <span class="o">...</span>
- </pre></div>
- </div>
- <p>To generate XML output, you should call the <code class="xref py py-meth docutils literal notranslate"><span class="pre">ElementTree.write()</span></code> method.
- Like <code class="xref py py-func docutils literal notranslate"><span class="pre">parse()</span></code>, it can take either a string or a file-like object:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Encoding is US-ASCII</span>
- <span class="n">tree</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'output.xml'</span><span class="p">)</span>
- <span class="c1"># Encoding is UTF-8</span>
- <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'output.xml'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span>
- <span class="n">tree</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>(Caution: the default encoding used for output is ASCII. For general XML work,
- where an element’s name may contain arbitrary Unicode characters, ASCII isn’t a
- very useful encoding because it will raise an exception if an element’s name
- contains any characters with values greater than 127. Therefore, it’s best to
- specify a different encoding such as UTF-8 that can handle any Unicode
- character.)</p>
- <p>This section is only a partial description of the ElementTree interfaces. Please
- read the package’s official documentation for more details.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><a class="reference external" href="https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm">https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm</a></dt><dd><p>Official documentation for ElementTree.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="the-hashlib-package">
- <span id="module-hashlib"></span><h3>The hashlib package<a class="headerlink" href="#the-hashlib-package" title="Permalink to this headline">¶</a></h3>
- <p>A new <a class="reference internal" href="../library/hashlib.html#module-hashlib" title="hashlib: Secure hash and message digest algorithms."><code class="xref py py-mod docutils literal notranslate"><span class="pre">hashlib</span></code></a> module, written by Gregory P. Smith, has been added to
- replace the <code class="xref py py-mod docutils literal notranslate"><span class="pre">md5</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">sha</span></code> modules. <a class="reference internal" href="../library/hashlib.html#module-hashlib" title="hashlib: Secure hash and message digest algorithms."><code class="xref py py-mod docutils literal notranslate"><span class="pre">hashlib</span></code></a> adds support for
- additional secure hashes (SHA-224, SHA-256, SHA-384, and SHA-512). When
- available, the module uses OpenSSL for fast platform optimized implementations
- of algorithms.</p>
- <p>The old <code class="xref py py-mod docutils literal notranslate"><span class="pre">md5</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">sha</span></code> modules still exist as wrappers around hashlib
- to preserve backwards compatibility. The new module’s interface is very close
- to that of the old modules, but not identical. The most significant difference
- is that the constructor functions for creating new hashing objects are named
- differently.</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Old versions</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">md5</span><span class="o">.</span><span class="n">md5</span><span class="p">()</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">md5</span><span class="o">.</span><span class="n">new</span><span class="p">()</span>
- <span class="c1"># New version</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">()</span>
- <span class="c1"># Old versions</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">sha</span><span class="o">.</span><span class="n">sha</span><span class="p">()</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">sha</span><span class="o">.</span><span class="n">new</span><span class="p">()</span>
- <span class="c1"># New version</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha1</span><span class="p">()</span>
- <span class="c1"># Hash that weren't previously available</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha224</span><span class="p">()</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">()</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha384</span><span class="p">()</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha512</span><span class="p">()</span>
- <span class="c1"># Alternative form</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">'md5'</span><span class="p">)</span> <span class="c1"># Provide algorithm as a string</span>
- </pre></div>
- </div>
- <p>Once a hash object has been created, its methods are the same as before:
- <code class="docutils literal notranslate"><span class="pre">update(string)</span></code> hashes the specified string into the current digest
- state, <code class="xref py py-meth docutils literal notranslate"><span class="pre">digest()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">hexdigest()</span></code> return the digest value as a binary
- string or a string of hex digits, and <a class="reference internal" href="../library/copy.html#module-copy" title="copy: Shallow and deep copy operations."><code class="xref py py-meth docutils literal notranslate"><span class="pre">copy()</span></code></a> returns a new hashing object
- with the same digest state.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <p>The documentation for the <a class="reference internal" href="../library/hashlib.html#module-hashlib" title="hashlib: Secure hash and message digest algorithms."><code class="xref py py-mod docutils literal notranslate"><span class="pre">hashlib</span></code></a> module.</p>
- </div>
- </section>
- <section id="the-sqlite3-package">
- <span id="module-sqlite"></span><h3>The sqlite3 package<a class="headerlink" href="#the-sqlite3-package" title="Permalink to this headline">¶</a></h3>
- <p>The pysqlite module (<a class="reference external" href="https://www.pysqlite.org">https://www.pysqlite.org</a>), a wrapper for the SQLite embedded
- database, has been added to the standard library under the package name
- <a class="reference internal" href="../library/sqlite3.html#module-sqlite3" title="sqlite3: A DB-API 2.0 implementation using SQLite 3.x."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sqlite3</span></code></a>.</p>
- <p>SQLite is a C library that provides a lightweight disk-based database that
- doesn’t require a separate server process and allows accessing the database
- using a nonstandard variant of the SQL query language. Some applications can use
- SQLite for internal data storage. It’s also possible to prototype an
- application using SQLite and then port the code to a larger database such as
- PostgreSQL or Oracle.</p>
- <p>pysqlite was written by Gerhard Häring and provides a SQL interface compliant
- with the DB-API 2.0 specification described by <span class="target" id="index-24"></span><a class="pep reference external" href="https://peps.python.org/pep-0249/"><strong>PEP 249</strong></a>.</p>
- <p>If you’re compiling the Python source yourself, note that the source tree
- doesn’t include the SQLite code, only the wrapper module. You’ll need to have
- the SQLite libraries and headers installed before compiling Python, and the
- build process will compile the module when the necessary headers are available.</p>
- <p>To use the module, you must first create a <code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code> object that
- represents the database. Here the data will be stored in the
- <code class="file docutils literal notranslate"><span class="pre">/tmp/example</span></code> file:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">conn</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s1">'/tmp/example'</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>You can also supply the special name <code class="docutils literal notranslate"><span class="pre">:memory:</span></code> to create a database in RAM.</p>
- <p>Once you have a <code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code>, you can create a <code class="xref py py-class docutils literal notranslate"><span class="pre">Cursor</span></code> object
- and call its <code class="xref py py-meth docutils literal notranslate"><span class="pre">execute()</span></code> method to perform SQL commands:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">c</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
- <span class="c1"># Create table</span>
- <span class="n">c</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'''create table stocks</span>
- <span class="s1">(date text, trans text, symbol text,</span>
- <span class="s1"> qty real, price real)'''</span><span class="p">)</span>
- <span class="c1"># Insert a row of data</span>
- <span class="n">c</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""insert into stocks</span>
- <span class="s2"> values ('2006-01-05','BUY','RHAT',100,35.14)"""</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>Usually your SQL operations will need to use values from Python variables. You
- shouldn’t assemble your query using Python’s string operations because doing so
- is insecure; it makes your program vulnerable to an SQL injection attack.</p>
- <p>Instead, use the DB-API’s parameter substitution. Put <code class="docutils literal notranslate"><span class="pre">?</span></code> as a placeholder
- wherever you want to use a value, and then provide a tuple of values as the
- second argument to the cursor’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">execute()</span></code> method. (Other database modules
- may use a different placeholder, such as <code class="docutils literal notranslate"><span class="pre">%s</span></code> or <code class="docutils literal notranslate"><span class="pre">:1</span></code>.) For example:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Never do this -- insecure!</span>
- <span class="n">symbol</span> <span class="o">=</span> <span class="s1">'IBM'</span>
- <span class="n">c</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"... where symbol = '</span><span class="si">%s</span><span class="s2">'"</span> <span class="o">%</span> <span class="n">symbol</span><span class="p">)</span>
- <span class="c1"># Do this instead</span>
- <span class="n">t</span> <span class="o">=</span> <span class="p">(</span><span class="n">symbol</span><span class="p">,)</span>
- <span class="n">c</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'select * from stocks where symbol=?'</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
- <span class="c1"># Larger example</span>
- <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="p">((</span><span class="s1">'2006-03-28'</span><span class="p">,</span> <span class="s1">'BUY'</span><span class="p">,</span> <span class="s1">'IBM'</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mf">45.00</span><span class="p">),</span>
- <span class="p">(</span><span class="s1">'2006-04-05'</span><span class="p">,</span> <span class="s1">'BUY'</span><span class="p">,</span> <span class="s1">'MSOFT'</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mf">72.00</span><span class="p">),</span>
- <span class="p">(</span><span class="s1">'2006-04-06'</span><span class="p">,</span> <span class="s1">'SELL'</span><span class="p">,</span> <span class="s1">'IBM'</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="mf">53.00</span><span class="p">),</span>
- <span class="p">):</span>
- <span class="n">c</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'insert into stocks values (?,?,?,?,?)'</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
- </pre></div>
- </div>
- <p>To retrieve data after executing a SELECT statement, you can either treat the
- cursor as an iterator, call the cursor’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">fetchone()</span></code> method to retrieve a
- single matching row, or call <code class="xref py py-meth docutils literal notranslate"><span class="pre">fetchall()</span></code> to get a list of the matching
- rows.</p>
- <p>This example uses the iterator form:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
- <span class="gp">>>> </span><span class="n">c</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'select * from stocks order by price'</span><span class="p">)</span>
- <span class="gp">>>> </span><span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">c</span><span class="p">:</span>
- <span class="gp">... </span> <span class="nb">print</span> <span class="n">row</span>
- <span class="gp">...</span>
- <span class="go">(u'2006-01-05', u'BUY', u'RHAT', 100, 35.140000000000001)</span>
- <span class="go">(u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)</span>
- <span class="go">(u'2006-04-06', u'SELL', u'IBM', 500, 53.0)</span>
- <span class="go">(u'2006-04-05', u'BUY', u'MSOFT', 1000, 72.0)</span>
- <span class="gp">>>></span>
- </pre></div>
- </div>
- <p>For more information about the SQL dialect supported by SQLite, see
- <a class="reference external" href="https://www.sqlite.org">https://www.sqlite.org</a>.</p>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><a class="reference external" href="https://www.pysqlite.org">https://www.pysqlite.org</a></dt><dd><p>The pysqlite web page.</p>
- </dd>
- <dt><a class="reference external" href="https://www.sqlite.org">https://www.sqlite.org</a></dt><dd><p>The SQLite web page; the documentation describes the syntax and the available
- data types for the supported SQL dialect.</p>
- </dd>
- </dl>
- <p>The documentation for the <a class="reference internal" href="../library/sqlite3.html#module-sqlite3" title="sqlite3: A DB-API 2.0 implementation using SQLite 3.x."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sqlite3</span></code></a> module.</p>
- <dl class="simple">
- <dt><span class="target" id="index-25"></span><a class="pep reference external" href="https://peps.python.org/pep-0249/"><strong>PEP 249</strong></a> - Database API Specification 2.0</dt><dd><p>PEP written by Marc-André Lemburg.</p>
- </dd>
- </dl>
- </div>
- </section>
- <section id="the-wsgiref-package">
- <span id="module-wsgiref"></span><h3>The wsgiref package<a class="headerlink" href="#the-wsgiref-package" title="Permalink to this headline">¶</a></h3>
- <p>The Web Server Gateway Interface (WSGI) v1.0 defines a standard interface
- between web servers and Python web applications and is described in <span class="target" id="index-26"></span><a class="pep reference external" href="https://peps.python.org/pep-0333/"><strong>PEP 333</strong></a>.
- The <a class="reference internal" href="../library/wsgiref.html#module-wsgiref" title="wsgiref: WSGI Utilities and Reference Implementation."><code class="xref py py-mod docutils literal notranslate"><span class="pre">wsgiref</span></code></a> package is a reference implementation of the WSGI
- specification.</p>
- <p>The package includes a basic HTTP server that will run a WSGI application; this
- server is useful for debugging but isn’t intended for production use. Setting
- up a server takes only a few lines of code:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">wsgiref</span> <span class="kn">import</span> <span class="n">simple_server</span>
- <span class="n">wsgi_app</span> <span class="o">=</span> <span class="o">...</span>
- <span class="n">host</span> <span class="o">=</span> <span class="s1">''</span>
- <span class="n">port</span> <span class="o">=</span> <span class="mi">8000</span>
- <span class="n">httpd</span> <span class="o">=</span> <span class="n">simple_server</span><span class="o">.</span><span class="n">make_server</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">wsgi_app</span><span class="p">)</span>
- <span class="n">httpd</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
- </pre></div>
- </div>
- <div class="admonition seealso">
- <p class="admonition-title">See also</p>
- <dl class="simple">
- <dt><a class="reference external" href="https://web.archive.org/web/20160331090247/http://wsgi.readthedocs.org/en/latest/">https://web.archive.org/web/20160331090247/http://wsgi.readthedocs.org/en/latest/</a></dt><dd><p>A central web site for WSGI-related resources.</p>
- </dd>
- <dt><span class="target" id="index-27"></span><a class="pep reference external" href="https://peps.python.org/pep-0333/"><strong>PEP 333</strong></a> - Python Web Server Gateway Interface v1.0</dt><dd><p>PEP written by Phillip J. Eby.</p>
- </dd>
- </dl>
- </div>
- </section>
- </section>
- <section id="build-and-c-api-changes">
- <span id="build-api"></span><h2>Build and C API Changes<a class="headerlink" href="#build-and-c-api-changes" title="Permalink to this headline">¶</a></h2>
- <p>Changes to Python’s build process and to the C API include:</p>
- <ul>
- <li><p>The Python source tree was converted from CVS to Subversion, in a complex
- migration procedure that was supervised and flawlessly carried out by Martin von
- Löwis. The procedure was developed as <span class="target" id="index-28"></span><a class="pep reference external" href="https://peps.python.org/pep-0347/"><strong>PEP 347</strong></a>.</p></li>
- <li><p>Coverity, a company that markets a source code analysis tool called Prevent,
- provided the results of their examination of the Python source code. The
- analysis found about 60 bugs that were quickly fixed. Many of the bugs were
- refcounting problems, often occurring in error-handling code. See
- <a class="reference external" href="https://scan.coverity.com">https://scan.coverity.com</a> for the statistics.</p></li>
- <li><p>The largest change to the C API came from <span class="target" id="index-29"></span><a class="pep reference external" href="https://peps.python.org/pep-0353/"><strong>PEP 353</strong></a>, which modifies the
- interpreter to use a <a class="reference internal" href="../c-api/intro.html#c.Py_ssize_t" title="Py_ssize_t"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a> type definition instead of
- <span class="c-expr sig sig-inline c"><span class="kt">int</span></span>. See the earlier section <a class="reference internal" href="#pep-353"><span class="std std-ref">PEP 353: Using ssize_t as the index type</span></a> for a discussion of this
- change.</p></li>
- <li><p>The design of the bytecode compiler has changed a great deal, no longer
- generating bytecode by traversing the parse tree. Instead the parse tree is
- converted to an abstract syntax tree (or AST), and it is the abstract syntax
- tree that’s traversed to produce the bytecode.</p>
- <p>It’s possible for Python code to obtain AST objects by using the
- <a class="reference internal" href="../library/functions.html#compile" title="compile"><code class="xref py py-func docutils literal notranslate"><span class="pre">compile()</span></code></a> built-in and specifying <code class="docutils literal notranslate"><span class="pre">_ast.PyCF_ONLY_AST</span></code> as the value of
- the <em>flags</em> parameter:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">_ast</span> <span class="kn">import</span> <span class="n">PyCF_ONLY_AST</span>
- <span class="n">ast</span> <span class="o">=</span> <span class="nb">compile</span><span class="p">(</span><span class="s2">"""a=0</span>
- <span class="s2">for i in range(10):</span>
- <span class="s2"> a += i</span>
- <span class="s2">"""</span><span class="p">,</span> <span class="s2">"<string>"</span><span class="p">,</span> <span class="s1">'exec'</span><span class="p">,</span> <span class="n">PyCF_ONLY_AST</span><span class="p">)</span>
- <span class="n">assignment</span> <span class="o">=</span> <span class="n">ast</span><span class="o">.</span><span class="n">body</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
- <span class="n">for_loop</span> <span class="o">=</span> <span class="n">ast</span><span class="o">.</span><span class="n">body</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
- </pre></div>
- </div>
- <p>No official documentation has been written for the AST code yet, but <span class="target" id="index-30"></span><a class="pep reference external" href="https://peps.python.org/pep-0339/"><strong>PEP 339</strong></a>
- discusses the design. To start learning about the code, read the definition of
- the various AST nodes in <code class="file docutils literal notranslate"><span class="pre">Parser/Python.asdl</span></code>. A Python script reads this
- file and generates a set of C structure definitions in
- <code class="file docutils literal notranslate"><span class="pre">Include/Python-ast.h</span></code>. The <code class="xref c c-func docutils literal notranslate"><span class="pre">PyParser_ASTFromString()</span></code> and
- <code class="xref c c-func docutils literal notranslate"><span class="pre">PyParser_ASTFromFile()</span></code>, defined in <code class="file docutils literal notranslate"><span class="pre">Include/pythonrun.h</span></code>, take
- Python source as input and return the root of an AST representing the contents.
- This AST can then be turned into a code object by <code class="xref c c-func docutils literal notranslate"><span class="pre">PyAST_Compile()</span></code>. For
- more information, read the source code, and then ask questions on python-dev.</p>
- <p>The AST code was developed under Jeremy Hylton’s management, and implemented by
- (in alphabetical order) Brett Cannon, Nick Coghlan, Grant Edwards, John
- Ehresman, Kurt Kaiser, Neal Norwitz, Tim Peters, Armin Rigo, and Neil
- Schemenauer, plus the participants in a number of AST sprints at conferences
- such as PyCon.</p>
- </li>
- <li><p>Evan Jones’s patch to obmalloc, first described in a talk at PyCon DC 2005,
- was applied. Python 2.4 allocated small objects in 256K-sized arenas, but never
- freed arenas. With this patch, Python will free arenas when they’re empty. The
- net effect is that on some platforms, when you allocate many objects, Python’s
- memory usage may actually drop when you delete them and the memory may be
- returned to the operating system. (Implemented by Evan Jones, and reworked by
- Tim Peters.)</p>
- <p>Note that this change means extension modules must be more careful when
- allocating memory. Python’s API has many different functions for allocating
- memory that are grouped into families. For example, <a class="reference internal" href="../c-api/memory.html#c.PyMem_Malloc" title="PyMem_Malloc"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyMem_Malloc()</span></code></a>,
- <a class="reference internal" href="../c-api/memory.html#c.PyMem_Realloc" title="PyMem_Realloc"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyMem_Realloc()</span></code></a>, and <a class="reference internal" href="../c-api/memory.html#c.PyMem_Free" title="PyMem_Free"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyMem_Free()</span></code></a> are one family that allocates
- raw memory, while <a class="reference internal" href="../c-api/memory.html#c.PyObject_Malloc" title="PyObject_Malloc"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_Malloc()</span></code></a>, <a class="reference internal" href="../c-api/memory.html#c.PyObject_Realloc" title="PyObject_Realloc"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_Realloc()</span></code></a>, and
- <a class="reference internal" href="../c-api/memory.html#c.PyObject_Free" title="PyObject_Free"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_Free()</span></code></a> are another family that’s supposed to be used for
- creating Python objects.</p>
- <p>Previously these different families all reduced to the platform’s
- <code class="xref c c-func docutils literal notranslate"><span class="pre">malloc()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">free()</span></code> functions. This meant it didn’t matter if
- you got things wrong and allocated memory with the <code class="docutils literal notranslate"><span class="pre">PyMem</span></code> function but
- freed it with the <code class="docutils literal notranslate"><span class="pre">PyObject</span></code> function. With 2.5’s changes to obmalloc,
- these families now do different things and mismatches will probably result in a
- segfault. You should carefully test your C extension modules with Python 2.5.</p>
- </li>
- <li><p>The built-in set types now have an official C API. Call <a class="reference internal" href="../c-api/set.html#c.PySet_New" title="PySet_New"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySet_New()</span></code></a>
- and <a class="reference internal" href="../c-api/set.html#c.PyFrozenSet_New" title="PyFrozenSet_New"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyFrozenSet_New()</span></code></a> to create a new set, <a class="reference internal" href="../c-api/set.html#c.PySet_Add" title="PySet_Add"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySet_Add()</span></code></a> and
- <a class="reference internal" href="../c-api/set.html#c.PySet_Discard" title="PySet_Discard"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySet_Discard()</span></code></a> to add and remove elements, and <a class="reference internal" href="../c-api/set.html#c.PySet_Contains" title="PySet_Contains"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySet_Contains()</span></code></a>
- and <a class="reference internal" href="../c-api/set.html#c.PySet_Size" title="PySet_Size"><code class="xref c c-func docutils literal notranslate"><span class="pre">PySet_Size()</span></code></a> to examine the set’s state. (Contributed by Raymond
- Hettinger.)</p></li>
- <li><p>C code can now obtain information about the exact revision of the Python
- interpreter by calling the <a class="reference internal" href="../c-api/init.html#c.Py_GetBuildInfo" title="Py_GetBuildInfo"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_GetBuildInfo()</span></code></a> function that returns a
- string of build information like this: <code class="docutils literal notranslate"><span class="pre">"trunk:45355:45356M,</span> <span class="pre">Apr</span> <span class="pre">13</span> <span class="pre">2006,</span>
- <span class="pre">07:42:19"</span></code>. (Contributed by Barry Warsaw.)</p></li>
- <li><p>Two new macros can be used to indicate C functions that are local to the
- current file so that a faster calling convention can be used.
- <code class="docutils literal notranslate"><span class="pre">Py_LOCAL(type)</span></code> declares the function as returning a value of the
- specified <em>type</em> and uses a fast-calling qualifier.
- <code class="docutils literal notranslate"><span class="pre">Py_LOCAL_INLINE(type)</span></code> does the same thing and also requests the
- function be inlined. If macro <code class="xref c c-macro docutils literal notranslate"><span class="pre">PY_LOCAL_AGGRESSIVE</span></code> is defined before
- <code class="file docutils literal notranslate"><span class="pre">python.h</span></code> is included, a set of more aggressive optimizations are enabled
- for the module; you should benchmark the results to find out if these
- optimizations actually make the code faster. (Contributed by Fredrik Lundh at
- the NeedForSpeed sprint.)</p></li>
- <li><p><code class="docutils literal notranslate"><span class="pre">PyErr_NewException(name,</span> <span class="pre">base,</span> <span class="pre">dict)</span></code> can now accept a tuple of base
- classes as its <em>base</em> argument. (Contributed by Georg Brandl.)</p></li>
- <li><p>The <code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_Warn()</span></code> function for issuing warnings is now deprecated in
- favour of <code class="docutils literal notranslate"><span class="pre">PyErr_WarnEx(category,</span> <span class="pre">message,</span> <span class="pre">stacklevel)</span></code> which lets you
- specify the number of stack frames separating this function and the caller. A
- <em>stacklevel</em> of 1 is the function calling <a class="reference internal" href="../c-api/exceptions.html#c.PyErr_WarnEx" title="PyErr_WarnEx"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyErr_WarnEx()</span></code></a>, 2 is the
- function above that, and so forth. (Added by Neal Norwitz.)</p></li>
- <li><p>The CPython interpreter is still written in C, but the code can now be
- compiled with a C++ compiler without errors. (Implemented by Anthony Baxter,
- Martin von Löwis, Skip Montanaro.)</p></li>
- <li><p>The <code class="xref c c-func docutils literal notranslate"><span class="pre">PyRange_New()</span></code> function was removed. It was never documented, never
- used in the core code, and had dangerously lax error checking. In the unlikely
- case that your extensions were using it, you can replace it by something like
- the following:</p>
- <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="nb">range</span> <span class="o">=</span> <span class="n">PyObject_CallFunction</span><span class="p">((</span><span class="n">PyObject</span><span class="o">*</span><span class="p">)</span> <span class="o">&</span><span class="n">PyRange_Type</span><span class="p">,</span> <span class="s2">"lll"</span><span class="p">,</span>
- <span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">,</span> <span class="n">step</span><span class="p">);</span>
- </pre></div>
- </div>
- </li>
- </ul>
- <section id="port-specific-changes">
- <span id="ports"></span><h3>Port-Specific Changes<a class="headerlink" href="#port-specific-changes" title="Permalink to this headline">¶</a></h3>
- <ul class="simple">
- <li><p>MacOS X (10.3 and higher): dynamic loading of modules now uses the
- <code class="xref c c-func docutils literal notranslate"><span class="pre">dlopen()</span></code> function instead of MacOS-specific functions.</p></li>
- <li><p>MacOS X: an <code class="xref std std-option docutils literal notranslate"><span class="pre">--enable-universalsdk</span></code> switch was added to the
- <strong class="program">configure</strong> script that compiles the interpreter as a universal binary
- able to run on both PowerPC and Intel processors. (Contributed by Ronald
- Oussoren; <a class="reference external" href="https://bugs.python.org/issue?@action=redirect&bpo=2573">bpo-2573</a>.)</p></li>
- <li><p>Windows: <code class="file docutils literal notranslate"><span class="pre">.dll</span></code> is no longer supported as a filename extension for
- extension modules. <code class="file docutils literal notranslate"><span class="pre">.pyd</span></code> is now the only filename extension that will be
- searched for.</p></li>
- </ul>
- </section>
- </section>
- <section id="porting-to-python-2-5">
- <span id="porting"></span><h2>Porting to Python 2.5<a class="headerlink" href="#porting-to-python-2-5" 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>ASCII is now the default encoding for modules. It’s now a syntax error if a
- module contains string literals with 8-bit characters but doesn’t have an
- encoding declaration. In Python 2.4 this triggered a warning, not a syntax
- error.</p></li>
- <li><p>Previously, the <code class="xref py py-attr docutils literal notranslate"><span class="pre">gi_frame</span></code> attribute of a generator was always a frame
- object. Because of the <span class="target" id="index-31"></span><a class="pep reference external" href="https://peps.python.org/pep-0342/"><strong>PEP 342</strong></a> changes described in section <a class="reference internal" href="#pep-342"><span class="std std-ref">PEP 342: New Generator Features</span></a>,
- it’s now possible for <code class="xref py py-attr docutils literal notranslate"><span class="pre">gi_frame</span></code> to be <code class="docutils literal notranslate"><span class="pre">None</span></code>.</p></li>
- <li><p>A new warning, <a class="reference internal" href="../library/exceptions.html#UnicodeWarning" title="UnicodeWarning"><code class="xref py py-class docutils literal notranslate"><span class="pre">UnicodeWarning</span></code></a>, is triggered when you attempt to
- compare a Unicode string and an 8-bit string that can’t be converted to Unicode
- using the default ASCII encoding. Previously such comparisons would raise a
- <a class="reference internal" href="../library/exceptions.html#UnicodeDecodeError" title="UnicodeDecodeError"><code class="xref py py-class docutils literal notranslate"><span class="pre">UnicodeDecodeError</span></code></a> exception.</p></li>
- <li><p>Library: the <a class="reference internal" href="../library/csv.html#module-csv" title="csv: Write and read tabular data to and from delimited files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">csv</span></code></a> module is now stricter about multi-line quoted fields.
- If your files contain newlines embedded within fields, the input should be split
- into lines in a manner which preserves the newline characters.</p></li>
- <li><p>Library: 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’s <a class="reference internal" href="../library/functions.html#format" title="format"><code class="xref py py-func docutils literal notranslate"><span class="pre">format()</span></code></a> function’s would
- previously accept any string as long as no more than one %char specifier
- appeared. In Python 2.5, the argument must be exactly one %char specifier with
- no surrounding text.</p></li>
- <li><p>Library: The <a class="reference internal" href="../library/pickle.html#module-pickle" title="pickle: Convert Python objects to streams of bytes and back."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pickle</span></code></a> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">cPickle</span></code> modules no longer accept a
- return value of <code class="docutils literal notranslate"><span class="pre">None</span></code> from the <code class="xref py py-meth docutils literal notranslate"><span class="pre">__reduce__()</span></code> method; the method must
- return a tuple of arguments instead. The modules also no longer accept the
- deprecated <em>bin</em> keyword parameter.</p></li>
- <li><p>Library: The <code class="xref py py-mod docutils literal notranslate"><span class="pre">SimpleXMLRPCServer</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">DocXMLRPCServer</span></code> classes now
- have a <code class="xref py py-attr docutils literal notranslate"><span class="pre">rpc_paths</span></code> attribute that constrains XML-RPC operations to a
- limited set of URL paths; the default is to allow only <code class="docutils literal notranslate"><span class="pre">'/'</span></code> and <code class="docutils literal notranslate"><span class="pre">'/RPC2'</span></code>.
- Setting <code class="xref py py-attr docutils literal notranslate"><span class="pre">rpc_paths</span></code> to <code class="docutils literal notranslate"><span class="pre">None</span></code> or an empty tuple disables this path
- checking.</p></li>
- <li><p>C API: Many functions now use <a class="reference internal" href="../c-api/intro.html#c.Py_ssize_t" title="Py_ssize_t"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a> instead of <span class="c-expr sig sig-inline c"><span class="kt">int</span></span> to
- allow processing more data on 64-bit machines. Extension code may need to make
- the same change to avoid warnings and to support 64-bit machines. See the
- earlier section <a class="reference internal" href="#pep-353"><span class="std std-ref">PEP 353: Using ssize_t as the index type</span></a> for a discussion of this change.</p></li>
- <li><p>C API: The obmalloc changes mean that you must be careful to not mix usage
- of the <code class="docutils literal notranslate"><span class="pre">PyMem_*</span></code> and <code class="docutils literal notranslate"><span class="pre">PyObject_*</span></code> families of functions. Memory
- allocated with one family’s <code class="docutils literal notranslate"><span class="pre">*_Malloc</span></code> must be freed with the
- corresponding family’s <code class="docutils literal notranslate"><span class="pre">*_Free</span></code> function.</p></li>
- </ul>
- </section>
- <section id="acknowledgements">
- <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: Georg Brandl,
- Nick Coghlan, Phillip J. Eby, Lars Gustäbel, Raymond Hettinger, Ralf W.
- Grosse-Kunstleve, Kent Johnson, Iain Lowe, Martin von Löwis, Fredrik Lundh, Andrew
- McNamara, Skip Montanaro, Gustavo Niemeyer, Paul Prescod, James Pryor, Mike
- Rovner, Scott Weikart, Barry Warsaw, Thomas Wouters.</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.5</a><ul>
- <li><a class="reference internal" href="#pep-308-conditional-expressions">PEP 308: Conditional Expressions</a></li>
- <li><a class="reference internal" href="#pep-309-partial-function-application">PEP 309: Partial Function Application</a></li>
- <li><a class="reference internal" href="#pep-314-metadata-for-python-software-packages-v1-1">PEP 314: Metadata for Python Software Packages v1.1</a></li>
- <li><a class="reference internal" href="#pep-328-absolute-and-relative-imports">PEP 328: Absolute and Relative Imports</a></li>
- <li><a class="reference internal" href="#pep-338-executing-modules-as-scripts">PEP 338: Executing Modules as Scripts</a></li>
- <li><a class="reference internal" href="#pep-341-unified-try-except-finally">PEP 341: Unified try/except/finally</a></li>
- <li><a class="reference internal" href="#pep-342-new-generator-features">PEP 342: New Generator Features</a></li>
- <li><a class="reference internal" href="#pep-343-the-with-statement">PEP 343: The ‘with’ statement</a><ul>
- <li><a class="reference internal" href="#writing-context-managers">Writing Context Managers</a></li>
- <li><a class="reference internal" href="#the-contextlib-module">The contextlib module</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#pep-352-exceptions-as-new-style-classes">PEP 352: Exceptions as New-Style Classes</a></li>
- <li><a class="reference internal" href="#pep-353-using-ssize-t-as-the-index-type">PEP 353: Using ssize_t as the index type</a></li>
- <li><a class="reference internal" href="#pep-357-the-index-method">PEP 357: The ‘__index__’ method</a></li>
- <li><a class="reference internal" href="#other-language-changes">Other Language Changes</a><ul>
- <li><a class="reference internal" href="#interactive-interpreter-changes">Interactive Interpreter Changes</a></li>
- <li><a class="reference internal" href="#optimizations">Optimizations</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#new-improved-and-removed-modules">New, Improved, and Removed Modules</a><ul>
- <li><a class="reference internal" href="#the-ctypes-package">The ctypes package</a></li>
- <li><a class="reference internal" href="#the-elementtree-package">The ElementTree package</a></li>
- <li><a class="reference internal" href="#the-hashlib-package">The hashlib package</a></li>
- <li><a class="reference internal" href="#the-sqlite3-package">The sqlite3 package</a></li>
- <li><a class="reference internal" href="#the-wsgiref-package">The wsgiref package</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-5">Porting to Python 2.5</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.6.html"
- title="previous chapter">What’s New in Python 2.6</a></p>
- </div>
- <div>
- <h4>Next topic</h4>
- <p class="topless"><a href="2.4.html"
- title="next chapter">What’s New in Python 2.4</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.5.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.4.html" title="What’s New in Python 2.4"
- >next</a> |</li>
- <li class="right" >
- <a href="2.6.html" title="What’s New in Python 2.6"
- >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.5</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>
|