Suche…


Bemerkungen

Es gibt KEINE switch - Anweisung in Python als Sprache Design - Wahl. Es wurde ein PEP ( PEP-3103 ) für das abgelehnte Thema erstellt.

In Python finden Sie eine Vielzahl von Rezepten, wie Sie Ihre eigenen Anweisungen zum Wechseln ausführen können, und hier versuche ich, die sinnvollsten Optionen vorzuschlagen. Hier sind ein paar Orte zu überprüfen:

Verwenden Sie das, was die Sprache bietet: das if / else-Konstrukt.

Wenn Sie ein switch / case Konstrukt verwenden möchten, ist es am einfachsten, das gute alte if / else Konstrukt zu verwenden:

def switch(value):
    if value == 1:
        return "one"
    if value == 2:
        return "two"
    if value == 42:
        return "the answer to the question about life, the universe and everything"
    raise Exception("No case found!")

Es mag überflüssig und nicht immer hübsch aussehen, aber das ist bei weitem der effizienteste Weg, und es erledigt die Aufgabe:

>>> switch(1)
one
>>> switch(2)
two
>>> switch(3)
…
Exception: No case found!
>>> switch(42)
the answer to the question about life the universe and everything

Benutze ein Diktat von Funktionen

Ein weiterer unkomplizierter Weg ist das Erstellen eines Funktionswörterbuchs:

switch = {
    1: lambda: 'one',
    2: lambda: 'two',
    42: lambda: 'the answer of life the universe and everything',
}

dann fügen Sie eine Standardfunktion hinzu:

def default_case():
    raise Exception('No case found!')

und Sie verwenden die Get-Methode des Wörterbuchs, um die Funktion mit dem Wert zu überprüfen und auszuführen. Wenn im Wörterbuch kein Wert vorhanden ist, wird default_case ausgeführt.

>>> switch.get(1, default_case)()
one
>>> switch.get(2, default_case)()
two
>>> switch.get(3, default_case)()
…
Exception: No case found!
>>> switch.get(42, default_case)()
the answer of life the universe and everything

Sie können auch etwas syntaktischen Zucker herstellen, damit der Schalter schöner aussieht:

def run_switch(value):
    return switch.get(value, default_case)()

>>> run_switch(1)
one

Verwenden Sie die Klassenprüfung

Sie können eine Klasse verwenden, um die Switch- / Case-Struktur nachzuahmen. Im Folgenden wird die Introspektion einer Klasse verwendet (mit der Funktion getattr() , die eine Zeichenfolge in eine gebundene Methode einer Instanz auflöst), um den "case" getattr() aufzulösen.

Dann wird diese Introspecting-Methode auf die __call__ Methode gesetzt, um den Operator () zu überladen.

class SwitchBase:
    def switch(self, case):
        m = getattr(self, 'case_{}'.format(case), None)
        if not m:
            return self.default
        return m

    __call__ = switch

Damit es noch schöner aussieht, subclassieren wir die SwitchBase Klasse (dies könnte jedoch in einer Klasse geschehen), und definieren den gesamten case als Methoden:

class CustomSwitcher:
    def case_1(self):
        return 'one'

    def case_2(self):
        return 'two'

    def case_42(self):
        return 'the answer of life, the universe and everything!'

    def default(self):
        raise Exception('Not a case!')

so können wir es endlich benutzen:

>>> switch = CustomSwitcher()
>>> print(switch(1))
one
>>> print(switch(2))
two
>>> print(switch(3))
…
Exception: Not a case!
>>> print(switch(42))
the answer of life, the universe and everything!

Verwenden eines Kontextmanagers

Eine andere Art, die sehr lesbar und elegant ist, aber weit weniger effizient als eine if / else-Struktur ist, besteht darin, eine Klasse wie folgt zu erstellen, die den zu vergleichenden Wert liest und speichert, um sich im Kontext als aufrufbar darzustellen gibt true zurück, wenn er mit dem gespeicherten Wert übereinstimmt:

class Switch:
    def __init__(self, value): 
        self._val = value
    def __enter__(self):
        return self
    def __exit__(self, type, value, traceback):
        return False # Allows traceback to occur
    def __call__(self, cond, *mconds): 
        return self._val in (cond,)+mconds

dann ist das Definieren der Fälle fast eine Übereinstimmung mit dem realen switch / case Konstrukt (innerhalb einer Funktion sichtbar gemacht, um die Darstellung zu erleichtern):

def run_switch(value):
    with Switch(value) as case:
        if case(1):
            return 'one'
        if case(2):
            return 'two'
        if case(3):
            return 'the answer to the question about life, the universe and everything'
        # default
        raise Exception('Not a case!')

Die Ausführung wäre also:

>>> run_switch(1)
one
>>> run_switch(2)
two
>>> run_switch(3)
…
Exception: Not a case!
>>> run_switch(42)
the answer to the question about life, the universe and everything

Nota Bene :



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow