Pythonでswitch-case
文を使いたい、という要望は昔から上がっていました。(特にPython2時代を知るエンジニアたちから)
多くの議論がされ、Python 3.10でついに実装されたのがmatch
構文です。
それまで、if/elif
で対応され続けてきた、複雑な条件分岐をすっきり書くようになったという大きな進化です。
このコンテンツでは、可読性の高いPythonの機能であるmatch
文の使い方を紹介します。
Pythonにおけるmatchとは、PEP(Pythonにおける機能改善の設計書)においてPEP634で定義されたPython 3.10の新機能でした。
多くのプログラミング言語で実装されているパターンマッチング構文ですが、Pythonはif-elif-else
を利用した限定的な書き方しかなかったことから生まれました。
match
文によって、よりクリーンで可読性の高いPythonコーディングができるようになったという革新的な機能です。
まずはmatch
の書き方の構造を見てみましょう。
上記のように、すっきりした書き方ができます。
とある変数に対して、どういった値で渡されたかによって中の構文を切り替えられます。(上記の例だとパターンごとにreturn
しています)
簡単な実装例を見てみましょう。
このスクリプトを実行すると、以下のような出力結果が得られます。
ご覧のように、animal
という変数に対してマッチした結果が返ってきました。
先ほどの例をif-else
で表現してみます。
上記のように、animal ==
を何度も書かなくて済むので省コード化されます。この程度であれば、if-else
でもいい、と感じる人もいるでしょうが、これがより多くの条件を含めば含むほどmatch
が効果を発揮します。
簡単な実装例だけでちょっとしたマッチングパターンは綺麗に実装できますが、これをもう少し発展させてみましょう。
まず、アンチパターンになりますが、計算式を条件にしたい場合はif-elif-else
を使うほうが良いでしょう。
以下に例を示します。
続いて、クラスによるパターンマッチングの例です。
上記の出力結果は以下です。
特定の変数がどのクラスオブジェクトかを判定できます。通常、if-else
でクラスを判定するためにはisinstance()
を使いますが、その冗長さを回避できます。
ここまで、Pythonのmatch
文を見てきましたが、連なりすぎるif-else
文はそもそものコード設計に難ありなことが多いです。
ですので、match
を使うこと自体がおかしいのでは、と見直すこともありますが、ゲームシステムのような多くのクラスを有するプロジェクトでは使う機会があるでしょう。
プロジェクトが肥大化すればするほど、クリーンなコードが求められることなるので、ぜひこの機会に使い方を覚えて有効活用していきましょう。