Для синхронной чистой функции можно вернуть декоратор с локальным словарём результатов. Ключ составляется из аргументов; в таком простом варианте они должны быть хешируемыми.
def cache():
Для синхронной чистой функции можно вернуть декоратор с локальным словарём результатов. Ключ составляется из аргументов; в таком простом варианте они должны быть хешируемыми.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
def cache(): """ Допиши код декоратора здесь """ pass
Ответ
Для синхронной чистой функции можно вернуть декоратор с локальным словарём результатов. Ключ составляется из аргументов; в таком простом варианте они должны быть хешируемыми.
from functools import wraps
def cache():
def decorate(fn):
results = {}
@wraps(fn)
def wrapped(*args, **kwargs):
key = (args, tuple(kwargs.items()))
if key not in results:
results[key] = fn(*args, **kwargs)
return results[key]
return wrapped
return decorate
Применение: @cache(). Значение None тоже кешируется. Здесь нет TTL, ограничения размера и защиты от параллельных повторных вычислений. Для production выбирайте подходящую политику; не кешируйте этой обёрткой coroutine, побочные эффекты или изменяемые результаты без явного контракта.