Python 3.10では、新たな機能として「構造的パターンマッチング」が導入されました。これは、他の言語でよく見られるswitch
文に似ていますが、より強力で柔軟性があります。
リテラルマッチング
これは、switch
文のような使い方をすることができます。例えば、次のように書くことができます。
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the Internet"
この例では、status
の値を見てそれに対応するエラーメッセージを返しています。
リテラルと変数の組み合わせ
もう少し複雑な例を考えてみましょう。点を(x,y)
のタプルで表すとして、それによって今どこにいるのかを文字列で返す関数は以下のように書けます。
def where_am_i(point):
match point:
case (0, 0):
return "Origin"
case (0, y):
return f"Y={y}"
case (x, 0):
return f"X={x}"
case (x, y):
return f"X={x}, Y={y}"
case _:
raise ValueError("Not a point")
クラスでのマッチング
前の例では点を表すのにタプルを使っていましたが、クラスを使うこともできます。
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
def where_am_i(point: Point):
match point:
case Point(x=0, y=0):
return "Origin"
case Point(x=0, y=yy):
return f"Y={yy}"
case Point(x=xx, y=0):
return f"X={xx}"
case Point(x=xx, y=yy):
return f"X={xx}, Y={yy}"
case _:
raise ValueError("Not a point")
以上のように、Python 3.10のmatch
文は、switch
文のような使い方から、より複雑なパターンマッチングまで、多岐にわたる使い方が可能です。これにより、Pythonのコードがより直感的で読みやすくなります。