Saya memiliki loop dimulai dengan for i in range(0, 100)
. Biasanya berjalan dengan benar, tetapi kadang-kadang gagal karena kondisi jaringan. Saat ini saya telah mengaturnya sehingga pada kegagalan, itu akan continue
di dalam klausa kecuali (melanjutkan ke nomor berikutnya untuk i
).
Apakah mungkin bagi saya untuk menetapkan kembali nomor yang sama i
dan menjalankan iterasi loop yang gagal lagi?
python
loops
exception
try-except
FurtiveFelon
sumber
sumber
range(100)
tanpa parameter pertama. Jika Anda menggunakan Python 2.x yang bahkan bisa Anda gunakanxrange(100)
, ini menghasilkan iterator dan menggunakan lebih sedikit memori. (Bukan berarti itu penting hanya dengan 100 objek.)Jawaban:
Lakukan
while True
di dalam untuk loop Anda, masukkantry
kode Anda di dalam, dan istirahat dariwhile
loop itu hanya ketika kode Anda berhasil.sumber
continue
retries yangwhile
lingkaran, tentu saja, tidak yangfor
, jadi (!)i
yang tidak "berikutnya" apa pun - itu persis sama seperti itu pada (gagal) leg sebelumnya samawhile
, tentu saja.Saya lebih suka membatasi jumlah percobaan ulang, sehingga jika ada masalah dengan item tertentu Anda akhirnya akan melanjutkan ke yang berikutnya, dengan demikian:
sumber
else:
klausa yang kurang dikenalfor
.else
klausatry
melakukan ini "jika berhasil, maka istirahat" yang Anda cari.except
klausa, dan ingatlah untuk menggunakan 9 dan bukan 10.The paket Mencoba lagi adalah cara yang bagus untuk mencoba kembali blok kode pada kegagalan.
Sebagai contoh:
sumber
Berikut adalah solusi yang mirip dengan yang lain, tetapi akan memunculkan pengecualian jika tidak berhasil dalam jumlah yang ditentukan atau coba lagi.
sumber
retries
menyesatkan. Seharusnya lebih baiktries
.Pendekatan yang lebih "fungsional" tanpa menggunakan loop jelek tersebut:
sumber
except: tryAgain(retries+1)
Cara yang paling jelas adalah dengan mengatur secara eksplisit
i
. Sebagai contoh:sumber
i += 1
setelah# do stuff
.range
untuk hal-hal semacam ini.Solusi umum dengan batas waktu:
Pemakaian:
sumber
except exception:
try … except
Anda bisa menggunakanif
pernyataan. Tapi itu kurang pythonic.callback
fungsinya tidak pernah dipanggil. Saya lupa tanda kurung, ganti dengancallback()
.Versi saya mirip dengan beberapa di atas, tetapi tidak menggunakan
while
loop terpisah , dan memunculkan kembali pengecualian terbaru jika semua coba lagi gagal. Dapat secara eksplisit diaturerr = None
di bagian atas, tetapi tidak sepenuhnya diperlukan karena seharusnya hanya menjalankanelse
blok terakhir jika ada kesalahan dan karenanyaerr
diatur.sumber
Ada sesuatu yang serupa di Perpustakaan dekorator Python .
Harap diingat bahwa itu tidak menguji pengecualian, tetapi nilai pengembalian. Itu coba lagi sampai fungsi yang dihiasi mengembalikan True.
Versi yang sedikit dimodifikasi harus melakukan trik.
sumber
Menggunakan saat dan penghitung:
sumber
Menggunakan rekursi
sumber
Anda bisa menggunakan paket percobaan Python. Coba lagi
Ini ditulis dengan Python untuk menyederhanakan tugas menambahkan perilaku coba lagi untuk apa saja.
sumber
Alternatif untuk
retrying
:tenacity
danbackoff
(pembaruan 2020)The mencoba kembali perpustakaan sebelumnya cara untuk pergi, tapi sayangnya memiliki beberapa bug dan belum mendapatkan update sejak 2016. alternatif lain tampaknya backoff dan keuletan . Selama penulisan ini, keuletan memiliki lebih banyak bintang GItHub (2.3k vs 1.2k) dan diperbarui baru-baru ini, oleh karena itu saya memilih untuk menggunakannya. Berikut ini sebuah contoh:
Kode di atas menghasilkan sesuatu seperti:
Lebih banyak pengaturan untuk
tenacity.retry
terdaftar di halaman GitHub tenacity .sumber
Jika Anda menginginkan solusi tanpa loop bersarang dan menjalankan
break
kesuksesan, Anda dapat mengembangkan bungkus cepatretriable
untuk setiap iterable. Berikut adalah contoh masalah jaringan yang sering saya temui - otentikasi yang disimpan kedaluwarsa. Penggunaannya akan berbunyi seperti ini:sumber
Saya menggunakan mengikuti kode saya,
sumber
sumber
Inilah pendapat saya tentang masalah ini. Fungsi berikut
retry
mendukung fitur-fitur berikut:Pemakaian:
Lihat posting saya untuk info lebih lanjut.
sumber
Inilah ide saya tentang cara memperbaikinya:
sumber
Saya baru-baru ini bekerja dengan python saya pada solusi untuk masalah ini dan saya senang untuk membagikannya dengan pengunjung stackoverflow tolong beri umpan balik jika diperlukan.
sumber
Tambahkan variabel loop Anda hanya ketika klausa coba berhasil
sumber