【问题标题】:How to do structural pattern matching in Python 3.10 with a type to match?如何在 Python 3.10 中使用要匹配的类型进行结构模式匹配?
【发布时间】:2022-12-19 20:36:49
【问题描述】:

我正在尝试使用控制台匹配 Python 3.10 中的类型:

t = 12.0
match type(t):
  case int:
    print("int")
  case float:
    print("float")

我得到这个错误:

  File "<stdin>", line 2
SyntaxError: name capture 'int' makes remaining patterns unreachable

我该如何解决这个问题?

【问题讨论】:

    标签: types pattern-matching python-3.10


    【解决方案1】:

    丢掉 type() 并为您的类型添加括号:

    t = 12.0
    match t:
      case int():
        print("int")
      case float():
        print("float")
    

    我不确定为什么你写的东西不起作用,但这个有效。

    【讨论】:

    • 奇怪的是,调用 type 而不是在 match 子句中询问类型和 caseing 反对可能性。像问题中那样,如果能获得更多关于为什么这样做而不是大多数语言的方法的信息,那将很有趣。尽管如此,它还是有效的。谢谢!
    • @lsabi 我的理解是其他语言主要有switch-case结构,也就是花哨的if-else。但是 python 的结构模式匹配提供的功能要强大得多,它允许您根据要比较的对象的结构选择代码分支。所以在这里,你不是在说“如果t的类型是int”,你是在说“如果你可以将t放在int容器中”。但请相信我的话,因为这只是我从阅读的有关此新功能的不同内容中得出的理解,我绝不是该领域的专家。
    • PEP for Structural Pattern Matching 是了解为什么会出现这种情况的重要资源。该类型不是“调用”的(尽管语法会让您这么认为),而是为解构对象而设置的。请参阅 PEP peps.python.org/pep-0622/#matching-process,其中 case (x, y) 用于元组解包/解构,您可以想象可以对任何类型的数据类完成同样的操作。
    【解决方案2】:

    我的修复是:

    match type(t):
      case v if v is int:
        print("int")
      case v if v is float:
        print("float")
    

    它不是很优雅,但它是我能用模式匹配做的最好的。

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 2019-09-16
      相关资源
      最近更新 更多