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