Python 3.10では、新たな制御文であるmatch文が導入されました。これは、他言語のSwitch文に似た機能を提供するものです。
match文とは
match文はPEP 634で提案された新しい制御構造のひとつです。この文は、変数の値に基づいて、多くの異なるアクションまたはコードブロックのいずれかを実行するために使用されます。
match文の利用例
match文の利用例としては、リテラルマッチング、リテラルと変数の組み合わせパターンにマッチング、クラスでのマッチングなどがあります。
リテラルマッチング
これは 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"
リテラルと変数の組み合わせパターンにマッチング
もう少し複雑な例を考えてみます。点を (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文と似たような記法ですが、単に値のマッチングだけではなく構造的なマッチングも行うことのできる記法で、これが 3.10でPythonに取り入れられることになります。