Храните результаты в словаре по ключу из аргументов и используйте wraps для сохранения метаданных функции. Простой вариант требует хешируемых аргументов и подходит для чистых синхронных функций.
Декоратор‑обёртка с кешированием результатов функции
Храните результаты в словаре по ключу из аргументов и используйте wraps для сохранения метаданных функции. Простой вариант требует хешируемых аргументов и подходит для чистых синхронных функций.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте декоратор, который сохраняет результат выполнения функции и при последующих вызовах с теми же входными параметрами возвращает сохранённое значение вместо нового вычисления.
Ответ
Храните результаты в словаре по ключу из аргументов и используйте wraps для сохранения метаданных функции. Простой вариант требует хешируемых аргументов и подходит для чистых синхронных функций.
Минимальный декоратор сохраняет порядок именованных аргументов:
from functools import wraps
def memoize(func):
cache = {}
@wraps(func)
def wrapper(*args, **kwargs):
key = (args, tuple(kwargs.items()))
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
return wrapper
Разные формы вызова с одинаковым смыслом могут иметь разные ключи. Исключения не кешируются. Результат возвращается тем же объектом, поэтому изменяемые результаты опасны. В рабочей системе ограничивают размер кеша и срок жизни; одновременные вызовы могут повторить вычисление. Для async-функции этот вариант кешировал бы корутину, что неправильно.