Python 3.10では、新たな構文として構造的パターンマッチングが導入されました。この新機能は、match
とcase
という2つのキーワードを使用します。
match value:
case 1:
...
case _:
...
この構文は、単純な値での分岐だけでなく、データ構造やアトリビュートのパターンでの分岐も可能となっています。見た目は他のオブジェクト指向型の言語によくあるswitch case
に似ていますが、どちらかというと関数型言語のパターンマッチングに近いイメージで捉えるのがよさそうです。
この新機能は、PEP 634、PEP 635、PEP 636で詳しく説明されています。
パターンマッチングがサポートするパターン
構造的パターンマッチングは、以下のような多くのパターンをサポートしています。
- リテラルパターン
- キャプチャパターン
- ワイルドカードパターン
- バリューパターン
- シーケンスパターン
- マッピングパターン
- ifガード
- クラスパターン
- asでの束縛
それぞれのパターンについて詳しく見ていきましょう。
リテラルパターン
case
の後ろにリテラルを記述するパターンです。このパターンでは、単純に値が一致するかどうかでマッチングを行います。
number = 10
match number:
case 0:
raise Exception('失敗')
case 10:
print('成功')
case _:
raise Exception('失敗')
キャプチャパターン
case
の後ろにPythonで有効な名前を記述するパターンです。
value = 3.14
match value:
case 3:
raise Exception('失敗')
case 3.1415:
raise Exception('失敗')
case x:
assert x == 3.14
print('成功')
このように書くと、case x:
のところでマッチし、変数x
の値が3.14になります。
ワイルドカードパターン
case
の後ろに_
を記述するパターンです。
message = 'こんにちは'
match message:
case 'おはよう':
raise Exception('失敗')
case _:
print('成功')
ワイルドカードパターンはキャプチャパターンとよく似ていますが、キャプチャパターンは変数への代入が起こるのに対し、ワイルドカードパターンは変数への代入が起こりません。
以上、Python 3.10の新機能である構造的パターンマッチングについて簡単に説明しました。この新機能を理解し、うまく活用することで、よりPythonicなコードを書くことができるでしょう。