Eu tenho um loop começando com for i in range(0, 100)
. Normalmente ele funciona corretamente, mas às vezes falha devido às condições da rede. Atualmente, eu o configurei para que, em caso de falha, esteja continue
na cláusula de exceção (continue para o próximo número de i
).
É possível reatribuir o mesmo número i
e executar novamente a iteração com falha do loop?
python
loops
exception
try-except
FurtiveFelon
fonte
fonte
range(100)
sem o primeiro parâmetro. Se você usa o Python 2.x, pode até usarxrange(100)
, isso gera um iterador e usa menos memória. (Não que isso importe com apenas 100 objetos.)Respostas:
Faça um
while True
loop for inside, coloque seutry
código dentro e quebre essewhile
loop somente quando o código for bem-sucedido.fonte
continue
repete owhile
loop, é claro, não ofor
(!), então nãoi
é o "próximo" nada - é exatamente o mesmo que era em uma parte anterior (com falha) do mesmo , é claro.while
Prefiro limitar o número de novas tentativas, para que, se houver um problema com esse item específico, você continuará no próximo, assim:
fonte
else:
cláusula menos conhecida defor
.else
cláusula dotry
faz isso "se for bem-sucedida e quebre" o que você está procurando.except
cláusula e lembre-se de usar 9 e não 10.O pacote de novas tentativas é uma ótima maneira de tentar novamente um bloco de código em caso de falha.
Por exemplo:
fonte
Aqui está uma solução semelhante a outras, mas irá gerar a exceção se não for bem-sucedida no número ou nas tentativas prescritas.
fonte
retries
é enganoso. Deveria muito sertries
.A abordagem mais "funcional" sem usar aqueles loops feios enquanto:
fonte
except: tryAgain(retries+1)
A maneira mais clara seria definir explicitamente
i
. Por exemplo:fonte
i += 1
logo depois# do stuff
.range
para esse tipo de coisa.Uma solução genérica com um tempo limite:
Uso:
fonte
except exception:
try … except
você pode usar umaif
declaração. Mas é menos pitônico.callback
função nunca é chamada. Eu esqueci o parêntese, substitua porcallback()
.Minha versão é semelhante a várias das opções acima, mas não usa um
while
loop separado e gera novamente a exceção mais recente se todas as novas tentativas falharem. Poderia ser definido explicitamenteerr = None
na parte superior, mas não estritamente necessário, pois ele só deve executar oelse
bloco final se houver um erro e, portanto,err
estiver definido.fonte
Há algo semelhante na Biblioteca do Decorador Python .
Lembre-se de que ele não testa exceções, mas o valor de retorno. Ele tenta novamente até que a função decorada retorne True.
Uma versão ligeiramente modificada deve fazer o truque.
fonte
Usando while e um contador:
fonte
Usando recursão
fonte
Você pode usar o pacote de novas tentativas do Python. Repetindo
Está escrito em Python para simplificar a tarefa de adicionar comportamento de repetição a praticamente qualquer coisa.
fonte
Alternativas para
retrying
:tenacity
ebackoff
(atualização de 2020)A tentar novamente biblioteca era anteriormente o caminho a percorrer, mas infelizmente tem alguns bugs e não tem nenhuma atualização desde 2016. Outras alternativas parecem ser de recuo e tenacidade . Durante o tempo em que escrevi isso, a tenacidade tinha mais estrelas no GItHub (2,3k vs 1,2k) e foi atualizada mais recentemente, portanto, escolhi usá-lo. Aqui está um exemplo:
O código acima gera algo como:
Mais configurações para o
tenacity.retry
estão listadas na página de tenacidade do GitHub .fonte
Se você deseja uma solução sem loops aninhados e invocando
break
com êxito, você pode desenvolver um empacotamento rápidoretriable
para qualquer iterável. Aqui está um exemplo de um problema de rede em que me deparo com freqüência - a autenticação salva expira. O uso dele seria assim:fonte
Eu uso o seguinte nos meus códigos,
fonte
fonte
Aqui está minha opinião sobre esse assunto. A seguinte
retry
função suporta os seguintes recursos:Uso:
Veja meu post para mais informações.
fonte
Aqui está minha idéia sobre como corrigir isso:
fonte
Recentemente, trabalhei com o meu python em uma solução para esse problema e estou feliz em compartilhá-lo com os visitantes do stackoverflow. Envie um feedback, se necessário.
fonte
incrementa sua variável de loop somente quando a cláusula try for bem-sucedida
fonte