127 lines
3.4 KiB
Plaintext
127 lines
3.4 KiB
Plaintext
|
PEP: 315
|
|||
|
Title: Enhanced While Loop
|
|||
|
Version: $Revision$
|
|||
|
Last-Modified: $Date$
|
|||
|
Author: W Isaac Carroll <icarroll@pobox.com>
|
|||
|
Status: Draft
|
|||
|
Type: Standards Track
|
|||
|
Content-Type: text/plain
|
|||
|
Created: 25-Apr-2003
|
|||
|
Python-Version: 2.4
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
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 will behave somewhat
|
|||
|
differently than in the standard while loop. Instead of jumping
|
|||
|
back to the loop condition, it will jump to the beginning of the
|
|||
|
first suite of the loop. This is to ensure that the setup code
|
|||
|
has a chance to do its job before the condition is evaluated.
|
|||
|
|
|||
|
|
|||
|
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:
|