[英]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.