1. ホーム
  2. python

[解決済み] リスト内包で例外を処理するには?

2022-04-29 02:15:18

質問

Pythonのリスト内包で、反復するたびに例外が発生するものがあります。

例えば を、持っている場合。

eggs = (1,3,0,3,2)

[1/egg for egg in eggs]

を取得します。 ZeroDivisionError の例外が3番目の要素で発生します。

この例外を処理して、リスト内包の実行を継続するにはどうしたらよいでしょうか。

ヘルパー関数を使用する方法しか思いつきません。

def spam(egg):
    try:
        return 1/egg
    except ZeroDivisionError:
        # handle division by zero error
        # leave empty for now
        pass

でも、これではちょっと面倒くさそうですね。

Pythonでこれを行う良い方法はないでしょうか?

注意してください。 これは簡単な例です(" 例えば 上記の ")は、私の本当の例にはいくつかのコンテキストが必要なため、私が工夫したものです。 ゼロ除算エラーの回避ではなく、リスト内包の例外処理に興味があるのです。

どうやって解決するの?

Pythonには例外を無視する(あるいは例外発生時に代替値を返す)ような組み込み式がないので、リスト内包で例外を処理することは文字どおり不可能です。 いいえ 例外をキャッチ、無視、処理できるのはステートメントだけです)。

関数呼び出しは式であり、関数本体には好きなだけ文を含めることができるので、あなたが気づいたように、例外を引き起こしやすい部分式の評価を関数に委ねることは、実現可能な回避策のひとつです(実現可能な場合は、他の回答にもあるように、例外を引き起こすかもしれない値のチェックもあります)。

リスト内包で例外を処理する方法"という質問に対する正しい回答は、この真実のすべての部分を表現しています:1)文字通り、つまり内包自体に語彙的にできない、2)現実的には、その仕事を関数に委ねるか、それが可能な場合はエラーを起こしやすい値のチェックを行う、です。このように、答えになっていないというあなたの繰り返しの主張には根拠がありません。