2

这与新的 Python 3.10 beta 和新match语法有关。有没有办法检查一个模式是否简单地包含在一个迭代中?最明显的解决方案是简单地将两个通配符放在两边,但这会引发 aSyntaxError由于来自可迭代解包的解包语法。

有没有办法做到这一点?注意:在示例中使用诸如包装类之类的东西numbers 会很好,只要它使用匹配块并且至少具有一定的可读性,但我已经尝试过这个并且没有太大的成功

例子:

numbers = [1, 2, 3, 5, 7, 8, 9] #does not have to be a list, could be a class if needed

match numbers:
    # this just raises a SyntaxError, but I need a way to do something equivalent to this
    case [*_, (5 | 6), *_]:
        print("match!")
4

1 回答 1

2

不,我们目前没有任何计划支持可迭代包含检查作为结构模式匹配语法的一部分。

用合法的 Python 重写示例的最佳方法是进行常规if测试:

if any(i in (5, 6) for i in numbers):
    print("match!")

如果包含检查只是更复杂模式的一部分,则可以将其编写为警卫:

match something:
    case [pattern, capturing, numbers] if any(i in (5, 6) for i in numbers):
        print("match!")

当然,如果你有一个序列,也可以在已知索引处找到一个项目:

match numbers:
    case [_, _, _, 5 | 6, *_]:
        print("match at position 3!")
    case [*_, 5 | 6, _, _, _]:
        print("match at position -4!")

照这样说...

在示例中使用诸如包装类之类的东西numbers会很好,只要它使用匹配块工作并且至少有点可读

...我想映射模式可能会被破解以使这项工作(前提是您的所有项目都是可散列的并且没有异常的相等规则):

match dict.fromkeys(numbers):
    case {5: _} | {6: _}:
        print("match!")

不过,我强烈推荐这种if形式。

于 2021-06-01T22:40:31.483 回答