きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Pythonでswitch文を書きたい(match, パターンマッチング)

Pythonでは3.10からパターンマッチングができるようになりました。Pythonではswitchではなく、matchで他言語のswitchと同等機能を提供できます。なお、当然ながらswitch文がない3.10以前はif... elif... elif... elseしかできないです。

環境

  • Python
    • 3.12.3

リテラルマッチング

通常のリテラルマッチングができます。A or B 等のor条件は|で設定できます。また、Pythonでdefaultにあたるのは_を使用します。

次の例は、環境がローカルならダミークラス、それ以外の環境なら本物のクラス、もし未定義の環境の場合はエラーとなるようにしています。

def get_mailer_class(env: str):
    match env:
        case "local":
            return DummyMailer
        case "dev" | "prod":
            return Mailer
        case _:
            raise ValueError(f"Unknown case: {env}")

class DummyMailer:
    pass

class Mailer:
    pass

クラスマッチング

クラスでの比較ができます。今回の例では、X軸とY軸をもつPointクラスを例にします。dataclassを使用していれば、__eq__()を自動で生成してくれるので、今回はdataclassで生成します。

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int


def match_point(point: Point):
    match point:
        case Point(x=0, y=0):
            return "Origin"
        case Point(x=0, y=_):
            return "Y-axis"
        case Point(x=_, y=0):
            return "X-axis"
        case Point():
            return "Somewhere else"

複数条件のマッチング

複数条件を定義してマッチングできます。例としてはバラバラのパラメータで受け取ってますが、実際に使用する際にはタプルで使用したほうが楽だと思います。

def match_point2(self, x: int, y: int):
    match x, y:
        case 0, 0:
            return "Origin"
        case 0, _:
            return "Y-axis"
        case _, 0:
            return "X-axis"
        case _:
            return "Somewhere else"

ソースコード

終わりに

Pythonでswitch文を書きたい時にChatGPTに相談したら出てこなかったので、自分でブログにしました。なお、キーワードさえ分かっていればGoogle検索できるので、このブログは自分へのメモの用途が大きいです。

参考情報