Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 7910

Pythonでswitch文を書きたい(match, パターンマッチング) - きり丸の技術日記

$
0
0

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

環境

  • Python
    • 3.12.3

リテラルマッチング

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

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

defget_mailer_class(env: str):
    match env:
        case "local":
            return DummyMailer
        case "dev" | "prod":
            return Mailer
        case _:
            raiseValueError(f"Unknown case: {env}")

classDummyMailer:
    passclassMailer:
    pass

クラスマッチング

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

from dataclasses import dataclass

@dataclassclassPoint:
    x: int
    y: intdefmatch_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"

複数条件のマッチング

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

defmatch_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検索できるので、このブログは自分へのメモの用途が大きいです。

参考情報


Viewing all articles
Browse latest Browse all 7910

Trending Articles