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

lru_cache и нехешируемые аргументы

Вопрос

Что будет при вызове total([1, 2, 3]), если total декорирована @functools.lru_cache?

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

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

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

Коротко

Правильный ответ: TypeError: unhashable type: 'list'. lrucache строит ключ кеша из аргументов и хеширует его, а список не хешируем, поэтому вызов падает с TypeError ещё до выполнения функции.

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

  1. TypeError: unhashable type: 'list'правильный ответ
  2. Результат посчитается и закешируется по id списка
  3. Кеш будет пропущен, функция просто выполнится
  4. Список автоматически превратится в кортеж

Разбор

lru_cache строит ключ кеша из аргументов и хеширует его, а список не хешируем, поэтому вызов падает с TypeError ещё до выполнения функции. Кешировать по id было бы опасно (список могут изменить), и библиотека этого не делает, конвертации в кортеж тоже нет. Решение: передавать кортеж или замороженные данные.

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

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