2017-12-27 25 views
-1

arg1を入力として持ついくつかの関数(fgo)があります。pythonでtry/exceptを繰り返さないようにする

arg1は必須と異なる位置に配置さpositif、次のとおりです。私は例外を発生させるnegatif場合arg1

def f(a, b, arg1): 
    print(arg1) 

def g(c, arg1): 
    print(arg1) 

def o(arg1, d, 2): 
    print(arg1) 

は次のとおりです。

def is_positif(a): 
    if a < 0: 
     raise ValueError('arg1 should be positif) 

すべての機能上のtry/except文を繰り返し避けるために:

def f(a, b, arg1): 
    try: 
     is_positif(arg1) 
     print(arg1) 
    except ValueError as err: 
     print(err) 

私はデコレータを作成するという考えを調べました。

from functools import wraps 

def valid_arg(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     try: 
      is_positif(kwargs['arg1']) 
      func(*args, **kwargs) 
     except ValueError as err: 
      print(err) 
    return wrapper 

def is_positif(x): 
    if x < 0: 
     raise ValueError("arg1 should be positif") 

@valid_arg 
def f(a, b, arg1): 
    print(arg1) 

if __name__ == '__main__': 
    f(1, 2, arg1=3) 

しかし、この解決策は、キーワード引数(arg1=3)としてarg1を使用するために私を強制してoverkillingようです。

私はcontextmanagerの使用で以前の投稿でいくつかの反応に気付きました。

しかし、私が読んだもののcontextmanagerは例外を再発生させるので、私の問題は解決しません。

どうすればよいと思いますか?

よろしく、

+0

この例では、エラーを出力して何も起こらなかったかのように続行しますが、正しいデザインですか?もしあなたがしているのは、エラー( 'stdout'ではなく' stderr'に行くべきでしょう)を印刷しているのであれば、なぜそれを全くトラップするのでしょうか? 'assert'を使うのがより適切でしょうか? – cdarke

+1

あなたが解決しようとしている問題は何ですか? arg1を保持しておくと、例外が発生しますか? –

+0

引数を持つデコレータはどうですか? – danihp

答えて

1

あなただけの単一のtry-catchにあなたの「有用な」コードをラップし、それに便利なエラーメッセージを印刷することができ、すべての機能上の文を除いて試して/繰り返しを避けるために。また、ケースのカスタム例外を作成することもできます。

# Your custom exception 
class NegativeArg1(Exception): 
    pass 

# Your checker 
def check_positive(arg1): 
    if val < 0: 
     raise NegativeArg1("Your arg1 is negative!") 

# Your calculation function 
def f1(a, b, arg1): 
    check_positive(arg1) 
    # make calculations... 
    c = a + b 
    return c 

# Your other calculation function 
def f2(a, b, arg1, d, e): 
    check_positive(arg1) 
    # make calculations... 
    c = a + b - d - e 
    return c 

# Your main code block: 
if __name__ == '__main__': 
    try:   
     r1 = f1(1, 2, arg1=3) 
     r2 = f2(1, 2, arg1=-5, 6, 7) 

    except NegativeArg1 as n: 
     print("Oh on! You've speecified negative arg1 somethere!") 
    except Exception as e: 
     print("Some other exception has happened:" + str(e)) 
関連する問題