2017-09-29 5 views
1

このタイプのコードロジックを処理するには、Pythonのベスト/イディオムの方法についてお聞きしたいと思います。一連の関数チェックを処理するためのPythonのベスト/イディオムの方法

list_a = [] 

def func_a(): 
    if some check not pass 
    return False 

    # check pass 
    add some stuff to list_a and return True 

def func_b(): 
    if some check not pass 
    return False 

    # check pass 
    add some stuff to list_a and return True 

def func_c(): 
    if some check not pass 
    return False 

    # check pass 
    add some stuff to list_a and return True 

def apply_function(): 
    if fun_a(): 
    return list_a 
    if fun_b(): 
    return list_a 
    if fun_c(): 
    return list_a 
    ... 

    return list_a #empty list 

が10の以上の機能があるapply_function()に確認する必要がある場合は、処理するために、任意のより良い方法はありますか?

これは多分any()は、このような状況で使用することができない私

If funcA() or funcB() or funcC(): 
    return list_a 

return list_a 

のために働きますか?

ありがとうございました。

+0

これは外側の範囲外のリストなので、 'list_a'に要素を追加するのは面倒です。これは状態の概念を導入します。 –

答えて

2

グローバルを変更しないでください。あなたの関数をに返すか、チェックが失敗した場合は例外を発生させるか、リストをにしてください。そうすれば、関数の結果を返すことができます。例外が発生した場合は、次の関数に進みます。

def func_a(): 
    if some check not pass 
     raise ValueError('....') 

    # check pass 
    return [some, list] 

# further functions that apply the same pattern. 

def apply_function(): 
    for f in (func_a, func_b, func_c): 
     try: 
      return f() 
     except ValueError: 
      # check didn't pass, continue on to the next 
      pass 

例外は、関数がそうする条件が満たされていないため、それは結果を返すことができないことを発信者を語っている、チェックが失敗したことを知らせるために、ここでの理想的な方法です。例外が発生しなければ、戻り値が正しいと信頼できます。

関数は単なるオブジェクトであることに注意してください。名前を指定すると、関数をシーケンスに入れて繰り返し処理することができます。いくつかのレジスタを使用して、関数を追加してグローバルリストを試すこともできます。

+0

ありがとうございます。プログラムはもともと網羅的なすべてのケースを対象としていましたが、func_bはfunc_aよりも緩やかにチェックし、異なるケースをチェックします。 –

関連する問題