Tengo un ciclo que comienza con for i in range(0, 100)
. Normalmente se ejecuta correctamente, pero a veces falla debido a las condiciones de la red. Actualmente lo tengo configurado para que en caso de falla, lo haga continue
en la cláusula except (continúe con el siguiente número i
).
¿Es posible para mí reasignar el mismo número i
y ejecutar nuevamente la iteración fallida del bucle?
python
loops
exception
try-except
FurtiveFelon
fuente
fuente
range(100)
sin el primer parámetro. Si usa Python 2.x, incluso podría usarloxrange(100)
, esto genera un iterador y usa menos memoria. (No es que importe solo con 100 objetos).Respuestas:
Haga un
while True
bucle for dentro, coloque sutry
código dentro y salte de esewhile
bucle solo cuando su código tenga éxito.fuente
continue
vuelve a intentar elwhile
bucle, por supuesto, no elfor
(!), pori
lo que no es "el siguiente" nada, es exactamente lo mismo que en una pierna anterior (fallida) de la mismawhile
, por supuesto.Prefiero limitar el número de reintentos, de modo que si hay un problema con ese elemento específico, eventualmente continuará con el siguiente, por lo tanto:
fuente
else:
cláusula menos conocidafor
.else
cláusula detry
esto hace que "si tiene éxito, se rompa" lo que está buscando.except
cláusula, y recuerde usar 9 y no 10.El paquete de reintentos es una buena manera de reintentar un bloque de código en caso de error.
Por ejemplo:
fuente
Aquí hay una solución similar a otras, pero generará la excepción si no tiene éxito en el número o los reintentos prescritos.
fuente
retries
es engañoso. Más bien debería serlotries
.El enfoque más "funcional" sin usar esos feos bucles while:
fuente
except: tryAgain(retries+1)
La forma más clara sería establecer explícitamente
i
. Por ejemplo:fuente
i += 1
justo después# do stuff
.range
para este tipo de cosas.Una solución genérica con un tiempo de espera:
Uso:
fuente
except exception:
try … except
puede usar unaif
declaración. Pero es menos pitónico.callback
función nunca se llama. He olvidado el paréntesis, reemplazar porcallback()
.Mi versión es similar a varias de las anteriores, pero no usa un
while
bucle separado y vuelve a generar la última excepción si fallan todos los reintentos. Podría establecerse explícitamenteerr = None
en la parte superior, pero no es estrictamente necesario, ya que solo debería ejecutar elelse
bloque final si hubo un error y, porerr
lo tanto, está configurado.fuente
Hay algo similar en el biblioteca Python Decorator .
Tenga en cuenta que no prueba las excepciones, sino el valor de retorno. Vuelve a intentarlo hasta que la función decorada devuelve True.
Una versión ligeramente modificada debería hacer el truco.
fuente
Usando while y un contador:
fuente
Usando recursividad
fuente
Puede usar el paquete de reintentos de Python. Reintentando
Está escrito en Python para simplificar la tarea de agregar un comportamiento de reintento a casi cualquier cosa.
fuente
Alternativas a
retrying
:tenacity
ybackoff
(actualización 2020)La biblioteca de reintentos era el camino a seguir anteriormente, pero lamentablemente tiene algunos errores y no ha recibido ninguna actualización desde 2016. Otras alternativas parecen ser retroceso y tenacidad . Durante el momento de escribir esto, la tenacidad tenía más estrellas GItHub (2.3k vs 1.2k) y se actualizó más recientemente, por lo tanto, elegí usarla. Aquí hay un ejemplo:
El código anterior genera algo como:
Más configuraciones para el
tenacity.retry
se enumeran en la página de tenacidad de GitHub .fuente
Si desea una solución sin bucles anidados e invocando
break
el éxito, puede desarrollar un ajuste rápidoretriable
para cualquier iterable. Aquí hay un ejemplo de un problema de red con el que me encuentro a menudo: la autenticación guardada caduca. El uso de este se leería así:fuente
Yo uso siguiente en mis códigos,
fuente
fuente
Aquí está mi opinión sobre este tema. La siguiente
retry
función admite las siguientes características:Uso:
Vea mi publicación para más información.
fuente
Aquí está mi idea sobre cómo solucionar esto:
fuente
Recientemente trabajé con mi python en una solución a este problema y estoy feliz de compartirlo con los visitantes de stackoverflow. Por favor, den su opinión si es necesario.
fuente
incremente su variable de bucle solo cuando la cláusula try tenga éxito
fuente