Выбор ответа Middle Декораторы обновлено
lru_cache и нехешируемые аргументы
Вопрос
Что будет при вызове total([1, 2, 3]), если total декорирована @functools.lru_cache?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: TypeError: unhashable type: 'list'. lrucache строит ключ кеша из аргументов и хеширует его, а список не хешируем, поэтому вызов падает с TypeError ещё до выполнения функции.
Варианты ответа
TypeError: unhashable type: 'list'правильный ответ- Результат посчитается и закешируется по
idсписка - Кеш будет пропущен, функция просто выполнится
- Список автоматически превратится в кортеж
Разбор
lru_cache строит ключ кеша из аргументов и хеширует его, а список не хешируем, поэтому вызов падает с TypeError ещё до выполнения функции. Кешировать по id было бы опасно (список могут изменить), и библиотека этого не делает, конвертации в кортеж тоже нет. Решение: передавать кортеж или замороженные данные.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.