Коллеги, помогите написать красиво кусочек кода. Обработка ситуации, когда ты заказал котировки с Финама, они не пришли, и ты пробуешь ещё раз. Сейчас я кривенько (чтобы описать задачу) написал так:
try:
txt=urlopen(url, timeout=20).readlines()
except timeout:
print ("Exception!\nWait...")
sleep (20)
try:
txt=urlopen(url, timeout=20).readlines()
except timeout:
print ("Exception!\nWait...")
sleep (20)
try:
txt=urlopen(url, timeout=20).readlines()
except timeout:
print ("Котировки с Финама не пришли")
Как это написать красиво внутри цикла?
10 попыток. Если 10-я неудачная, выводим сообщение
print ("Котировки с Финама не пришли")
try:
txt = urlopen(url, timeout=timeout).readlines()
except TimeoutError:
print(f«Retry {tries + 1} for {url}»)
if tries + 1 <= max_tries:
txt = get_data(url, timeout, tries + 1, max_tries)
else:
raise TimeoutError
return txt
Лучше делить программу на очень небольшие функции.
В Питоне цикл по range обычно признак криво написанной программы.
Создание флагов перед циклом тоже обычно антипатерн.
Захотите вы потом поменять время ожидания или количество попыток — вам прийдется читать код и менять в нескольких местах. У меня вы просто вызов функции с другими параметрами сделаете.
только вот вызывать рекурсивно функцию да еще много раз в exception не очень здорово
Инженер по контролю качества ПО наверняка придерется и не пропустит в продакшн
вызывать эту функцию так?
get_data(url, timeout=60, tries=0, max_tries=10)
tries = 0 — уточняю из-за неё потому что она тут глубоко участвует в рекурсии.
спасибо, работает.
Только с этой строчкой что то не то, я её заменил
print(f«Retry {tries + 1} for {url}»)
(правильные кавычки "" тоже ставил — безрезультатно)
pypi.org/project/retrying/ если хочется прям красиво сделать.
а так в цикле считать попытки и брейкать цикл при удаче.
сделать отдельно функцию запроса которая считывает данные и возвращает сами данные и флаг 1\0 — (есть ошибка получения данных/ нет ошибки)
выглядит на питоне так
for ...
data, err = LoadData(параметры запроса)
if err == 0:
break
else:
timeout ()