避免在结构模式匹配中发生意外捕获。

10

这个例子被认为是使用模式匹配时可能会遇到的“陷阱”:

NOT_FOUND = 400

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

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

这是一个使用结构模式匹配意外捕获的示例。它会产生意想不到的输出:
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 的值。
有没有一种defensive programming实践可以帮助避免这些问题并提供早期检测?
1个回答

10

最佳实践

有没有一种防御性编程实践可以帮助避免这些问题并提供早期检测?

有。意外捕获可以通过始终包括 PEP 634 描述的不可辩驳情况块来轻松检测到。

简单来说,就是总是匹配所有情况的捕获块。

它是如何工作的

意外捕获总是匹配的。不能超过一个不可辩驳情况块。因此,当添加一个故意的捕获块时,就立即检测到了意外捕获。

修复第一个示例

只需在末尾添加一个捕获通配符模式

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

它会立即检测问题并给出以下错误:

SyntaxError: name capture 'NOT_FOUND' makes remaining patterns unreachable

修复第二个示例

在末尾添加一个通配符模式wildcard pattern

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接