Python でループを再試行する

Olorunfemi Akinlua 2023年6月21日
Python でループを再試行する

while または for ループは、コード ブロックを繰り返すのに最適で、既知または未知の回数のアクションを試行する必要がある場合によく使用します。 ただし、実行するはずのアクションが実行されなかったり、エラーが返されたりしたために、特異なループを再試行する必要がある場合があります。

このような状況は、ランダム化された、または特にネットワーク/リクエスト アクションで発生します。 通常、アクションは機能しますが、しばしば失敗する可能性があり、そこで retry デコレーターが役立ちます。

この記事では、そのような状況をどのように処理し、Python でループを再試行するかについて説明します。

@retry を使用して Python でループ アクションを再試行する

tenacity ライブラリの retry デコレーターを使用してループ アクションを再試行できます。詳細については、Python retry デコレーターのガイドを参照してください。

tenacity ライブラリをインストールするには、pip コマンドを使用できます。

pip install tenacity

ケース シナリオを紹介するために、特定の開始パラメータと終了パラメータ (ユーザー定義) に基づいてランダムに数値を生成する関数を作成します。 ただし、この generateRandomly 関数は、20 以下の数値のみを返します。

数値が 20 を超えると、ValueError が発生します。

import random

userStartInput = int(input("Enter Start Number: "))
userEndInput = int(input("Enter End Number: "))


def generateRandomly(start, end):
    generateNum = random.randint(start, end)
    if generateNum > 20:
        print("Tried")
        raise ValueError("Number generated isn't within range")
    else:
        return generateNum


for i in range(0, 20):
    print(generateRandomly(userStartInput, userEndInput))

コードの出力:

Enter Start Number: 12
Enter End Number: 50
Tried
Traceback (most recent call last):
  File "C:\Users\akinl\Documents\Python\SFTP\test.py", line 17, in <module>
    print(generateRandomly(userStartInput, userEndInput))
  File "C:\Users\akinl\Documents\Python\SFTP\test.py", line 11, in generateRandomly
    raise ValueError("Number generated isn't within range")
ValueError: Number generated isn't within range

ユーザー入力は 12 と 50 で、最初の乱数は 20 を超えていました。 そのため、ValueError が発生しました。 しかし、tenacity によって提供される retry デコレータを使用すると、20 以下の数値が得られるまで同じループを再試行できます。

import random
from tenacity import retry

userStartInput = int(input("Enter Start Number: "))
userEndInput = int(input("Enter End Number: "))


@retry
def generateRandomly(start, end):
    generateNum = random.randint(start, end)
    if generateNum > 20:
        print("Tried")
        raise ValueError("Number generated isn't within range")
    else:
        return generateNum


for i in range(0, 20):
    print(generateRandomly(userStartInput, userEndInput))

コードの出力:

Tried
Tried
Tried
13
Tried
15
Tried
Tried
Tried
Tried
Tried
Tried
Tried
Tried
15
Tried
Tried
Tried
Tried
Tried
16
20
18
Tried
16
Tried
Tried
Tried
18
19
Tried
Tried
Tried
14
Tried
20
Tried
Tried
Tried
19
Tried
Tried
Tried
15
13
14
Tried
12
Tried
Tried
Tried
Tried
Tried
Tried
20
Tried
15
19
Tried
20

print("Tried") を導入して、generateRandomly 関数が 20 以下の数値を返す前に何回再試行されたかを示します。Tried がないと、出力は次のようになります。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

関連記事 - Python Loop