Retry in recursion
Добрый день, уважаемое сообщество.
Решил поделиться с Вами своим "велосипедным" открытием и, в то же время, уточнить, насколько это безопасно, логично и рационаьно.
Суть задачи: имеется цикл, в теле которого происходит какой-либо запрос (пусть будет сетевой), который имеет свойство прерываться в связи с нестабильным соединением. Задача состоит в том, чтобы не прерывая исполнения кода, выполнить любое возможное количество повторных запросов, пока один из них не будет успешным.
Стандартное решение: обычно организуется вложенный цикл, в котором проверяется состояние, либо отлавливаются исключения и в соответствии с результатом запрос зацикливается, либо продолжается нормальное исполнение кода.
Моё решение: вместо организации вложенного цикла, определяется функция, в которой происходит запрос и в ней же проверяется состояние этого запроса. Если состояние неудовлетворительное - функция вызывается рекурсивно.
Пример:
def retrieve(something):
data = get_data(something)
if not data:
data = retrieve(something)
return data
Любой контроль можно добавить, как и в случае с вложенным циклом.
Однако, возвращаясь к моему вопросу, покритикуйте, плох ли этот метод и чем он хуже обычного цикла?
Решил поделиться с Вами своим "велосипедным" открытием и, в то же время, уточнить, насколько это безопасно, логично и рационаьно.
Суть задачи: имеется цикл, в теле которого происходит какой-либо запрос (пусть будет сетевой), который имеет свойство прерываться в связи с нестабильным соединением. Задача состоит в том, чтобы не прерывая исполнения кода, выполнить любое возможное количество повторных запросов, пока один из них не будет успешным.
Стандартное решение: обычно организуется вложенный цикл, в котором проверяется состояние, либо отлавливаются исключения и в соответствии с результатом запрос зацикливается, либо продолжается нормальное исполнение кода.
Моё решение: вместо организации вложенного цикла, определяется функция, в которой происходит запрос и в ней же проверяется состояние этого запроса. Если состояние неудовлетворительное - функция вызывается рекурсивно.
Пример:
def retrieve(something):
data = get_data(something)
if not data:
data = retrieve(something)
return data
Любой контроль можно добавить, как и в случае с вложенным циклом.
Однако, возвращаясь к моему вопросу, покритикуйте, плох ли этот метод и чем он хуже обычного цикла?
