Кеш хранит результат и срок годности для каждого набора аргументов. До истечения TTL результат возвращается из кеша, после — функция вызывается заново и запись обновляется.
Задача: написать декоратор, который кэширует результат выполнения функции на опеределенное время (ttl). TTL задается в секундах (int).
Кеш хранит результат и срок годности для каждого набора аргументов. До истечения TTL результат возвращается из кеша, после — функция вызывается заново и запись обновляется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача: написать декоратор, который кэширует результат выполнения функции на опеределенное время (ttl). TTL задается в секундах (int).
- описать принципиальную схему работы этого кода со всеми возможными корнер-кейсами.
- (опционально) реализовать в коде
import time
реализация
pass
print(f"Func in cache: {}")
print(f"Time is valid: {}")
@ttl_cache(ttl=1) def multiplier(a, b, **kwargs): return a * b
print(f'now={time.time()}') print(f'result={multiplier(5, 5, x=1)}; time={time.time()}') print(f'result={multiplier(5, 5, x=1)}; time={time.time()}') print(f'result={multiplier(2, 5, x=1)}; time={time.time()}') time.sleep(2) print(f'result={multiplier(5, 5, x=1)}; time={time.time()}')
Ответ
Кеш хранит результат и срок годности для каждого набора аргументов. До истечения TTL результат возвращается из кеша, после — функция вызывается заново и запись обновляется.
Используйте монотонное время и явно выберите начало TTL, например завершение вычисления. В примере первый (5,5,x=1) — miss, второй — hit, (2,5,x=1) — другой ключ; после двух секунд первый ключ просрочен.
Обработайте положительный целый TTL, отсутствие записи отдельно от результата None, нехешируемые аргументы, исключения, изменяемые результаты и лимит памяти. Нормализация позиционных/именованных аргументов должна сохранять семантику функции, включая значимый порядок kwargs. Для конкуренции нужен singleflight или допустимость повторных вычислений; общий lock не держат на долгом вызове. Async-функциям требуется отдельная реализация.