Python 3.10 kann endlich Switch-Case-Statement

  Ralf Hersel   Lesezeit: 2 Minuten  🗪 3 Kommentare

Pattern Matching ist eine der wichtigsten Neuerung in Version 3.10.

python 3.10 kann endlich switch-case-statement

Darauf haben viele Entwickler und Entwicklerinnen gewartet. Bis zur heute erschienenen Version 3.10 der Programmiersprache Python, musste man sich mit if/elif-Konstrukten behelfen, um das Switch-Case-Statement abzubilden. Bei Python 3.10 nennt sich dieses Statement nun match.

Hier ein Beispiel:

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case 401 | 403 | 404:
            return 'Not allowed'
        case _:
            return "Something else"

Das oben gezeigte Beispiel prüft den Inhalt der Variable status auf verschiedene Inhalte. Dies geschieht mit einer Reihe von case Statements. Der else-Fall wird mit case _ abgebildet. Die zu prüfenden Literale können mit dem OR-Operator | verbunden werden. Das match-Statement kann mit verschiedenen Datentypen umgehen, wie zum Beispiel Sequenzen (Listen, Tupel etc.), Mapping-Strukturen (z.B. Wörterbücher), primitive Datentypen oder Klasseninstanzen. In der Dokumentation zu Python 3.10 finden sich viele weitere Beispiele zur Verwendung des match-Statements.

Welche Neuerungen ansonsten mit Version 3.10 erschienen sind, findet man in der Quelle:

Quelle: https://docs.python.org/3.10/whatsnew/3.10.html

Tags

Python, Case, Beispiel, Statement, Switch-Case-Statement, Datentype, Switch

User123
Geschrieben von User123 am 6. Oktober 2021 um 13:49

Sehr schön 😀

Peter V.
Geschrieben von Peter V. am 9. Oktober 2021 um 22:21

Wie viele sich wohl geärgert haben, sich mit "if/elif-Konstrukten" herumschlagen zu müssen, weil der Python-Erfinder an diesem Konstrukt festhielt - Endlich. Mich hat es vor vielen Jahren davon abgehalten, ein Problem mit Python zu lösen

Julian
Geschrieben von Julian am 10. Oktober 2021 um 20:26

Tatsächlich gab es schon das Idiom ein dict mit Funktionen als Werte zu nutzen:

def err400():

    return "Bad request"

def err404():
    return "Not found"
def err418():
    return "I'm a teapot"

def err401_403():
    return "Not allowed"

def _default():

    return "Something else"

http_error = {400: err400, 418: err418, 401: err401_403, 403: err401_403}

http_error.get(status, _default)()

oder mit dem call im dict oder in diesem Fall einfach nur ein dict.

Das wirklich coole neue an match ist, dass es eher vergleichbar mit funktionalen Sprachen oder mit Rusts match ist und man Objekte vergleichen und dabei Variablen setzen kann und so abgefahrene Dinge, wie Textadventures super kompakt schreiben kann, weil bsw. folgender code geht (siehe Tutoria/PEP636/https://www.python.org/dev/peps/pep-0636/):


match command.split():

    case ["go", ("north" | "south" | "east" | "west") as direction]:

        current_room = current_room.neighbor(direction)

(Sorry für die komische Formatierung, die durch teilweise copy&paste aus dem Artikel entstand)