Die meisten Antworten hier sind ziemlich alt und besonders die akzeptierten, daher scheint es eine Aktualisierung wert zu sein.
Zunächst wird dies in den offiziellen Python-FAQ behandelt und die elif
Kette für einfache Fälle und die dict
für größere oder komplexere Fälle empfohlen . In visit_
einigen Fällen wird auch eine Reihe von Methoden vorgeschlagen (ein Stil, der von vielen Server-Frameworks verwendet wird):
def dispatch(self, value):
method_name = 'visit_' + str(value)
method = getattr(self, method_name)
method()
In den häufig gestellten Fragen wird auch PEP 275 erwähnt , das geschrieben wurde, um eine endgültige endgültige Entscheidung über das Hinzufügen von Switch-Anweisungen im C-Stil zu erhalten. Dieses PEP wurde jedoch tatsächlich auf Python 3 verschoben und nur als separater Vorschlag, PEP 3103, offiziell abgelehnt . Die Antwort war natürlich nein - aber die beiden PEPs haben Links zu zusätzlichen Informationen, wenn Sie an den Gründen oder der Geschichte interessiert sind.
Eine Sache, die mehrmals auftauchte (und in PEP 275 zu sehen ist, obwohl sie als tatsächliche Empfehlung herausgeschnitten wurde), ist, dass Sie wirklich die Mühe haben, 8 Codezeilen für 4 Fälle zu haben, im Vergleich zu den 6 Zeilen, die Sie in C oder Bash haben würden, können Sie immer schreiben:
if x == 1: print('first')
elif x == 2: print('second')
elif x == 3: print('third')
else: print('did not place')
Dies wird von PEP 8 nicht gerade unterstützt, ist aber lesbar und nicht zu unidiomatisch.
In den mehr als einem Jahrzehnt seit der Ablehnung von PEP 3103 wurde das Problem der C-artigen Fallaussagen oder sogar der etwas leistungsfähigeren Version in Go als tot angesehen. Immer wenn jemand Python-Ideen oder -dev anspricht, wird er auf die alte Entscheidung verwiesen.
Die Idee eines vollständigen Mustervergleichs im ML-Stil entsteht jedoch alle paar Jahre, zumal Sprachen wie Swift und Rust ihn übernommen haben. Das Problem ist, dass es ohne algebraische Datentypen schwierig ist, den Mustervergleich optimal zu nutzen. Während Guido mit der Idee einverstanden war, hat niemand einen Vorschlag gemacht, der sehr gut in Python passt. (Sie können meinen Strohmann von 2014 als Beispiel lesen .) Dies könnte sich mit dataclass
in 3.7 und einigen sporadischen Vorschlägen für eine leistungsfähigere enum
Handhabung von Summentypen oder mit verschiedenen Vorschlägen für verschiedene Arten von aussagelokalen Bindungen (wie PEP 3150 oder die Reihe von Vorschlägen, die derzeit auf -ideas diskutiert werden). Aber bisher hat es nicht.
Gelegentlich gibt es auch Vorschläge für ein Perl 6-Matching, das im Grunde genommen eine Mischung aus allem ist, von elif
Regex bis hin zu Single-Dispatch-Typ-Switching.