PEP 315 – Verbesserte While-Schleife
- Autor:
- Raymond Hettinger <python at rcn.com>, W Isaac Carroll <icarroll at pobox.com>
- Status:
- Abgelehnt
- Typ:
- Standards Track
- Erstellt:
- 25-Apr-2003
- Python-Version:
- 2.5
- Post-History:
Zusammenfassung
Dieser PEP schlägt vor, eine optionale "do"-Klausel am Anfang der while-Schleife hinzuzufügen, um Schleifencode klarer zu gestalten und Fehler aufgrund von Code-Duplizierung zu reduzieren.
Ankündigung
Abgelehnt; siehe [1].
Dieser PEP wurde seit 2006 zurückgestellt; siehe [2].
Nachfolgende Bemühungen, den PEP im April 2009 wiederzubeleben, waren nicht erfolgreich, da sich keine Syntax herausbildete, die mit der folgenden Form konkurrieren konnte
while True:
<setup code>
if not <condition>:
break
<loop body>
Eine Syntaxalternative zu der im PEP vorgeschlagenen wurde für eine grundlegende do-while-Schleife gefunden, aber sie erhielt wenig Unterstützung, da die Bedingung am Anfang stand
do ... while <cond>:
<loop body>
Benutzern der Sprache wird empfohlen, die while-True-Form mit einem inneren if-break zu verwenden, wenn eine do-while-Schleife angemessen gewesen wäre.
Motivation
Es ist oft notwendig, dass ein bestimmter Code vor jeder Auswertung der while-Schleifenbedingung ausgeführt wird. Dieser Code wird oft außerhalb der Schleife dupliziert, als Setup-Code, der einmal vor dem Eintritt in die Schleife ausgeführt wird
<setup code>
while <condition>:
<loop body>
<setup code>
Das Problem ist, dass duplizierter Code eine Fehlerquelle sein kann, wenn eine Instanz geändert wird, die andere aber nicht. Außerdem ist der Zweck der zweiten Instanz des Setup-Codes unklar, da er am Ende der Schleife steht.
Es ist möglich, Code-Duplizierung zu vermeiden, indem die Schleifenbedingung in eine Hilfsfunktion oder eine if-Anweisung im Schleifenkörper verschoben wird. Die Trennung der Schleifenbedingung vom while-Schlüsselwort macht jedoch das Verhalten der Schleife weniger klar
def helper(args):
<setup code>
return <condition>
while helper(args):
<loop body>
Diese letzte Form hat den zusätzlichen Nachteil, dass die else-Klausel der Schleife zum Körper der if-Anweisung hinzugefügt werden muss, was das Verhalten der Schleife weiter verschleiert
while True:
<setup code>
if not <condition>: break
<loop body>
Dieser PEP schlägt vor, diese Probleme zu lösen, indem eine optionale Klausel zur while-Schleife hinzugefügt wird, die es ermöglicht, den Setup-Code auf natürliche Weise auszudrücken
do:
<setup code>
while <condition>:
<loop body>
Dies behält die Schleifenbedingung mit dem while-Schlüsselwort, wo sie hingehört, und erfordert keine Duplizierung von Code.
Syntax
Die Syntax der while-Anweisung
while_stmt : "while" expression ":" suite
["else" ":" suite]
wird wie folgt erweitert
while_stmt : ["do" ":" suite]
"while" expression ":" suite
["else" ":" suite]
Semantik von break und continue
In der do-while-Schleife verhält sich die break-Anweisung genauso wie in der Standard-while-Schleife: Sie beendet die Schleife sofort, ohne die Schleifenbedingung auszuwerten oder die else-Klausel auszuführen.
Eine continue-Anweisung in der do-while-Schleife springt zur Überprüfung der while-Bedingung.
Im Allgemeinen, wenn die while-Suite leer ist (eine pass-Anweisung), sollten die do-while-Schleife und die break- und continue-Anweisungen die Semantik von do-while in anderen Sprachen widerspiegeln.
Ebenso, wenn die do-suite leer ist, sollten die do-while-Schleife und die break- und continue-Anweisungen das Verhalten widerspiegeln, das in regulären while-Schleifen gefunden wird.
Zukünftige Anweisung
Aufgrund des neuen Schlüsselworts "do" muss die Anweisung
from __future__ import do_while
zunächst die do-while-Form verwenden.
Implementierung
Die erste Implementierung dieses PEP kann die do-while-Schleife als Endlosschleife mit einem Test kompilieren, der die Schleife beendet.
Referenzen
Urheberrecht
Dieses Dokument ist gemeinfrei.
Source: https://github.com/python/peps/blob/main/peps/pep-0315.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT