Guido van Rossum 提議在 Python 上新增模式比對運算符

吉多·範羅蘇姆 引進 供社區審查的草案 規格 用於在 Python 中實作模式比對運算子(匹配和大小寫)。 應該指出的是,添加模式匹配運算符的提案已於 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:整數
y:整數

def 其中(點):
賽點:
案例點(0, 0):
列印(“原點”)
案例點(0,y):
印出(f“Y = {y}”)
案例點(x,0):
印出(f“X = {x}”)
案例點():
print("在別的地方")
案件_:
print("不是重點")

賽點:
case Point(x, y) 若 x == y:
print(f"Y=X 在 {x}")
情況點(x,y):
print(f"不在對角線上")

紅、綠、藍 = 0、1、2
搭配顏色:
案例.紅色:
print("我看到紅色了!")
案例.綠色:
print("草是綠的")
案例.BLU
E:
print(“我感到憂鬱:(“)

已準備一套供審核 補丁 具有實驗性 執行 提議的規範,但最終版本仍然是 討論。 例如, 提供 使用關鍵字“else:”或“default:”代替表達式“case _:”作為預設值,因為“_”在其他上下文中用作臨時變數。 同樣值得懷疑的是內部組織,它基於將新表達式轉換為字節碼,類似於用於“if ... elif ... else”構造的字節碼,在處理非常大的比較集時,這不會提供所需的性能。

來源: opennet.ru

添加評論