Ответ вслух Junior Декораторы спрашивают часто обновлено

Напишите и объясните декоратор

Вопрос

Напишите вслух декоратор, который логирует время выполнения функции, и объясните каждую строку.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Декоратор это функция timer(func), которая возвращает обёртку. Обёртку объявляю как def wrapper(args, kwargs), чтобы она принимала любые аргументы декорируемой функции.

Что должно прозвучать в ответе

  • Внешняя функция принимает `func`, возвращает обёртку

  • Обёртка принимает `*args, **kwargs` и передаёт их дальше

  • Возвращает результат `func`

  • `functools.wraps` сохраняет имя и docstring

  • Время через `time.perf_counter`, вывод в `finally` или после вызова

  • Код декоратора выполняется при определении, обёртки при каждом вызове

Что могут спросить следом

  • Как сделать, чтобы порог логирования задавался параметром?
  • Как задекорировать асинхронную функцию?
  • Как протестировать функцию без декоратора?

Разбор

Образцовый ответ: «Декоратор это функция timer(func), которая возвращает обёртку. Обёртку объявляю как def wrapper(*args, **kwargs), чтобы она принимала любые аргументы декорируемой функции. Внутри запоминаю start = time.perf_counter(), вызываю result = func(*args, **kwargs), считаю разницу, пишу в лог и обязательно возвращаю result, иначе функция начнёт возвращать None. Если хочу логировать время и при исключении, оборачиваю вызов в try/finally. Над обёрткой ставлю @functools.wraps(func), чтобы у результата остались имя, docstring и ссылка __wrapped__, иначе в логах все функции будут называться wrapper. Важно понимать время выполнения: тело timer работает один раз при импорте, когда Python выполняет def с @timer, а тело wrapper при каждом вызове. Если нужен параметр, например порог, добавляю ещё один уровень: timer(threshold) возвращает декоратор. Для async-функции обёртка должна быть async def и делать await func(...)».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.