Pattern Matching in Python

in Deutsch D-A-CH2 years ago

Mit Python 3.10 wurde ein nettes Feature eingefügt, genannt Pattern Matching. Beim Pattern Matching, also Musterprüfen, wird ein Argument was ihr übergebt auf ein bestimmtes Muster hin überprüft.
Die einfachste Form des Pattern Matching kennt man auch von switch-case aus anderen Programmiersprachen. Es wird einfach nur ein Wert gerprüft und dann etwas im Code ausgeführt, genauso wie mit if und else.
Mit Python kann man nun mit dem match keyword komplexere Pattern bis hin zu komplexe Datentypen überprüfen, also verschiedene Klassen in einem case wären möglich. Man kann sogar Variablen auf etwas hin überprüfen und ist nicht nur auf Konstanten beschränkt.

Um die Funktionsweise des Pattern Matching zu verstehen, wird in dem folgenden Beispiel ein dreidimensionales Tupel auf bestimmte Muster hin untersucht.

def pattern_matching(point3D):

    match point3D:

        # point3D must have exactly these values to match this case
        case (0, 0, 0):
            return "Origin"

        # also duable with variables. It matches only if z < 0
        # Values of x and y are irrelevant in this case
        case (x, y, z) if z < 0:
            return "Under the Floor"

        # if z is zero make a 2D point from a 3d Point
        case (x, y, z) if z == 0:
            return (x,y)

        # another example, x and y must have equal values
        # z doesn't matter in this case
        case (x, y, z) if x == y:
            return f"Point is diagonal"

        # This is nonsense, but only if all three types are float, then
        # this 3D point is able to do raytracing
        case (x, y, z) if type(x) == float and type(y) == float and type(z) == float:
            return "Raytracing can be done"

        # all other cases
        case _:
            return "default"

if __name__ == '__main__':
    patternlist = []
    patternlist.append((0, 0, 0))
    patternlist.append((35, 67, -2))
    patternlist.append((1, -56, 0))
    patternlist.append((67, 67, -8))
    patternlist.append((0.1, 0.5, 0.9))
    patternlist.append([1,2,3,4,5])

    for elem in patternlist:
        print(pattern_matching(elem))