簡體   English   中英

避免結構模式匹配中的意外捕獲

[英]Avoiding accidental capture in structural pattern matching

在使用模式匹配時,這個例子被討論為可能的“陷阱”:

NOT_FOUND = 400

retcode = 200
match retcode:
    case NOT_FOUND:
        print('not found')  

print(f'Current value of {NOT_FOUND=}')

這是使用結構模式匹配意外捕獲的示例。 它給出了這個意想不到的 output:

not found
Current value of NOT_FOUND=200

同樣的問題以其他形式出現:

match x:
    case int():
        pass
    case float() | Decimal():
        x = round(x)
    case str:
        x = int(x)

在此示例中, str需要有括號str() 沒有它們,它會“捕獲”並將str內置類型替換為x的值。

是否有一種防御性編程實踐可以幫助避免這些問題並提供早期檢測?

最佳實踐

是否有一種防御性編程實踐可以幫助避免這些問題並提供早期檢測?

是的。 通過始終包含 PEP 634 所描述的無可辯駁的案例塊,可以輕松檢測到意外捕獲。

用簡單的語言來說,這意味着一個總是匹配的包羅萬象的案例。

這個怎么運作

意外捕獲始終匹配。 不允許超過一個無可辯駁的案例塊。 因此,當添加有意的包羅萬象時,會立即檢測到意外捕獲。

修復第一個示例

只需在末尾添加一個通用通配符模式

match retcode:
    case NOT_FOUND:
        print('not found')
    case _:
        pass

立即檢測到問題並給出以下錯誤:

SyntaxError: name capture 'NOT_FOUND' makes remaining patterns unreachable

修復第二個示例

在末尾添加一個通用通配符模式

match x:
    case int():
        pass
    case float() | Decimal():
        x = round(x)
    case str:
        x = int(x)
    case _:
        pass

再次立即檢測到問題:

SyntaxError: name capture 'str' makes remaining patterns unreachable

暫無
暫無

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

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