139 lines
3.6 KiB
Plaintext
139 lines
3.6 KiB
Plaintext
PEP: 315
|
||
Title: Enhanced While Loop
|
||
Version: $Revision$
|
||
Last-Modified: $Date$
|
||
Author: W Isaac Carroll <icarroll@pobox.com>
|
||
Raymond Hettinger <python@rcn.com>
|
||
Status: Deferred
|
||
Type: Standards Track
|
||
Content-Type: text/plain
|
||
Created: 25-Apr-2003
|
||
Python-Version: 2.5
|
||
Post-History:
|
||
|
||
|
||
Abstract
|
||
|
||
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.
|
||
|
||
|
||
Notice
|
||
|
||
Deferred; see
|
||
http://mail.python.org/pipermail/python-dev/2006-February/060718.html
|
||
|
||
|
||
Motivation
|
||
|
||
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:
|
||
|
||
<setup code>
|
||
while <condition>:
|
||
<loop body>
|
||
<setup code>
|
||
|
||
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.
|
||
|
||
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:
|
||
|
||
def helper(args):
|
||
<setup code>
|
||
return <condition>
|
||
|
||
while helper(args):
|
||
<loop body>
|
||
|
||
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:
|
||
|
||
while True:
|
||
<setup code>
|
||
if not <condition>: break
|
||
<loop body>
|
||
|
||
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:
|
||
|
||
do:
|
||
<setup code>
|
||
while <condition>:
|
||
<loop body>
|
||
|
||
This keeps the loop condition with the while keyword where it
|
||
belongs, and does not require code to be duplicated.
|
||
|
||
|
||
Syntax
|
||
|
||
The syntax of the while statement
|
||
|
||
while_stmt : "while" expression ":" suite
|
||
["else" ":" suite]
|
||
|
||
is extended as follows:
|
||
|
||
while_stmt : ["do" ":" suite]
|
||
"while" expression ":" suite
|
||
["else" ":" suite]
|
||
|
||
|
||
Semantics of break and continue
|
||
|
||
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.
|
||
|
||
A continue statement in the do-while loop jumps to the while
|
||
condition check.
|
||
|
||
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.
|
||
|
||
Likewise, when the do suite is empty, the do-while loop and
|
||
break and continue statements should match behavior found
|
||
in regular while loops.
|
||
|
||
|
||
Future Statement
|
||
|
||
Because of the new keyword "do", the statement
|
||
|
||
from __future__ import do_while
|
||
|
||
will initially be required to use the do-while form.
|
||
|
||
|
||
Implementation
|
||
|
||
The first implementation of this PEP can compile the do-while loop
|
||
as an infinite loop with a test that exits the loop.
|
||
|
||
|
||
Copyright
|
||
|
||
This document is placed in the public domain.
|
||
|
||
|
||
|
||
Local Variables:
|
||
mode: indented-text
|
||
indent-tabs-mode: nil
|
||
sentence-end-double-space: t
|
||
fill-column: 75
|
||
End:
|