2012-01-13 13 views
2

関数に複数のif文が含まれている場合は、1つの出口だけを残すことをお勧めします。 PHPのような言語では、do-while(false)を次のように使用できます。複数のif文がある場合、関数の出口を1つだけ保持する

function a() { 
    do { 
     if (...) break; 
     ... 
     if (...) break; 
     ... 
    } while (FALSE); 
    ... 
    return; 
} 

これはPythonでどのようにするのですか? while(true)を使用することはできますが、末尾の区切りが見つからない場合は、デッドループになります。

while True: 
    if ...: break 
    ... 
    if ...: break 
    ... 
    # oops, miss the 'break', you're dead 

これを行うにはもっとpythonicな方法がありますか?

PS:さらに1出口を説明する:

function a() { 
    if (...) { $a = 1; log($a); return $a; } 
    if (...) { $a = 2; log($a); return $a; } 
    if (...) { $a = 3; log($a); return $a; } 
} 

function a() { 
    do { 
     if (...) { $a = 1; break; } 
     if (...) { $a = 2; break; } 
     if (...) { $a = 3; break; } 
    } while (FALSE); 
    log($a); 
    return $a; 
} 

あなたは、試してみるとキャッチボールを行うことができます

+4

構築。 – yurib

+1

最初の例でwhileループが必要な理由がわかりません。あなたがif文を実行しなければ、あなたはifから出て戻ります。 – ezdazuzena

+0

もっと良い例を挙げる必要があります。なぜなら、複数の 'if'文を使うことができるように思えるからです。 – soulcheck

答えて

3

:私はあなたがdo..while(false)を使用することによって獲得しているのか理解していない

try: 
    if ...: return 
    ... 
    if ...: return 
    ... 
finally: 
    #Code to be executed on every return path (including exceptions) here 
+0

最終的に起こったことが最終的にクリーンアップ(ファイルのクローズ、dbトランザクションのコミットなど)である場合は、コンテキストマネージャと 'with'ステートメントを使用してください。 – PaulMcG

+0

私は最終的にそれが戻った後に実行されることに気づいていません。私は何の初心者ですか...これは私が探しているものです、ありがとう〜 –

-1

...あなたは違いを参照してください期待しています。戻り値をログに記録 - - 全体をラップすることです

http://docs.python.org/tutorial/errors.html

+0

私もそれについて考えました。しかし、例外を発生させるには高価ですか? –

+0

一度、私はこのようなことをしようとしました。グーグルリングの後、最終的な解決策はこれでした。より良いものが見つかった場合は、 – batbaatar

+0

@Jerryに聞かせてください。それは間違った質問です。あなたのユースケースにかかっています。ベンチマークは知る唯一の方法です。ただし、例外は例外的な場合です。そのようなフロー制御には使用しないでください。 –

1

あなたが言及した目標を達成するために、よりPython的な方法は:あなたはこのページを参照してください代わりにブレーク

の例外を発生させる必要がありますデコレータの機能たとえば、:

from functools import wraps 

def print_return(fn): 
    @wraps(fn) 
    def wrapped(*args, **kwargs): 
     return_value = fn(*args, **kwargs) 
     print return_value 
     return return_value 
    return wrapped 


@print_return 
def foo(a, b): 
    return a + b 
3

私は、あなたが探しているものを達成するための厄介な方法だと思います。なぜローカル変数を使用しないのですか?私はこの(Defining cleanup actionsを参照)のように記述しますPythonでこれを行うには

def f(x): 
    result = None 

    if (...): result = 1 
    elif (...): result = 2 
    elif (...): result = 3 
    else: result = 4 

    log(result) 
    return result 
+1

+1は 'elif'に対してですが、Pythonには' switch'文がありません。 – DzinX

+0

@DzinX:それは私が話していたものだった;) – ezdazuzena

+0

ファイルを短絡したい場合、たとえばファイルを見つけた場合、開いている場合は読み込みが成功した場合など、これは機能しません。代わりに多くのネストされたifを取得します。これは読みにくいです。 IMHO、試してみよう/最終的に行く方法です。 –

関連する問題