Bisher gab es viele Antworten, die sagten: "In Python gibt es keine Switch-Anweisung, machen Sie es auf diese Weise". Ich möchte jedoch darauf hinweisen, dass die switch-Anweisung selbst ein leicht zu missbrauchendes Konstrukt ist, das in den meisten Fällen vermieden werden kann und sollte, weil es träges Programmieren fördert. Ein typisches Beispiel:
def ToUpper(lcChar):
if (lcChar == 'a' or lcChar == 'A'):
return 'A'
elif (lcChar == 'b' or lcChar == 'B'):
return 'B'
...
elif (lcChar == 'z' or lcChar == 'Z'):
return 'Z'
else:
return None # or something
Nun, Sie könnte dies mit einer switch-Anweisung tun (wenn Python eine anbietet), aber Sie würden Ihre Zeit verschwenden, weil es Methoden gibt, die dies einfach tun. Oder vielleicht haben Sie etwas weniger Offensichtliches:
def ConvertToReason(code):
if (code == 200):
return 'Okay'
elif (code == 400):
return 'Bad Request'
elif (code == 404):
return 'Not Found'
else:
return None
Diese Art von Operation kann und sollte jedoch mit einem Wörterbuch durchgeführt werden, da dies schneller, weniger komplex, weniger fehleranfällig und kompakter ist.
Und die überwiegende Mehrheit der "Anwendungsfälle" für switch-Anweisungen fällt in einen dieser beiden Fälle; es gibt nur sehr wenig Grund, eine davon zu verwenden, wenn Sie Ihr Problem gründlich durchdacht haben.
Anstatt also zu fragen, "wie schalte ich in Python um?", sollten wir vielleicht fragen, "warum will ich in Python umschalten?", denn das ist oft die interessantere Frage und wird oft Schwächen im Design von allem, was Sie bauen, aufdecken.
Das heißt aber nicht, dass Schalter nicht auch verwendet werden sollten. Zustandsautomaten, Lexer, Parser und Automaten verwenden sie alle bis zu einem gewissen Grad, und im Allgemeinen können sie nützlich sein, wenn man von einer symmetrischen Eingabe ausgeht und zu einer asymmetrischen Ausgabe gelangt; man muss nur darauf achten, dass man den Schalter nicht als Hammer benutzt, weil man einen Haufen Nägel in seinem Code sieht.
77 Stimmen
PEP zum Thema, verfasst von Guido selbst: PEP 3103
28 Stimmen
@chb In diesem PEP erwähnt Guido nicht, dass if/elif-Ketten auch eine klassische Fehlerquelle sind. Es ist ein sehr anfälliges Konstrukt.
15 Stimmen
Was bei allen Lösungen fehlt, ist die Erkennung von doppelte Fallwerte . Als Fail-Fast-Prinzip kann dies ein größerer Verlust sein als die Leistung oder die Fallthrough-Funktion.
6 Stimmen
switch
ist tatsächlich "vielseitiger" als etwas, das verschiedene feste Werte auf der Grundlage des Wertes eines Eingabeindexes zurückgibt. Sie ermöglicht die Ausführung verschiedener Codestücke. Sie muss nicht einmal einen Wert zurückgeben. Ich frage mich, ob einige der Antworten hier ein guter Ersatz für eine allgemeineswitch
Anweisung oder nur für den Fall, dass Werte zurückgegeben werden, ohne dass die Möglichkeit besteht, allgemeinen Code auszuführen.1 Stimmen
@sancho.s - vereinbart. Wenn Sie nicht zurückkehren oder sich von Ihrem
switch
case
Anweisung dann todo In den übrigen Fällen wird der Code ausgeführt. Das ist eindeutig nicht dasselbe wie eine Sammlung von if/elseifs3 Stimmen
Auf die gleiche Weise erfüllen Syntaxen wie Rubys case...when... (oder Scalas match, Haskells case, Perls given/when) einen allgemeinen Anwendungsfall und bieten eine mächtige Abstraktion. if...elif... ist ein schlechter Ersatz.
1 Stimmen
Pythons Aphorismus, dass "explizit besser ist als implizit" ist das, was Fall-Through in Python nicht zum Standard macht. Ich weiß nicht, ob ich traurig oder glücklich sein soll :|