Декоратор‑обёртка с кешированием результатов функции

Храните результаты в словаре по ключу из аргументов и используйте 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-функции этот вариант кешировал бы корутину, что неправильно.

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

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

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

Подробнее