Декоратор хранит результаты в словаре по ключу из аргументов. При повторном ключе возвращается кеш, при новом — выполняется функция. Такой вариант подходит для чистых синхронных функций.
Декоратор, сохраняющий результаты вызова функции
Декоратор хранит результаты в словаре по ключу из аргументов. При повторном ключе возвращается кеш, при новом — выполняется функция. Такой вариант подходит для чистых синхронных функций.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создать декоратор, который будет сохранять (кешировать) возвращаемое значение функции, чтобы при повторных вызовах с теми же аргументами не выполнять её заново.
@cached
def slow_function(x):
…
Ответ
Декоратор хранит результаты в словаре по ключу из аргументов. При повторном ключе возвращается кеш, при новом — выполняется функция. Такой вариант подходит для чистых синхронных функций.
Учебная реализация:
from functools import wraps
def cached(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-функции этой обёрткой кешировать нельзя.