结构模式匹配 Python - 匹配集合 / Frozenset

awh*_*331 5 python structural-pattern-matching

我一直在尝试 Python 3.10 中的结构模式匹配,但不知道如何让它匹配一组。例如我尝试过:

a = {1,2,3}

match a:
    case set(1,2,3):
        print('matched')
Run Code Online (Sandbox Code Playgroud)

我尝试过:

a = {1,2,3}

match a:
    case set([1,2,3]):
        print('matched')
Run Code Online (Sandbox Code Playgroud)

也:

a = {1,2,3}

match a:
    case [1,2,3] if isinstance(a, set):
        print('matched')
Run Code Online (Sandbox Code Playgroud)

我猜有一种方法可以做到这一点,因为我们可以匹配其他对象,而我只是缺少正确的语法,但我想不出还有什么可以尝试的。任何帮助,将不胜感激!谢谢!

Bra*_*her 7

这并不是结构模式匹配的真正用途。您匹配的模式更多的是关于价值而不是结构。正因为如此,我想你会发现等效的if形式更具可读性:

if a == {1, 2, 3}:
    print('matched')
Run Code Online (Sandbox Code Playgroud)

照这样说...

Python 3.10 没有对匹配集的语法支持;它只有序列和映射的专用“显示”语法。我想我们简单地考虑过这一点,但最终放弃了它,因为它不是很有用或直观(而且很容易在以后的版本中添加)。

幸运的是,可以使用限定(或“点”)名称通过相等来匹配任何值。如果您需要将一组作为更大模式或match块的一部分进行匹配,这可能是最好的方法:

class Constants:
    SET_123 = {1, 2, 3}

match a:
    case Constants.SET_123:
        print('matched')
Run Code Online (Sandbox Code Playgroud)

如果您只想匹配集合(而不是例如冻结集合),它也可以与类模式结合使用:

match a:
    case set(Constants.SET_123):
        print('matched')
Run Code Online (Sandbox Code Playgroud)