Какая есть альтернатива этому коду?
while True:
try:
...
break
except:
continue
Есть ли более элегантное решение ?
Ответы (1 шт):
Есть довольно старый пакет retrying, много где он установлен по умолчанию, например, в Google Colab. Адаптированный под Python 3 пример из документации с использованием декоратора @retry:
import random
from retrying import retry
@retry
def do_something_unreliable():
if random.randint(0, 10) > 1:
raise IOError("Broken sauce, everything is hosed!!!111one")
else:
return "Awesome sauce!"
print(do_something_unreliable())
Наверняка этот декоратор внутри себя по сути делает тоже самое, что и ваш код, другое тут что-то сложно придумать. Там только есть ещё всякие настройки - можно настроить число повторных попыток, паузы между попытками и т.п. При использовании параметров по умолчанию этот декоратор в точности повторяет логику вашего кода. Т.е. вам нужно вынести код, который может бросить Exception, в отдельную функцию и задекорировать её декоратором @retry, остальное сделает декоратор. В таком виде код будет более красив и понятен, чем с лишними try/catch и "вечным циклом":
from retrying import retry
@retry
def func():
# ваш код