Python集解包和模式匹配

  • 本文关键字:模式匹配 Python python
  • 更新时间 :
  • 英文 :


如果解包一个集合:

>>> a = {1,2,3}
>>> (x, y, z) = a
>>> x
1
>>> y
2
>>> z
3

那么为什么下面的不是?

>>> a = {1,2,3}
>>> match a:
...   case (p, q, r):
...     print(f'{p} {q} {r}')
...
>>>

我希望上面的代码输出"1 2 3"我理解集合不是有序的,如果两者都不行,我也不会感到惊讶,但前者行得通,只有后者不行。我一直认为模式匹配是基于拆包的。

这不是关于类型不匹配,因为如果我们将集合{1,2,3}替换为列表[1,2,3],即使我们使用元组语法解包,它也可以工作。

match语句序列模式比序列解包具有更多的限制性规则。序列解包将尝试解包任何可迭代对象,但是序列模式被指定为要求

下列之一:

  • 继承自collections.abc.Sequence的类
  • 已注册为collections.abc.Sequence的Python类
  • 一个内置类,它的Py_TPFLAGS_SEQUENCE位设置
  • 继承上述任何类的类(包括在父级Sequence注册之前定义的类)

set不满足这些条件。

请注意,由于集合在语义上是无序的,因此如果试图解包集合,则无法保证哪些元素将分配给哪些变量。您的(x, y, z) = a拆包不安全。

最新更新