Reintentar un bucle en Python

Olorunfemi Akinlua 21 junio 2023
Reintentar un bucle en Python

Los bucles while o for son excelentes para repetir bloques de código, y a menudo los usamos cuando necesitamos intentar una acción por un número conocido o desconocido de veces. Sin embargo, hay situaciones en las que es posible que necesitemos volver a intentar un bucle singular porque la acción que se suponía que debía intentar no sucedió o devolvió un error.

Situaciones como esta ocurren con acciones aleatorias o, más especialmente, de red/solicitud. Por lo general, las acciones funcionan, pero a menudo pueden fallar, y ahí es donde los decoradores de “reintentar” pueden ser útiles.

Este artículo discutirá cómo manejaremos tales situaciones y volveremos a intentar un ciclo en Python.

Use @retry para volver a intentar una acción de bucle en Python

Podemos usar el decorador reintentar de la biblioteca tenacity para volver a intentar una acción de bucle, y puede obtener más información al respecto en la guía sobre los decoradores reintentar de Python.

Para instalar la biblioteca tenacity, podemos usar el comando pip:

pip install tenacity

Para mostrar un escenario de caso, crearemos una función que genere números aleatoriamente en función de un parámetro de inicio y finalización dado (que será definido por el usuario). Sin embargo, esta función generateRandomly solo devolverá un número cuando sea menor o igual a veinte (20).

Si el número es superior a 20, genera un 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))

La salida del código:

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

Las entradas del usuario son 12 y 50, y el primer número aleatorio estaba por encima de 20; por lo tanto, generó un ValueError. Sin embargo, usando el decorador de reintentar proporcionado por tenacity, podemos volver a intentar el mismo bucle hasta que nos dé un número menor o igual a 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))

La salida del código:

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

Introdujimos print("Probado") para mostrarle cuántas veces se reintentó la función generar aleatoriamente antes de dar un número menor o igual a 20. Sin Probado, el resultado se parece más a esto.

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

Artículo relacionado - Python Loop