Day 153再試行付きの処理をデコレータで作る
Pythonコード
1def retry(max_attempts=3):2 def decorator(func):3 def wrapper(*args, **kwargs):4 attempts = 05 while attempts < max_attempts:6 try:7 return func(*args, **kwargs)8 except Exception as e:9 attempts += 110 print(f'再試行{attempts}回目: {e}')11 print('最大再試行回数に達しました')12 return wrapper13 return decorator14 15@retry(max_attempts=5)16def divide(a, b):17 return a / b18 19try:20 num1 = float(input('数字を入力してください: '))21 num2 = float(input('もう一つ数字を入力してください: '))22 result = divide(num1, num2)23 print(f'{num1} / {num2} = {result}')24except ValueError:25 print('数値以外の入力です')26except ZeroDivisionError:27 print('0で割ることはできません')
解説
- 行1〜3: 再試行機能を持つデコレータ関数「retry」を定義します。デコレータは、他の関数を修飾する関数です。ここでは、最大再試行回数を指定できます。組み込み関数「def」は、関数を定義するために使用します。
- 行4〜6: デコレータ「retry」の中で、実際に関数を包む「wrapper」関数を定義します。この関数内で、指定された関数を最大再試行回数まで実行し続けます。組み込み関数「while」は、条件が満たされる間繰り返し実行します。
- 行7〜12: 「wrapper」関数内で、try-exceptブロックを使用して、指定された関数の実行を試みます。成功すれば結果を返し、失敗すれば再試行します。組み込み関数「try」は、例外が発生する可能性のあるコードブロックを定義します。
- 行13〜14: 最大再試行回数に達した場合、メッセージを表示します。組み込み関数「print」は、画面に文字や値を表示するために使用します。
- 行15〜17: 「divide」関数を定義し、デコレータ「retry」を適用します。この関数は、2つの数値の割り算を実行します。組み込み関数「return」は、関数の実行結果を返します。
- 行19〜25: ユーザーから2つの数値を入力として受け取り、デコレートされた「divide」関数を使用して割り算を実行し、結果を表示します。入力が数値以外の場合、エラーを処理します。組み込み関数「input」は、ユーザーからの入力を受け取ります。
- 行26〜27: 補足: 0で割ることはできません。組み込み関数「except」は、例外が発生した場合に実行されるコードブロックを定義します。
- 行10〜27: 補足: print() は画面に文字や値を表示する関数です。
次に試してみよう
- 再試行回数を変化させて、挙動を確認してみましょう
- 異なる関数にデコレータを適用して、再利用性を確認してみましょう
- try-exceptブロックで捕捉する例外の種類を変更して、挙動を確認してみましょう