Блог им. Albus
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 ("Котировки с Финама не пришли")Как это написать красиво внутри цикла?
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}»)
(правильные кавычки "" тоже ставил — безрезультатно)
не нужно одновременно и false и NULL использовать.
Можно просто done = NULL
исправить while
и убрать
if (data != NULL) {
done = TRUE
pypi.org/project/retrying/ если хочется прям красиво сделать.
а так в цикле считать попытки и брейкать цикл при удаче.
сделать отдельно функцию запроса которая считывает данные и возвращает сами данные и флаг 1\0 — (есть ошибка получения данных/ нет ошибки)
выглядит на питоне так
for ...
data, err = LoadData(параметры запроса)
if err == 0:
break
else:
timeout ()