Python에서 루프 재시도

Olorunfemi Akinlua 2023년6월21일
Python에서 루프 재시도

while 또는 for 루프는 코드 블록을 반복하는 데 적합하며 알려진 또는 알려지지 않은 횟수 동안 작업을 시도해야 할 때 자주 사용합니다. 그러나 시도해야 하는 작업이 발생하지 않았거나 오류를 반환했기 때문에 단일 루프를 다시 시도해야 하는 상황이 있습니다.

이와 같은 상황은 무작위 또는 특히 네트워크/요청 작업에서 발생합니다. 일반적으로 작업은 작동하지만 종종 실패할 수 있으며 여기서 재시도 데코레이터가 유용할 수 있습니다.

이 기사에서는 이러한 상황을 처리하고 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