-1
arg1
を入力として持ついくつかの関数(f
、g
、o
)があります。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
は例外を再発生させるので、私の問題は解決しません。
どうすればよいと思いますか?
よろしく、
この例では、エラーを出力して何も起こらなかったかのように続行しますが、正しいデザインですか?もしあなたがしているのは、エラー( 'stdout'ではなく' stderr'に行くべきでしょう)を印刷しているのであれば、なぜそれを全くトラップするのでしょうか? 'assert'を使うのがより適切でしょうか? – cdarke
あなたが解決しようとしている問題は何ですか? arg1を保持しておくと、例外が発生しますか? –
引数を持つデコレータはどうですか? – danihp