Какая есть альтернатива этому коду?

while True:
    try:
        ...
        break
    except:
        continue

Есть ли более элегантное решение ?


Ответы (1 шт):

Автор решения: CrazyElf

Есть довольно старый пакет 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():
    # ваш код
→ Ссылка