Выбор ответа Middle Декораторы спрашивают часто обновлено

Декоратор с параметрами: сколько уровней

Вопрос

Как устроен декоратор, который применяют как @retry(times=3)?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: retry(times) возвращает декоратор, а он возвращает обёртку. Выражение после @ сначала вычисляется: retry(times=3) должен вернуть настоящий декоратор, который потом получит функцию.

Варианты ответа

  1. Функция retry(func, times) принимает функцию и параметр сразу
  2. retry(times) возвращает декоратор, а он возвращает обёрткуправильный ответ
  3. Обёртка получает times через **kwargs при каждом вызове
  4. Нужно наследоваться от functools.Decorator и задать times

Разбор

Выражение после @ сначала вычисляется: retry(times=3) должен вернуть настоящий декоратор, который потом получит функцию. Поэтому уровней три: фабрика с параметрами, декоратор, обёртка. Сигнатура retry(func, times) не сработает с синтаксисом @retry(times=3). Класса functools.Decorator не существует, а передавать times при каждом вызове значило бы менять вызывающий код.

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

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