Python >= 3.10
Wow, Python 3.10+ hat jetzt eine match
/ case
Syntax, die wie folgt lautet switch/case
und mehr!
PEP 634 -- Struktureller Musterabgleich
Ausgewählte Merkmale von match/case
1 - Werte abgleichen:
Der Abgleich von Werten ist ähnlich wie eine einfache switch/case
in einer anderen Sprache:
match something:
case 1 | 2 | 3:
# Match 1-3.
case _:
# Anything else.
#
# Match will throw an error if this is omitted
# and it doesn't match any of the other patterns.
2 - Strukturelle Muster anpassen:
match something:
case str() | bytes():
# Match a string like object.
case [str(), int()]:
# Match a `str` and an `int` sequence
# (`list` or a `tuple` but not a `set` or an iterator).
case [_, _]:
# Match a sequence of 2 variables.
# To prevent a common mistake, sequence patterns don’t match strings.
case {"bandwidth": 100, "latency": 300}:
# Match this dict. Extra keys are ignored.
3 - Erfassen von Variablen
Parsen eines Objekts; Speichern als Variablen:
match something:
case [name, count]
# Match a sequence of any two objects and parse them into the two variables.
case [x, y, *rest]:
# Match a sequence of two or more objects,
# binding object #3 and on into the rest variable.
case bytes() | str() as text:
# Match any string like object and save it to the text variable.
Capture-Variablen können beim Parsen von Daten (z. B. JSON oder HTML) nützlich sein, die in einem von vielen verschiedenen Mustern vorliegen können.
Das Erfassen von Variablen ist eine Funktion. Aber es bedeutet auch, dass Sie gepunktete Konstanten verwenden müssen (Bsp: COLOR.RED
) nur. Andernfalls wird die Konstante wie eine Capture-Variable behandelt und überschrieben.
Weitere Verwendungsbeispiele :
match something:
case 0 | 1 | 2:
# Matches 0, 1 or 2 (value).
print("Small number")
case [] | [_]:
# Matches an empty or single value sequence (structure).
# Matches lists and tuples but not sets.
print("A short sequence")
case str() | bytes():
# Something of `str` or `bytes` type (data type).
print("Something string-like")
case _:
# Anything not matched by the above.
print("Something else")
Python <= 3.9
Mein bevorzugtes Python-Rezept für Switch/Case war:
choices = {'a': 1, 'b': 2}
result = choices.get(key, 'default')
Kurz und einfach für einfache Szenarien.
Im Vergleich zu 11+ Zeilen C-Code:
// C Language version of a simple 'switch/case'.
switch( key )
{
case 'a' :
result = 1;
break;
case 'b' :
result = 2;
break;
default :
result = -1;
}
Sie können sogar mehrere Variablen zuweisen, indem Sie Tupel verwenden:
choices = {'a': (1, 2, 3), 'b': (4, 5, 6)}
(result1, result2, result3) = choices.get(key, ('default1', 'default2', 'default3'))
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 :|