2016-10-06 13 views
4

私は、Pythonインタプリタにと伝える良い方法があるかどうか疑問に思ったが、関数の次の/最後のreturn文にスキップする。Python:条件が返ってきたら返す

次ダミーのコードを想定します:

def foo(bar): 
    do(stuff) 

    if condition: 
    do(stuff) 
    if condition2: 
     do(stuff) 
     if condition3: 
     ... 

    return (...) 

時には、これは彼らがブロックの上do(stuff)に依存しているので、私はチェーンを傾ける多くの条件と本当に厄介取得します。私は今、これを行うことができます:

def foo(bar): 
    do(stuff) 

    if not condition: return (...) 
    do(stuff) 
    if not condition2: return (...) 
    do(stuff) 
    if not condition3: return (...) 
    ... 

    return (...) 

それは少し厄介に見えますが、私はsomwhat anoyingであり、その長いタプルまたは類似の場合、それはさらに悪い見えたもう一度もう一度return文を繰り返してしなければなりません。 完璧な解決策は、「条件がない場合は、最終的なreturn文にスキップする」と言うことです。これは何とか可能ですか?

編集:これを明確にする:パフォーマンスの低下

+4

_「多少厄介で、その長いタプルなら_」。 'x = [ここに長いタプルを挿入する]'だけできませんか?それから、あなたはたくさんの場所でそれを返すことができ、毎回 'return x 'を書くだけでよいのです。 – Kevin

+1

一般的に、ネストされたステートメントのためにコードが右に移動することが判明した場合、ロジック全体を再構築する方法は常にあります。どのように正確にあなたがやっている具体的なものと、それらの行動や条件を簡素化することができますに依存します。本当の一般的な答えはありません。 – deceze

+0

* try else * ** finally **構文を使用してから、通常の*を返すのはどうですか?最終的にはリソースを閉じることを目的としていますが、*最終的な返品明細書*によってあなたの意味ごとに家事を行うことができます。あなたが何か異なるものを返すことができるかどうかは確かではありませんが、なぜそうは見えません。あなたのセットアップにコードの臭いがあることに同意しないでください。しかし、私たちはあなたのロジックについて知らず、あなたの質問を自分自身で有効なものにしています。 –

答えて

5

を回避しながら、私の目標は、読みやすくするために、私は、私は関数のリストを作成すると思います(私はあなたの例では、すべてのdo(stuff)が実際にあることを前提としてい異なる機能)。条件が異なる場合

list_of_funcs = [func1, func2, func3] 
for func in list_of_funcs: 
    func(stuff) 
    if not condition: 
     break 
return (...) 

が、あなたはまた、(TrueまたはFalseを返す関数のリストになります)条件のリストを作成することができ、その後、あなたがzipを使用することができます。そして、あなたはforループを使用することができます次の方法:あなたの実際のコードには関係なく、あなたが持つかもしれどのように多くの機能や条件、同じ長さのまましないと、同じインデントレベルで

list_of_funcs = [func1, func2, func3] 
list_of_conditions = [cond1, cond2, cond3] 
for func, cond in zip(list_of_funcs, list_of_conditions): 
    func(stuff) 
    if not cond(): 
     break 
return (...) 

この方法です。

+1

私はあなたが最初の部分を削除することができると思います - 条件はまったく異なります。それ以外の場合、質問は意味をなさないでしょう。 –

+0

実際、条件は異なります...それを行うあなたの方法は、動作し、インデントの問題を解決することがありますが、私の意見では可読性を向上させることはありません – weidler

0

コードをリファクタリングすると、と多くの場合、は私が提案しようとしているよりも優れたアイデアですが、これはオプションです。

class GotoEnd(Exception): 
    pass 

def foo(bar): 

    try: 
    do(stuff) 
    if not condition: raise GotoEnd 
    do(stuff) 
    if not condition2: raise GotoEnd 

    do(stuff) 
    if not condition3: raise GotoEnd 

    ... 
    except GotoEnd: 
    pass 

    return (...) 
+0

良いアイデアしかし、例外が発生した場合、例えばdo(stuff)では無視され、 –

+0

良い点;私は 'finally'ではなく' else'をしたいと思うので、 'return'は他のキャッチされていない例外がなければ実行されますか? – chepner

+0

elseを指定すると、例外が発生した場合にリターンは実行されません。私は特定の例外( 'class GotoException(Exception):pass'など)を定義し、' raise GotoException() 'と' finally: 'または' else: 'を' GotoException:を除いて '' raise Exception'に置き換えます。 'pass'だけを含んでいます。そして、帰りは最後の行にとどまるだろう。 –

関連する問題