结构模式匹配中的可选匹配

Optional matches in structural pattern matching

我有一个来自 websocket 的变量 data,我正在使用 match/case 来确定如何处理它。它以元组的形式出现,如下所示,但我想匹配这两个相同的。

data = ("foo", )
# or
data = ("foo", {"bar": 213})

有些情况下我需要数据,有些情况下我不需要。在我不需要它的情况下(即上面第一个元素是 foo 的情况)我只想基本上忽略第二个变量,如果它存在的话。

这是我目前的做法,但我做错了吗?或者有更简洁的形式吗?

match data:
        case ["foo"] | ["foo", _]:
            ...
        case ["baz", x]:
            ...
        ...

像往常一样使用星号拆包,带星号的变量(或下划线)匹配零个或多个项目。所以以下将起作用:

data = ['foo']

match data:
    case ['foo', *_]:
        print('Matched')

类似于普通的可迭代拆包:

a, *b = [1]
assert a == 1
assert b == []

注意:和你原来的代码不一样,因为['foo', {}, {}]也会被匹配。没有正则表达式 ? 量词的类似物,因此不能用这种方式表达“不超过一个”。