Guido van Rossum は、パターン マッチング演算子を Python に追加することを提案しました

グイド・ファン・ロッサム 紹介された コミュニティレビューの草案 仕様書 Python でパターン マッチング演算子 (match と case) を実装するためのツールです。 パターン マッチング演算子を追加する提案は、2001 年と 2006 年にすでに発表されていることに注意してください (ペップ-0275, ペップ-3103) ですが、一致するチェーンをコンパイルするための「if ... elif ... else」構造の最適化を支持して拒否されました。

新しい実装は、Scala、Rust、および F# で提供される「match」演算子によく似ており、指定された式の結果を、「case」演算子に基づいてブロックにリストされているパターンのリストと比較します。 C、Java、JavaScript で使用できる「switch」演算子とは異なり、「match」ベースの式ではさらに多くの機能が提供されます。 幅広い機能。 提案された演算子はコードの可読性を向上させ、任意の Python オブジェクトの比較とデバッグを簡素化し、また拡張された可能性のおかげでコードの信頼性も向上することに注意してください。 静的型チェック.

def http_error(ステータス):
試合ステータス:
ケース400:
「不正なリクエスト」を返す
ケース 401|403|404:
「許可されていません」を返す
ケース418:
返す「私はティーポットです」
場合_:
「何か別のこと」を返す

たとえば、オブジェクト、タプル、リスト、および任意のシーケンスを解凍して、既存の値に基づいて変数をバインドできます。 ネストされたテンプレートの定義、テンプレート内での追加の「if」条件の使用、マスク (「[x, y, *rest]」)、キーと値のマッピング (例: {"bandwidth": b、"latency") の使用が許可されます。 ”: l} を使用して「帯域幅」と「遅延」の値と辞書を抽出します)、サブテンプレートを抽出します(「:= 演算子」)、テンプレートで名前付き定数を使用します。 クラスでは、「__match__()」メソッドを使用してマッチング動作をカスタマイズできます。

データクラスからデータクラスをインポート

@データクラス
クラスポイント:
x:int
y:int

def whereis(ポイント):
マッチポイント:
ケースポイント(0, 0):
print("原点")
ケースポイント(0, y):
print(f"Y={y}")
ケースポイント(x, 0):
print(f"X={x}")
ケースポイント():
print("どこか別の場所")
場合_:
print("点ではありません")

マッチポイント:
case Point(x, y) x == y の場合:
print(f"Y=X at {x}")
点(x, y)の場合:
print(f"対角線上にない")

赤、緑、青 = 0、1、2
一致する色:
ケースのRED:
print("赤が見えます!")
ケースのグリーン:
print("草は緑です")
ケースのBLU
E:
print(“ブルースを感じています:(“)

レビュー用にセットが用意されました パッチ 実験的 実装 仕様案はあるが、最終バージョンはまだ 議論されている。 例えば、 提供された 他のコンテキストの「_」は一時変数として使用されるため、デフォルト値の式「case _:」の代わりに、キーワード「else:」または「default:」を使用します。 また、内部組織も疑問です。内部組織は、新しい式を「if ... elif ... else」構造に使用されるのと同様のバイトコードに変換することに基づいており、非常に大規模な比較セットを処理するときに望ましいパフォーマンスが得られません。

出所: オープンネット.ru

コメントを追加します