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

使用结构模式匹配反转测试

潘灵均
2023-03-14

我一直在将if-elif链转换为结构模式匹配,但在反向测试中遇到了困难。

很容易生成与任何支持的模式(文本、类、映射、序列等)匹配的案例。我如何证明一个否定的匹配?

例如,当对象的类型不匹配时,我需要强制它:

   if isinstance(x, (list, dict)):
      x = json.dump(x)  
   elif not isinstance(x, str):    # <-- Inverted test
      x = str(x)

共有1个答案

孙嘉
2023-03-14

从本质上讲,结构模式匹配的设计仅在存在正匹配的情况下触发。然而,有两种解决方法。

最简单的方法是添加一个保护表达式。但这是最后的手段,因为它并没有利用模式匹配和分解功能

第二种方法是添加早期匹配测试,以便稍后的案例可以假定反向匹配为真。如果负面案例是最后一个案例,那么这种方法效果很好。如果没有,则会变得有点尴尬,因为需要嵌套。

进行反向测试并将其移动到if表达式中:

   match x:
       case list() | dict():
           x = json.dump(x)
       case _ if not isinstance(x, str):    # <-- Inverted test
           x = str(x)

这里的基本思想是进行积极匹配,以便后续案例可以假设消极匹配:

   match x:
       case list() | dict():
           x = json.dump(x)
       case str():                          # <-- Positive match
           pass
       case _:                              # <-- Inverted case
           x = str(x)

除非您有其他要匹配的情况,否则预测试技术是优雅的:

   if isinstance(x, (list, dict)):
      x = json.dump(x)  
   elif not isinstance(x, str):    # <-- Inverted test
      x = str(x)
   elif x == 'quit':               # <-- Additional test
      sys.exit(0)

这里最简单的解决方案是将附加测试移动到倒置测试之前:

   match x:
       case list() | dict():
           x = json.dump(x)
       case 'quit':                    # <-- Moved the test up
           sys.exit(0)
       case str():                     # <-- Positive match
           pass
       case _:                         # <-- Inverted case
           x = str(x)

并不总是可以重新安排测试顺序。如果是这样,则可以引入新级别的嵌套匹配:

   case list() | dict():
       x = json.dump(x)
   case str():                     # <-- Positive match
       match x:                    # <-- Nested match
           case 'quit':            # <-- Inner case
               sys.exit(0)               
   case _:                         # <-- Inverted case
       x = str(x)
 类似资料:
  • 我无法运行此代码: 我在Python中找不到匹配关键字。 我在这里找到的:https://www.python.org/dev/peps/pep-0622/#the-match语句 有什么想法吗?

  • 我有一个字符串,我正试图根据几个regex模式验证它,我希望由于模式匹配在3.10中可用,我可以使用它来代替创建if-else块。 考虑一个字符串'validateString',其可能的值1021102,1.25.32string021。 我尝试的代码如下所示。 对于正则表达式1、2和3,我尝试了字符串正则表达式模式,还重新设置了。编译对象,但它似乎不起作用。 我一直试图在互联网上找到这方面的例

  • 字面量 变量 占位符

  • 我一直在玩Python 3.10中的结构模式匹配,但不知道如何让它匹配一组。例如,我尝试过: 我尝试过: 以及: 我想有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么其他方法可以尝试。任何帮助都将不胜感激!谢谢

  • 使用结构模式匹配,如何编写匹配哈希类型实例的案例? 我尝试过: 但是,这得到了错误的答案,因为每个类型都定义了它是否可哈希: