Mam pętlę zaczynającą się od for i in range(0, 100)
. Zwykle działa poprawnie, ale czasami zawodzi z powodu warunków sieciowych. Obecnie mam to ustawione tak, że w przypadku awarii będzie continue
w klauzuli wyjątku (przejdź do następnej liczby dla i
).
Czy mogę ponownie przypisać ten sam numer i
i ponownie przejść przez nieudaną iterację pętli?
python
loops
exception
try-except
FurtiveFelon
źródło
źródło
range(100)
bez pierwszego parametru. Jeśli używasz Python 2.x, którego możesz nawet użyćxrange(100)
, generuje iterator i zużywa mniej pamięci. (Nie chodzi o to, że liczy się tylko 100 obiektów.)Odpowiedzi:
Wykonaj
while True
wewnątrz pętli for, umieśćtry
kod w środku i zrywaj zwhile
pętli tylko wtedy, gdy kod się powiedzie.źródło
continue
ponawiawhile
pętla, oczywiście, niefor
, tak (!)i
jest nie „następny” coś - to jest dokładnie taki sam, jak to było na poprzedniej (nieudanej) noga samawhile
, oczywiście.Wolę ograniczyć liczbę ponownych prób, aby w przypadku problemu z tym konkretnym elementem ostatecznie przejść do następnego, a zatem:
źródło
else:
klauzulęfor
.else
klauzula tatry
robi to „jeśli się powiedzie, a następnie złam ”, którego szukasz.except
klauzuli i pamiętaj, aby użyć 9, a nie 10.Pakiet Ponowna próba jest to dobry sposób, aby ponowić próbę blok kodu na niepowodzenie.
Na przykład:
źródło
Oto rozwiązanie podobne do innych, ale podniesie wyjątek, jeśli nie powiedzie się w przepisanej liczbie lub próbach.
źródło
retries
wprowadza w błąd. Tak powinno byćtries
.Bardziej „funkcjonalne” podejście bez użycia tych brzydkich pętli while:
źródło
except: tryAgain(retries+1)
Najwyraźniejszym sposobem byłoby jawne ustawienie
i
. Na przykład:źródło
i += 1
zaraz po# do stuff
.range
do tego rodzaju rzeczy.Ogólne rozwiązanie z limitem czasu:
Stosowanie:
źródło
except exception:
try … except
możesz użyćif
instrukcji. Ale jest mniej pytoniczny.callback
funkcja nigdy nie jest wywoływana. Zapomniałem nawiasu, zastąp przezcallback()
.Moja wersja jest podobna do kilku powyższych, ale nie używa osobnej
while
pętli i ponownie podnosi ostatni wyjątek, jeśli wszystkie próby się nie powiodą. Można jawnie ustawićerr = None
na górze, ale nie jest to absolutnie konieczne, ponieważ powinien wykonać ostatnielse
blok tylko wtedy, gdy wystąpił błąd i dlategoerr
jest ustawiony.źródło
Jest coś podobnego w Python Decorator Library .
Pamiętaj, że nie testuje wyjątków, ale wartość zwracaną. Spróbuje, dopóki dekorowana funkcja nie zwróci True.
Lekko zmodyfikowana wersja powinna załatwić sprawę.
źródło
Korzystanie z rekurencji
źródło
Używanie while i licznika:
źródło
Możesz użyć pakietu ponownej próby w Pythonie. Ponowna próba
Jest napisany w Pythonie, aby uprościć zadanie dodawania zachowania ponownych prób do niemal wszystkiego.
źródło
Alternatywy dla
retrying
:tenacity
ibackoff
(aktualizacja 2020)Ponawianie biblioteka była poprzednio do zrobienia, ale niestety ma kilka błędów i nie ma żadnych nowości od 2016. Inne alternatywy wydają się być ograniczania i wytrzymałości . W czasie pisania tego upór miał więcej gwiazd GItHub (2,3k vs 1,2k) i został zaktualizowany niedawno, dlatego postanowiłem go użyć. Oto przykład:
Powyższy kod wyświetla coś takiego:
Więcej ustawień dla tych
tenacity.retry
można znaleźć na stronie GitHub poświęconej wytrzymałości .źródło
Jeśli chcesz rozwiązania bez zagnieżdżonych pętli i powoływania się
break
na sukces, możesz opracować szybkie opakowanieretriable
dla dowolnej iterowalnej. Oto przykład problemu z siecią, na który często wpadam - zapisane uwierzytelnianie wygasa. Jego użycie brzmiałoby następująco:źródło
Używam następujących w moich kodach,
źródło
źródło
Oto moje zdanie na ten temat. Następująca
retry
funkcja obsługuje następujące funkcje:Stosowanie:
Zobacz mój post, aby uzyskać więcej informacji.
źródło
Oto mój pomysł, jak to naprawić:
źródło
Niedawno pracowałem z moim pytonem nad rozwiązaniem tego problemu i chętnie podzielę się nim z gośćmi stosu przepływów. W razie potrzeby przekaż opinię.
źródło
zwiększaj zmienną pętli tylko wtedy, gdy klauzula try się powiedzie
źródło