8

この例は、パターン マッチングを使用する場合に「落とし穴」として議論されています。

NOT_FOUND = 400

retcode = 200
match retcode:
    case NOT_FOUND:
        print('not found')  

print(f'Current value of {NOT_FOUND=}')

これは、構造パターン マッチングによる偶発的なキャプチャの例です。この予期しない出力が得られます。

not found
Current value of NOT_FOUND=200

これと同じ問題が他の形で発生します。

match x:
    case int():
        pass
    case float() | Decimal():
        x = round(x)
    case str:
        x = int(x)

この例でstrは、括弧が必要str()です。それらがなければ、それは「キャプチャ」し、str組み込み型はxの値に置き換えられます。

これらの問題を回避し、早期に検出するのに役立つ防御的なプログラミング手法はありますか?

4

1 に答える 1

8

ベスト プラクティス

これらの問題を回避し、早期に検出するのに役立つ防御的なプログラミング手法はありますか?

はい。偶発的なキャプチャは、PEP 634 が反駁できないケースブロックとして記述しているものを常に含めることで簡単に検出できます。

平易な言葉で言えば、これは常に一致する包括的なケースを意味します。

使い方

偶発的なキャプチャは常に一致します。反駁できないケース ブロックは 1 つだけ許可されます。したがって、意図的なキャッチオールが追加されると、偶発的なキャプチャがすぐに検出されます。

最初の例の修正

最後に包括的なワイルドカード パターンを追加するだけです。

match retcode:
    case NOT_FOUND:
        print('not found')
    case _:
        pass

これにより、問題がすぐに検出され、次のエラーが発生します。

SyntaxError: name capture 'NOT_FOUND' makes remaining patterns unreachable

2 番目の例の修正

最後に包括的なワイルドカード パターンを追加します。

match x:
    case int():
        pass
    case float() | Decimal():
        x = round(x)
    case str:
        x = int(x)
    case _:
        pass

ここでも、問題はすぐに検出されます。

SyntaxError: name capture 'str' makes remaining patterns unreachable
于 2021-05-13T20:44:33.997 に答える