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 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