Кортеж хешируем только тогда, когда хешируемы все его элементы. Словарь внутри делает такой кортеж непригодным ключом; у произвольной декорируемой функции нет гарантии отсутствия dict в аргументах.
Почему нельзя использовать словарь, находящийся внутри кортежа, в качестве ключа словаря? Есть ли гарантия, что в аргументы декорируемой функции не передадут словарь?
Кортеж хешируем только тогда, когда хешируемы все его элементы. Словарь внутри делает такой кортеж непригодным ключом; у произвольной декорируемой функции нет гарантии отсутствия dict в аргументах.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Кортеж хешируем только тогда, когда хешируемы все его элементы. Словарь внутри делает такой кортеж непригодным ключом; у произвольной декорируемой функции нет гарантии отсутствия dict в аргументах.
Простой ключ кеша (args, kwargs) не работает: kwargs сам словарь, а args может содержать списки и другие нехешируемые объекты. Нужно определить контракт допустимых аргументов или явную функцию построения ключа. Рекурсивное «замораживание» требует правил для типов, порядка, циклов и изменяемости. Нельзя бездумно заменять всё на str: разные значения могут получить неоднозначное представление.