Python 3.10では、新たな構文として構造的パターンマッチングが導入されました。この新機能は、matchcaseという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なコードを書くことができるでしょう。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です