Тех собес на middle-senior Python Developer в ****

Доступно с премиум-подпиской

Оформите премиум-подписку, чтобы получить доступ к:

  • Фильтрации по компаниям
  • Названиям компаний в интервью
  • Видеозаписям собеседований в категории Python Developer

Посмотреть видео в категории

(2025-05-09)

— Задача: Создайте декоратор retry, который повторяет выполнение функции заданное количество раз, если она завершилась с ошибкой.
Если все попытки неудачны, декоратор должен вернуть сообщение об ошибке или выбросить исключение.

— Условия:
1. Декоратор принимает два аргумента: количество попыток retries; время ожидания между попытками delay (в секундах).
2. Декорируемая функция может принимать любые аргументы и возвращать результат или выбрасывать исключение.
3. Декоратор должен перехватывать исключения и повторять выполнение функции, если она завершилась с ошибкой.

Ожидаемый вывод (зависит от времени выполнения, поскольку ошибка случайная) для retries=5, delay=2:


Попытка 1 не удалась: Случайная ошибка. Повтор через 2 секунд.

Попытка 2 не удалась: Случайная ошибка. Повтор через 2 секунд.

Попытка 3 не удалась: Случайная ошибка. Повтор через 2 секунд.

Попытка 4 не удалась: Случайная ошибка. Повтор через 2 секунд.

Успех!


TypeError: retry..my_decorator..wrapper() missing 1 required positional argument: 'func'

========================================================================================================
import time
from functools import wraps


# Мое решение
def retry(delay: int, retries: int):
    def my_decorator(func):
        @wraps(func)
        def wrapper(args, *kwargs):
            for attempt in range(1, retries+1):
                try:
                    result = func(args, *kwargs)
                except Exception as e:
                    print(f"Попытка {attempt} не удалась: {e}. Повтор через {delay} секунд.")
                    time.sleep(delay)
                else:
                    return result
        return wrapper
    return my_decorator
    
# Код для проверки
@retry(retries=5, delay=2)
def unstable_function():
    if time.time() % 2 > 1.5:
        raise ValueError("Случайная ошибка")
    return "Успех!"
print(unstable_function())

# Их решение
def retry(retries=3, delay=1):
    def decorator(func):
        def wrapper(args, *kwargs):
            attempts = 0
            while attempts < retries:
                try:
                    return func(args, *kwargs)
                except Exception as e:
                    attempts += 1
                    print(f"Попытка {attempts} не удалась: {e}. Повтор через {delay} секунд.")
                    time.sleep(delay)
            print(f"Функция {func.name} завершилась неудачно после {retries} попыток.")
            return None
        return wrapper
    return decorator