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 continueen la cláusula except (continúe con el siguiente número i).
¿Es posible para mí reasignar el mismo número iy 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 Truebucle for dentro, coloque sutrycódigo dentro y salte de esewhilebucle solo cuando su código tenga éxito.fuente
continuevuelve a intentar elwhilebucle, por supuesto, no elfor(!), porilo 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.elsecláusula detryesto hace que "si tiene éxito, se rompa" lo que está buscando.exceptclá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
retrieses 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 += 1justo después# do stuff.rangepara este tipo de cosas.Una solución genérica con un tiempo de espera:
Uso:
fuente
except exception:try … exceptpuede usar unaifdeclaración. Pero es menos pitónico.callbackfunció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
whilebucle separado y vuelve a generar la última excepción si fallan todos los reintentos. Podría establecerse explícitamenteerr = Noneen la parte superior, pero no es estrictamente necesario, ya que solo debería ejecutar elelsebloque final si hubo un error y, porerrlo 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:tenacityybackoff(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.retryse enumeran en la página de tenacidad de GitHub .fuente
Si desea una solución sin bucles anidados e invocando
breakel éxito, puede desarrollar un ajuste rápidoretriablepara 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
retryfunció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