Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3714160
А
Аноним
09 октября 2026 16:02 · публичный вопрос
А
Аноним

апиши Python-декоратор @retry. Он должен повторять выполнение функции при возникновении указанных исключений. Поддерживай параметры: max_attempts (максимум попыток) и base_delay…

Запрос пользователя

Апиши Python-декоратор @retry. Он должен повторять выполнение функции при возникновении указанных исключений. Поддерживай параметры: max_attempts (максимум попыток) и base_delay (базовая задержка в секундах). Используй экспоненциальную задержку: base_delay * (2 ** attempt). Декоратор должен работать как с обычными функциями, так и с асинхронными (async def). Нельзя использовать сторонние библиотеки (только стандартная библиотека Python). Обязательно используй functools.wraps. При повторной попытке выводи в консоль сообщение ровно такого формата: Попытка {attempt} из {max_attempts}... Напиши только код, без объяснений.

Ответ нейросети

import asyncio import inspect import time from functools import wraps

def retry(exceptions, max_attempts=3, base_delay=1): if max_attempts < 1: raise ValueError("max_attempts должен быть не меньше 1")

def decorator(func):
    if inspect.iscoroutinefunction(func):
        @wraps(func)
        async def async_wrapper(*args, **kwargs):
            for attempt in range(max_attempts):
                try:
                    return await func(*args, **kwargs)
                except exceptions:
                    if attempt == max_attempts - 1:
                        raise

                    print(f"Попытка {attempt + 1} из {max_attempts}...")
                    await asyncio.sleep(base_delay * (2 ** attempt))

        return async_wrapper

    @wraps(func)
    def sync_wrapper(*args, **kwargs):
        for attempt in range(max_attempts):
            try:
                return func(*args, **kwargs)
            except exceptions:
                if attempt == max_attempts - 1:
                    raise

                print(f"Попытка {attempt + 1} из {max_attempts}...")
                time.sleep(base_delay * (2 ** attempt))

    return sync_wrapper

return decorator