在使用模式匹配时,此示例可能会被讨论为“gotcha”:
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的值。
是否有防御性编程实践可以帮助避免这些问题并提供早期检测?
是否有防御性编程实践可以帮助避免这些问题并提供早期检测?
是的。通过始终包含PEP 634所描述的无可辩驳的案例块,很容易检测到意外捕获。
用简单的语言来说,这意味着一个总是匹配的包罗万象的案例。
意外捕获总是匹配的。不允许超过一个无可辩驳的案例块。因此,当添加有意的包罗万象时,会立即检测到意外捕获。
只需在末尾添加一个catchall通配符模式:
match retcode:
case NOT_FOUND:
print('not found')
case _:
pass
如果立即检测到问题,则会出现以下错误:
SyntaxError: name capture 'NOT_FOUND' makes remaining patterns unreachable
在末尾添加catchall通配符模式:
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
我无法运行此代码: 我在Python中找不到匹配关键字。 我在这里找到的:https://www.python.org/dev/peps/pep-0622/#the-match语句 有什么想法吗?
我正在做一些正则表达式在php和匹配使用preg_match(); 我有一个文本,可能看起来像这样: 我的目标是选择“div”标记中包含的“img”标记(包括“div”标记),或者如果没有包含在div中,则只选择“img”。在每种情况下,我还希望捕获“img”标记的src属性中包含的地址。 这是我使用的模式: 它对于“div”封闭的图像非常有效,但是对于无div的图像,我得到了捕获子模式的奇怪结果
字面量 变量 占位符
我一直在玩Python 3.10中的结构模式匹配,但不知道如何让它匹配一组。例如,我尝试过: 我尝试过: 以及: 我想有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么其他方法可以尝试。任何帮助都将不胜感激!谢谢
Lambda表达式是C++编程中的游戏规则改变者。这有点令人惊讶,因为它没有给语言带来新的表达能力。Lambda可以做的所有事情都可以通过其他方式完成。但是lambda是创建函数对象相当便捷的一种方法,对于日常的C++开发影响是巨大的。没有lambda时,标准库中的_if算法(比如,std::find_if, std::remove_if, std::count_if等)通常需要繁琐的谓词,但是当