Декоратор, сохраняющий результаты вызова функции

Декоратор хранит результаты в словаре по ключу из аргументов. При повторном ключе возвращается кеш, при новом — выполняется функция. Такой вариант подходит для чистых синхронных функций.

Короткий ответ

Что ответить на собеседовании

Декоратор хранит результаты в словаре по ключу из аргументов. При повторном ключе возвращается кеш, при новом — выполняется функция. Такой вариант подходит для чистых синхронных функций.

Подробный разбор

Ответ с пояснениями

Условие

Создать декоратор, который будет сохранять (кешировать) возвращаемое значение функции, чтобы при повторных вызовах с теми же аргументами не выполнять её заново.

@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-функции этой обёрткой кешировать нельзя.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее