结构模式匹配中的可选匹配
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', {}, {}]
也会被匹配。没有正则表达式 ?
量词的类似物,因此不能用这种方式表达“不超过一个”。
我有一个来自 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', {}, {}]
也会被匹配。没有正则表达式 ?
量词的类似物,因此不能用这种方式表达“不超过一个”。