Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

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:


Inhaltsverzeichnis

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


Source: https://github.com/python/peps/blob/main/peps/pep-0315.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT