2

これは、新しい Python 3.10 ベータと新しいmatch構文に関係しています。パターンが単純にイテラブルに含まれているかどうかを確認する方法はありますか? 最も明白な解決策は、どちらかの側に 2 つのワイルドカードを単純に配置することですが、SyntaxError反復可能なアンパックから生じるアンパック構文のために a が発生します。

これを行う方法はありますか?注: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 に答える