Обёртка должна стать 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.