2017-03-07 5 views
0

私は条件の複雑なセットを持っています。私は条件が満たされればそれを終了したいと思います。例外をPythonアプローチに使用していますか?

そのためにはtry:/except:構造を使用して適切なタイミングで終了したいと考えています。これはgotoに似ています。 (whileからbreakからraiseを使用して)複雑な例は次のようになります。

class Minor(Exception): 
    pass 
class Major(Exception): 
    pass 

age = 15 
while True: 
    try: 
     if age > 18: 
      raise Major 
     else: 
      raise Minor 
    except Major: 
     print('major') 
     break 
    except Minor: 
     print('minor') 
     break 

は例外のような使用ですニシキヘビ?言い換えれば、例外はTracebackだったと思われるものだけを捕まえることを意図していたのですか、それとも上記のような一般的な使い方ですか?

EDIT:以下のコメントは、この特定のコードを簡略化する方法を見ていないことを明確にしたいと思います。実際のコードはネストされたループと条件ではるかに複雑です。 私が関心を持っていた部分は、例外の使用を特に抑止する理由があるかどうかです。

+4

いいえなぜ、あなたが 'except'ブロックに' raise'文を入れるか、関数呼び出しに入れるのではなく、 'except'ブロックにカプセル化するのは意味がありますか? –

+1

これは私に非常にpythonicに見えません。 elifブロックが 'break'ステートメントで十分ではないのでしょうか? –

+0

@PatrickHaugh:私は、あなたのコメントの中の「いいえ」は、「いいえ、これはいたずらではない」ということを意味します。あなたの質問については、私の本当のケースはもっと複雑で、一連のforsとwhilesがあり、そこから一連の基準が満たされたら脱出したいのです。例外を発生させることは私が想像した解決策でした。 – WoJ

答えて

4

いいえ、これはpythonicアプローチではありません。ネストされたループから即座にエスケープするために使用されるフロー制御の通常の方法は、ロジックを関数に入れ、returnステートメントを使用することです。

PEP 3136は一度ラベルされたブレークを使用して、ネストされたループから脱出し、ステートメントを継続するための方法として提案されました:ラベル付きブレーク

と継続ネストされたループを使用して複雑なコードの読みやすさと柔軟性を向上させることができます。

このPEPは、Python 3.1では拒否されました。グイドwrote

私は に非常に複雑なコードは、この機能は非常にまれである必要があることに基づき、それを拒否しています。ほとんどの場合、たとえば 'return'を使用して、クリーンなコードを生成する既存の 回避策があります。

関連する問題