簡體   English   中英

如何用結構模式匹配表達 hasattr() 鴨子類型邏輯?

[英]How to express hasattr() duck typing logic with structural pattern matching?

我有通過查找_fields屬性來檢查命名元組和數據類的_fields

if hasattr(candidate, '_fields'):
    do_action()

如何使用 Python 3.10 的匹配/大小寫結構模式匹配來表達這一點?

了解文檔

用於結構模式匹配的PEP 634將此功能記錄為class 模式

  • 編寫cls()將執行isinstance()測試。
  • 添加關鍵字模式cls(attr=variable)測試屬性是否存在並將值綁定到變量。

要模擬鴨子類型hasattr()

  • cls設置為object以便任何 class 都可以匹配。
  • attr設置為_fields ,這是必須存在的屬性。
  • 如果您不需要捕獲該值,請將變量設置為_ ,如果您確實想捕獲該值,請將其設置為其他變量名。

這個具體的例子

您的具體示例, if hasattr(candidate, '_fields'): do_action() ,轉換為:

match candidate:
   case object(_fields=_):
       do_action()

完整的計算示例

這顯示了所有部分如何組合在一起:

from typing import NamedTuple
from dataclasses import dataclass

class Whale(NamedTuple):
    name: str
    num_fins: int

@dataclass
class Vehicle:
    name: str
    num_wheels: int

subject = Vehicle('bicycle', 2)
    
match subject:
    case object(num_fins=n):
        print(f'Found {n} fins')
    case object(num_wheels=_):
        print(f'Found wheeled object')
    case _:
        print('Unknown')

該腳本輸出:

Found wheeled object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM