Выбор ответа Senior Декораторы обновлено

lru_cache на методе экземпляра

Вопрос

Чем опасен @functools.lru_cache на обычном методе класса?

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

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

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

Коротко

Правильный ответ: self попадает в ключи кеша и держит экземпляры в памяти. Декоратор применяется к функции в классе, поэтому кеш один на все экземпляры, а self входит в ключ.

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

  1. Он не работает с методами и бросает TypeError при вызове
  2. Кеш будет свой у каждого экземпляра и не даст выигрыша
  3. self попадает в ключи кеша и держит экземпляры в памятиправильный ответ
  4. Метод станет статическим и потеряет доступ к self

Разбор

Декоратор применяется к функции в классе, поэтому кеш один на все экземпляры, а self входит в ключ. Пока запись в кеше, объект не будет собран сборщиком мусора: утечка, особенно без maxsize. Варианты: functools.cached_property для вычисляемых атрибутов, кеш в атрибуте экземпляра или ключ по полям вместо self. Ошибки при этом нет, и self остаётся доступным.

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

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