Pythonではswitch文を構造的パターンマッチでコーディングする

Pythonではswitch文を構造的パターンマッチでコーディングする プログラミング

「Pythonにはswitch文がない」

このように言われてきました。
そして、実際にそれに該当するモノはありませんでした。

しかし、Python 3.10ではついにswitch文に該当するモノが現れました。
それが、構造的パターンマッチです。

この記事では、構造的パターンマッチについて解説します。

本記事の内容

  • 構造的パターンマッチとは?
  • 定数値によるパターンマッチ

それでは、上記に沿って解説していきます。

構造的パターンマッチとは?

構造的パターンマッチは、世間で言うswitch文と同じです。
例えば、PHPの場合は次のようにコーディングします。

$target = 100;

switch ($target){
    case 100:
        print 100;
        break;
    case 1000:
        print 1000;
        break;
    default:
        print 'etc';
}

これと同じ処理をPython 3.9以前なら、次のようにコーディングしていました。

target = 100

if target == 100:
    print(100)
elif target == 1000:
    print(1000)
else:
    print("etc")

簡単に言うと、ifの分岐でカバーしていました。
過去には、Pythonでswitch文を作る話があったようです。

しかし、if文で問題ないということでswitch文を作る案は却下されています。
実際、それで問題は特にありませんでしたからね。

では、なぜPython 3.10で構造的パターンマッチが新機能として公開されたのでしょうか?
それは、以下のようなことに対応することが目的だったを推測できます。

  • リスト・タプルのパターンマッチ
  • 辞書のパターンマッチ

ざっくりと言うと、処理の分岐に加えて変数への代入処理も同時に実現できる機能です。
言葉だけだと意味不明かもしれません。
これらについては、別途詳しく解説する予定です。

このような機能を作った結果として、switch文も機能するようになったと思います。
つまり、switch文の機能は副産物だと認識しています。

世間で言うswitch文は、定数値によるパターンマッチと言えます。
まずは、定数値によるパターンマッチを確認します。

定数値によるパターンマッチ

検証で利用するのは、以下のPythonバージョンとなります。

$ python -V
Python 3.10.2

先ほどif文で対応した処理を構造的パターンマッチでコーディングしてみましょう。

target = 100

match target:
    case 100:
        print(100)
    case 1000:
        print(1000)
    case _:
        print("etc")

switchではなく、matchでコーディングします。
そして、PHPのswitch文における「default」が「」となります。 「」は、「ワイルドカード」と呼びます。

また、定数値によるパターンマッチと言うのには理由があります。
match文では、演算が利用できません。

ifの場合だと、次のようにコーディングできます。

if target == 60+40:
    print(100)

しかし、matchの場合だとエラーになります。

match target:
    case 60+40:

次のようなエラーが表示されます。

SyntaxError: imaginary number required in complex literal

この違いは、覚えておきましょう。

とりあえず、Pythonでswitch文を使いたい場合は定数値によるパターンマッチを行いましょう。
そうすれば、switch文と同じようにコーディングできます。

Pythonでswitch文を使いたいだけの場合は、ここまでの内容で十分です。

以上、定数値によるパターンマッチを説明しました。

タイトルとURLをコピーしました