J'ai une boucle commençant par for i in range(0, 100)
. Normalement, il fonctionne correctement, mais parfois il échoue en raison des conditions du réseau. Actuellement, je l'ai configuré de manière à ce qu'en cas d'échec, il soit continue
dans la clause except (continuez jusqu'au numéro suivant pour i
).
Est-il possible pour moi de réaffecter le même numéro à i
et d'exécuter à nouveau l'itération ayant échoué de la boucle?
python
loops
exception
try-except
FurtiveFelon
la source
la source
range(100)
sans le premier paramètre. Si vous utilisez Python 2.x que vous pourriez même utiliserxrange(100)
, cela génère un itérateur et utilise moins de mémoire. (Pas que cela compte avec seulement 100 objets.)Réponses:
Faites une à l'
while True
intérieur de votre boucle for, mettez votretry
code à l'intérieur et ne vous séparez de cettewhile
boucle que lorsque votre code réussit.la source
continue
réessaye lawhile
boucle, bien sûr, pas lefor
(!), donc cei
n'est pas "le prochain" quoi que ce soit - c'est exactement la même chose que c'était sur une jambe précédente (échouée) de la même chosewhile
, bien sûr.Je préfère limiter le nombre de tentatives, de sorte qu'en cas de problème avec cet élément spécifique, vous finirez par passer au suivant, ainsi:
la source
else:
clause la moins connue defor
.else
clause dutry
fait ceci "en cas de succès, alors cassez" que vous recherchez.except
clause, et n'oubliez pas d'utiliser 9 et non 10.Le package de nouvelle tentative est un bon moyen de réessayer un bloc de code en cas d'échec.
Par exemple:
la source
Voici une solution similaire aux autres, mais elle lèvera l'exception si elle ne réussit pas dans le nombre prescrit ou réessaye.
la source
retries
est trompeur. Cela devrait plutôt l'êtretries
.L'approche la plus "fonctionnelle" sans utiliser les boucles while laides:
la source
except: tryAgain(retries+1)
Le moyen le plus clair serait de définir explicitement
i
. Par exemple:la source
i += 1
juste après# do stuff
.range
pour ce genre de choses.Une solution générique avec un timeout:
Usage:
la source
except exception:
try … except
vous pouvez utiliser uneif
instruction. Mais c'est moins pythonique.callback
fonction n'est jamais appelée. J'ai oublié la parenthèse, remplacez parcallback()
.Ma version est similaire à plusieurs des précédentes, mais n'utilise pas de
while
boucle distincte et relance la dernière exception si toutes les tentatives échouent. Pourrait être explicitement définierr = None
en haut, mais pas strictement nécessaire car il ne devrait exécuter leelse
bloc final qu'en cas d'erreur eterr
est donc défini.la source
Il y a quelque chose de similaire dans la bibliothèque Python Decorator .
Veuillez garder à l'esprit qu'il ne teste pas les exceptions, mais la valeur de retour. Il réessaie jusqu'à ce que la fonction décorée renvoie True.
Une version légèrement modifiée devrait faire l'affaire.
la source
Utilisation de while et d'un compteur:
la source
Utiliser la récursivité
la source
Vous pouvez utiliser le package de nouvelle tentative Python. Nouvelle tentative
Il est écrit en Python pour simplifier la tâche d'ajouter un comportement de nouvelle tentative à peu près n'importe quoi.
la source
Alternatives à
retrying
:tenacity
etbackoff
(mise à jour 2020)La bibliothèque de nouvelles tentatives était auparavant la voie à suivre, mais malheureusement, elle a quelques bugs et n'a pas eu de mises à jour depuis 2016. D'autres alternatives semblent être le backoff et la ténacité . Au moment d'écrire ces lignes, la ténacité avait plus d'étoiles GItHub (2,3k contre 1,2k) et a été mise à jour plus récemment, c'est pourquoi j'ai choisi de l'utiliser. Voici un exemple:
Le code ci-dessus génère quelque chose comme:
Plus de paramètres pour le
tenacity.retry
sont répertoriés sur la page GitHub de ténacité .la source
Si vous voulez une solution sans boucles imbriquées et invoquant
break
le succès, vous pouvez développer un habillage rapideretriable
pour tout itérable. Voici un exemple d'un problème de réseau que je rencontre souvent - l'authentification enregistrée expire. Son utilisation se lirait comme suit:la source
J'utilise le suivant dans mes codes,
la source
la source
Voici mon point de vue sur cette question. La
retry
fonction suivante prend en charge les fonctionnalités suivantes:Usage:
Voir mon article pour plus d'informations.
la source
Voici mon idée sur la façon de résoudre ce problème:
la source
J'ai récemment travaillé avec mon python sur une solution à ce problème et je suis heureux de la partager avec les visiteurs de stackoverflow, veuillez donner vos commentaires si cela est nécessaire.
la source
incrémentez votre variable de boucle uniquement lorsque la clause try réussit
la source