CINXE.COM

PEP 315 – Enhanced While Loop | peps.python.org

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="color-scheme" content="light dark"> <title>PEP 315 – Enhanced While Loop | peps.python.org</title> <link rel="shortcut icon" href="../_static/py.png"> <link rel="canonical" href="https://peps.python.org/pep-0315/"> <link rel="stylesheet" href="../_static/style.css" type="text/css"> <link rel="stylesheet" href="../_static/mq.css" type="text/css"> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" media="(prefers-color-scheme: light)" id="pyg-light"> <link rel="stylesheet" href="../_static/pygments_dark.css" type="text/css" media="(prefers-color-scheme: dark)" id="pyg-dark"> <link rel="alternate" type="application/rss+xml" title="Latest PEPs" href="https://peps.python.org/peps.rss"> <meta property="og:title" content='PEP 315 – Enhanced While Loop | peps.python.org'> <meta property="og:description" content="This PEP proposes adding an optional “do” clause to the beginning of the while loop to make loop code clearer and reduce errors caused by code duplication."> <meta property="og:type" content="website"> <meta property="og:url" content="https://peps.python.org/pep-0315/"> <meta property="og:site_name" content="Python Enhancement Proposals (PEPs)"> <meta property="og:image" content="https://peps.python.org/_static/og-image.png"> <meta property="og:image:alt" content="Python PEPs"> <meta property="og:image:width" content="200"> <meta property="og:image:height" content="200"> <meta name="description" content="This PEP proposes adding an optional “do” clause to the beginning of the while loop to make loop code clearer and reduce errors caused by code duplication."> <meta name="theme-color" content="#3776ab"> </head> <body> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="svg-sun-half" viewBox="0 0 24 24" pointer-events="all"> <title>Following system colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="9"></circle> <path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85"></path> </svg> </symbol> <symbol id="svg-moon" viewBox="0 0 24 24" pointer-events="all"> <title>Selected dark colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z"></path> </svg> </symbol> <symbol id="svg-sun" viewBox="0 0 24 24" pointer-events="all"> <title>Selected light colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="5"></circle> <line x1="12" y1="1" x2="12" y2="3"></line> <line x1="12" y1="21" x2="12" y2="23"></line> <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line> <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line> <line x1="1" y1="12" x2="3" y2="12"></line> <line x1="21" y1="12" x2="23" y2="12"></line> <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line> <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line> </svg> </symbol> </svg> <script> document.documentElement.dataset.colour_scheme = localStorage.getItem("colour_scheme") || "auto" </script> <section id="pep-page-section"> <header> <h1>Python Enhancement Proposals</h1> <ul class="breadcrumbs"> <li><a href="https://www.python.org/" title="The Python Programming Language">Python</a> &raquo; </li> <li><a href="../pep-0000/">PEP Index</a> &raquo; </li> <li>PEP 315</li> </ul> <button id="colour-scheme-cycler" onClick="setColourScheme(nextColourScheme())"> <svg aria-hidden="true" class="colour-scheme-icon-when-auto"><use href="#svg-sun-half"></use></svg> <svg aria-hidden="true" class="colour-scheme-icon-when-dark"><use href="#svg-moon"></use></svg> <svg aria-hidden="true" class="colour-scheme-icon-when-light"><use href="#svg-sun"></use></svg> <span class="visually-hidden">Toggle light / dark / auto colour theme</span> </button> </header> <article> <section id="pep-content"> <h1 class="page-title">PEP 315 – Enhanced While Loop</h1> <dl class="rfc2822 field-list simple"> <dt class="field-odd">Author<span class="colon">:</span></dt> <dd class="field-odd">Raymond Hettinger &lt;python&#32;&#97;t&#32;rcn.com&gt;, W Isaac Carroll &lt;icarroll&#32;&#97;t&#32;pobox.com&gt;</dd> <dt class="field-even">Status<span class="colon">:</span></dt> <dd class="field-even"><abbr title="Formally declined and will not be accepted">Rejected</abbr></dd> <dt class="field-odd">Type<span class="colon">:</span></dt> <dd class="field-odd"><abbr title="Normative PEP with a new feature for Python, implementation change for CPython or interoperability standard for the ecosystem">Standards Track</abbr></dd> <dt class="field-even">Created<span class="colon">:</span></dt> <dd class="field-even">25-Apr-2003</dd> <dt class="field-odd">Python-Version<span class="colon">:</span></dt> <dd class="field-odd">2.5</dd> <dt class="field-even">Post-History<span class="colon">:</span></dt> <dd class="field-even"><p></p></dd> </dl> <hr class="docutils" /> <section id="contents"> <details><summary>Table of Contents</summary><ul class="simple"> <li><a class="reference internal" href="#abstract">Abstract</a></li> <li><a class="reference internal" href="#notice">Notice</a></li> <li><a class="reference internal" href="#motivation">Motivation</a></li> <li><a class="reference internal" href="#syntax">Syntax</a></li> <li><a class="reference internal" href="#semantics-of-break-and-continue">Semantics of break and continue</a></li> <li><a class="reference internal" href="#future-statement">Future Statement</a></li> <li><a class="reference internal" href="#implementation">Implementation</a></li> <li><a class="reference internal" href="#references">References</a></li> <li><a class="reference internal" href="#copyright">Copyright</a></li> </ul> </details></section> <section id="abstract"> <h2><a class="toc-backref" href="#abstract" role="doc-backlink">Abstract</a></h2> <p>This PEP proposes adding an optional “do” clause to the beginning of the while loop to make loop code clearer and reduce errors caused by code duplication.</p> </section> <section id="notice"> <h2><a class="toc-backref" href="#notice" role="doc-backlink">Notice</a></h2> <p>Rejected; see <a class="footnote-reference brackets" href="#id3" id="id1">[1]</a>.</p> <p>This PEP has been deferred since 2006; see <a class="footnote-reference brackets" href="#id4" id="id2">[2]</a>.</p> <p>Subsequent efforts to revive the PEP in April 2009 did not meet with success because no syntax emerged that could compete with the following form:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">setup</span> <span class="n">code</span><span class="o">&gt;</span> <span class="k">if</span> <span class="ow">not</span> <span class="o">&lt;</span><span class="n">condition</span><span class="o">&gt;</span><span class="p">:</span> <span class="k">break</span> <span class="o">&lt;</span><span class="n">loop</span> <span class="n">body</span><span class="o">&gt;</span> </pre></div> </div> <p>A syntax alternative to the one proposed in the PEP was found for a basic do-while loop but it gained little support because the condition was at the top:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">do</span> <span class="o">...</span> <span class="k">while</span> <span class="o">&lt;</span><span class="n">cond</span><span class="o">&gt;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">loop</span> <span class="n">body</span><span class="o">&gt;</span> </pre></div> </div> <p>Users of the language are advised to use the while-True form with an inner if-break when a do-while loop would have been appropriate.</p> </section> <section id="motivation"> <h2><a class="toc-backref" href="#motivation" role="doc-backlink">Motivation</a></h2> <p>It is often necessary for some code to be executed before each evaluation of the while loop condition. This code is often duplicated outside the loop, as setup code that executes once before entering the loop:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="n">setup</span> <span class="n">code</span><span class="o">&gt;</span> <span class="k">while</span> <span class="o">&lt;</span><span class="n">condition</span><span class="o">&gt;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">loop</span> <span class="n">body</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="n">setup</span> <span class="n">code</span><span class="o">&gt;</span> </pre></div> </div> <p>The problem is that duplicated code can be a source of errors if one instance is changed but the other is not. Also, the purpose of the second instance of the setup code is not clear because it comes at the end of the loop.</p> <p>It is possible to prevent code duplication by moving the loop condition into a helper function, or an if statement in the loop body. However, separating the loop condition from the while keyword makes the behavior of the loop less clear:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">helper</span><span class="p">(</span><span class="n">args</span><span class="p">):</span> <span class="o">&lt;</span><span class="n">setup</span> <span class="n">code</span><span class="o">&gt;</span> <span class="k">return</span> <span class="o">&lt;</span><span class="n">condition</span><span class="o">&gt;</span> <span class="k">while</span> <span class="n">helper</span><span class="p">(</span><span class="n">args</span><span class="p">):</span> <span class="o">&lt;</span><span class="n">loop</span> <span class="n">body</span><span class="o">&gt;</span> </pre></div> </div> <p>This last form has the additional drawback of requiring the loop’s else clause to be added to the body of the if statement, further obscuring the loop’s behavior:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">setup</span> <span class="n">code</span><span class="o">&gt;</span> <span class="k">if</span> <span class="ow">not</span> <span class="o">&lt;</span><span class="n">condition</span><span class="o">&gt;</span><span class="p">:</span> <span class="k">break</span> <span class="o">&lt;</span><span class="n">loop</span> <span class="n">body</span><span class="o">&gt;</span> </pre></div> </div> <p>This PEP proposes to solve these problems by adding an optional clause to the while loop, which allows the setup code to be expressed in a natural way:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">do</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">setup</span> <span class="n">code</span><span class="o">&gt;</span> <span class="k">while</span> <span class="o">&lt;</span><span class="n">condition</span><span class="o">&gt;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">loop</span> <span class="n">body</span><span class="o">&gt;</span> </pre></div> </div> <p>This keeps the loop condition with the while keyword where it belongs, and does not require code to be duplicated.</p> </section> <section id="syntax"> <h2><a class="toc-backref" href="#syntax" role="doc-backlink">Syntax</a></h2> <p>The syntax of the while statement</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">while_stmt</span> <span class="p">:</span> <span class="s2">&quot;while&quot;</span> <span class="n">expression</span> <span class="s2">&quot;:&quot;</span> <span class="n">suite</span> <span class="p">[</span><span class="s2">&quot;else&quot;</span> <span class="s2">&quot;:&quot;</span> <span class="n">suite</span><span class="p">]</span> </pre></div> </div> <p>is extended as follows:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">while_stmt</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&quot;do&quot;</span> <span class="s2">&quot;:&quot;</span> <span class="n">suite</span><span class="p">]</span> <span class="s2">&quot;while&quot;</span> <span class="n">expression</span> <span class="s2">&quot;:&quot;</span> <span class="n">suite</span> <span class="p">[</span><span class="s2">&quot;else&quot;</span> <span class="s2">&quot;:&quot;</span> <span class="n">suite</span><span class="p">]</span> </pre></div> </div> </section> <section id="semantics-of-break-and-continue"> <h2><a class="toc-backref" href="#semantics-of-break-and-continue" role="doc-backlink">Semantics of break and continue</a></h2> <p>In the do-while loop the break statement will behave the same as in the standard while loop: It will immediately terminate the loop without evaluating the loop condition or executing the else clause.</p> <p>A continue statement in the do-while loop jumps to the while condition check.</p> <p>In general, when the while suite is empty (a pass statement), the do-while loop and break and continue statements should match the semantics of do-while in other languages.</p> <p>Likewise, when the do suite is empty, the do-while loop and break and continue statements should match behavior found in regular while loops.</p> </section> <section id="future-statement"> <h2><a class="toc-backref" href="#future-statement" role="doc-backlink">Future Statement</a></h2> <p>Because of the new keyword “do”, the statement</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">__future__</span><span class="w"> </span><span class="kn">import</span> <span class="n">do_while</span> </pre></div> </div> <p>will initially be required to use the do-while form.</p> </section> <section id="implementation"> <h2><a class="toc-backref" href="#implementation" role="doc-backlink">Implementation</a></h2> <p>The first implementation of this PEP can compile the do-while loop as an infinite loop with a test that exits the loop.</p> </section> <section id="references"> <h2><a class="toc-backref" href="#references" role="doc-backlink">References</a></h2> <aside class="footnote-list brackets"> <aside class="footnote brackets" id="id3" role="doc-footnote"> <dt class="label" id="id3">[<a href="#id1">1</a>]</dt> <dd>Guido van Rossum, PEP 315: do-while <a class="reference external" href="https://mail.python.org/pipermail/python-ideas/2013-June/021610.html">https://mail.python.org/pipermail/python-ideas/2013-June/021610.html</a></aside> <aside class="footnote brackets" id="id4" role="doc-footnote"> <dt class="label" id="id4">[<a href="#id2">2</a>]</dt> <dd>Raymond Hettinger, release plan for 2.5 ? <a class="reference external" href="https://mail.python.org/pipermail/python-dev/2006-February/060718.html">https://mail.python.org/pipermail/python-dev/2006-February/060718.html</a></aside> </aside> </section> <section id="copyright"> <h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2> <p>This document is placed in the public domain.</p> </section> </section> <hr class="docutils" /> <p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0315.rst">https://github.com/python/peps/blob/main/peps/pep-0315.rst</a></p> <p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0315.rst">2025-02-01 08:59:27 GMT</a></p> </article> <nav id="pep-sidebar"> <h2>Contents</h2> <ul> <li><a class="reference internal" href="#abstract">Abstract</a></li> <li><a class="reference internal" href="#notice">Notice</a></li> <li><a class="reference internal" href="#motivation">Motivation</a></li> <li><a class="reference internal" href="#syntax">Syntax</a></li> <li><a class="reference internal" href="#semantics-of-break-and-continue">Semantics of break and continue</a></li> <li><a class="reference internal" href="#future-statement">Future Statement</a></li> <li><a class="reference internal" href="#implementation">Implementation</a></li> <li><a class="reference internal" href="#references">References</a></li> <li><a class="reference internal" href="#copyright">Copyright</a></li> </ul> <br> <a id="source" href="https://github.com/python/peps/blob/main/peps/pep-0315.rst">Page Source (GitHub)</a> </nav> </section> <script src="../_static/colour_scheme.js"></script> <script src="../_static/wrap_tables.js"></script> <script src="../_static/sticky_banner.js"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10