Python 3.10では、構造的パターンマッチングメカニズム(structural pattern matching)が導入され、match-case演算子が追加されました。歴史的に、Pythonでは複雑な条件がif/elif/elseのチェーンで実装されており、ネストされた構造(例えば辞書やネストされたタプル)の分析において不便でした。
問題 — 複雑なネストされたチェックは可読性が低く、メンテナンスが難しくなります。match-caseに基づくアプローチは、変数のアンパックやガード条件を用いて、チェックを簡潔に記述することを可能にします。
解決策 — match-case構文を使用して、オブジェクトの構造(辞書、タプル、リスト)を指定されたパターンにマッチさせ、データを抽出します。
コードの例:
point = (1, 2) match point: case (0, 0): print('原点') case (0, y): print(f'Y={y}') case (x, 0): print(f'X={x}') case (x, y): print(f'X={x}, Y={y}')
主な特徴:
通常のif-elif-else条件に対してmatch-caseを使用できますか?
はい、しかしmatch-caseの強みは構造にあります。単純な離散条件については、Cのような言語のswitch-caseに似ています。
immutableオブジェクト(例:str)でmatch-caseを使用できますか?
はい、match-caseはパターンと比較できる任意のオブジェクト、文字列や数値を含めて動作します。
コードの例:
color = 'red' match color: case 'red': print('これは赤です') case 'blue': print('これは青です') case _: print('不明な色')
外部スコープで同じ変数名を持つオブジェクトをマッチさせるときにどんなエラーが発生しますか?
パターンマッチングはcase内でローカルに変数を割り当てるため、外部コンテキストに関係なくなります。これにより、変数名が外部で既に使用されている場合に混乱を招く可能性があります。
単純な定数の大きなif-elif-elseにmatch-caseを使用すること。
利点:
欠点:
APIからのネストされたJSON構造のストリームを処理し、異なるケースが異なるレベルの構造からデータを抽出する必要があります。
利点:
欠点: