当前位置: 首页 > 知识库问答 >
问题:

避免结构模式匹配中的意外捕获

湛联
2023-03-14

在使用模式匹配时,此示例可能会被讨论为“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的值。

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

共有1个答案

景元忠
2023-03-14

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

是的。通过始终包含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等)通常需要繁琐的谓词,但是当