グイド・ファン・ロッサム コミュニティレビューの草案 Pythonでパターンマッチング演算子(matchとcase)を実装する。パターンマッチング演算子を追加する提案は2001年と2006年にすでに発表されていたことに注意する必要がある(, ) ですが、一致するチェーンをコンパイルするための「if ... elif ... else」構造の最適化を支持して拒否されました。
新しい実装は、Scala、Rust、F#が提供するmatch演算子に非常に似ています。match演算子は、指定された式の結果を、大文字小文字のブロックに列挙されたパターンのリストと比較します。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
