Как изменить декоратор, чтобы он работал с асинхронной функцией?

Обёртка должна стать async def и ожидать исходную функцию через await. Тогда код до и после await охватывает фактическое выполнение, а не только создание coroutine.

Короткий ответ

Что ответить на собеседовании

Обёртка должна стать async def и ожидать исходную функцию через await. Тогда код до и после await охватывает фактическое выполнение, а не только создание coroutine.

Подробный разбор

Ответ с пояснениями

Обёртка должна стать async def и ожидать исходную функцию через await. Тогда код до и после await охватывает фактическое выполнение, а не только создание coroutine.

from functools import wraps

def decorate(fn):
    @wraps(fn)
    async def wrapped(*args, **kwargs):
        return await fn(*args, **kwargs)
    return wrapped

Дополнительную завершающую логику помещайте в finally, не подавляя исключения и отмену. Для кеширующего декоратора нельзя сохранять уже использованный coroutine: кешируют итоговый результат либо отдельно управляют выполняющейся Task.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее