python-peps/pep-0315/index.html

279 lines
18 KiB
HTML
Raw Permalink Normal View History

<!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="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 loops
else clause to be added to the body of the if statement, further
obscuring the loops 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="nn">__future__</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">2023-09-09 17:39:29 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>