2017-02-20 7 views
1

この小さなブロックブロックは "if"ステートメントを含んでいます。これは大きなプロジェクトの小さなコードです。コードが実行されるとき、関数 "f"、 "g"、または "k"はNoneまたは数値データを返すことができます。 Noneの値が返されるときはいつでも、計算の残りの部分はスキップされなければなりません。なぜなら、数学的演算(それらの関数で起こる)は行えないからです。 TRY/CATCHメソッドを使用してコードを書き直そうとしましたが、動作させることができませんでした。私は "if"文を避け、簡潔な方法で書き直そうとしています。私は助けに感謝します。Python: "if"ステートメントを使わずに特定の条件が満たされたときにコードブロックをスキップします


def f(output): 
    #some code which computes output which be None or numerical 
    return [output*1,2] 
def g(Y): 
    #some code which computes Y which be None or numerical 
    return Y*3 
def k(output): 
    #some code which computes output which be None or numerical 
    return output*4 
def foutput(): 
    #some code which computes "value" which be None or numerical 
    value=2.0 
    return 1.0*value 


#####START 
#some code 
output=foutput() 

if output is not None: 
    print 'S1' 
    [output,A]=f(output) 
    if output is not None: 
     print 'S2' 
     [a,b,c,Y]=[1,2,3,k(output)] 
     if Y is not None: 
      print 'S3' 
      A=g(Y) 
     else: 
      [Q,A,output]=[None,None,None] 
    else: 
     [Q,A,output]=[None,None,None] 
else: 
    [Q,A,output]=[None,None,None] 
+0

try/exceptアプローチについては何が問題になりましたか? (あなたはf、g、kがNoneを返すのではなく例外をスローし、 '[Q、A、output] = [None、None、None]'をexceptブロックに入れていることを意味していると仮定します。) – KernelPanic

+0

'関数のシグネチャを標準化し、それらを単純にチェックインすることで次々に実行させることができますが、単純なtry/exceptは十分なはずです - 関数が特定の例外を発生させてから、 '非標準'の戻り値を捕捉するtry/exceptブロック(例えば、 'None'を返した関数のどれか) – zwer

答えて

1

各段階で引き上げられる誤差を決定し、その後、try..exceptにそれらの例外を追加します。このおもちゃの例では、それらはすべてTypeErrorだが、私はデモとしてValueErrorを追加します:

def f(output): 
    #some code which computes output which be None or numerical 
    return [output*1,2] 
def g(Y): 
    #some code which computes Y which be None or numerical 
    return Y*3 
def k(output): 
    #some code which computes output which be None or numerical 
    return output*4 
def foutput(): 
    #some code which computes "value" which be None or numerical 
    value=2.0 
    return 1.0*value 


output=foutput() 

try: 
    print 'S1' 
    output, A = f(output) 
    print 'S2' 
    a, b, c, Y = 1, 2, 3, k(output) 
    print 'S3' 
    A = g(Y) 
except (ValueError, TypeError): 
    Q = A = output = None 
else: 
    Q = 'success' # if none of this fails, you might want a default value for Q 
1

私は解決策を持っていると思う:if文はまだあり

def compute(): 
    if f() is not None: print 'S1' 
    else: return 
    if g() is not None: print 'S2' 
    else: return 
    if k() is not None: print 'S3' 
    else: return 

compute() 

、彼ら元のコードのように混乱してネストされることはありません。

これは、関数からのreturnを実行すると、残りの関数はスキップされ、その関数の計算が終了するという事実を利用しています。

関連する問題