Декораторы · 12 из 14
Не чаще, чем
Сводку по отделению начальница обновляет кнопкой, а считается сводка по всей базе. Нажимают кнопку раз по двадцать подряд, и база ложится. Решили так: чаще раза в минуту не пересчитывать, а показывать прошлый ответ.
Что сделать
Пересчитывайте сводку не чаще раза в минуту, сколько бы раз ни нажимали кнопку.
Что приходит
chasy— функция без аргументов: текущее время в секундахpauza— сколько секунд должно пройти между пересчётами
Что вернуть
Декоратор; обёртка зовёт функцию, если с прошлого настоящего вызова прошло не меньше pauza, иначе отдаёт прошлый ответ и увеличивает propushcheno.
Допишите функцию ne_chashche в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
Пауза — 60 секунд. В момент 0 сводка посчитана, в момент 30 отдана прошлая — пропуск, в момент 61 посчитана заново. Настоящих вызовов два — [0, 61], пропущен один.
Функция принимает часы и паузу и возвращает декоратор.
Часы — функция без аргументов, возвращающая текущее время числом (в секундах). Пауза — число секунд.
Обёртка принимает любые аргументы. Первое обращение всегда проходит: исходная функция вызывается, её результат запоминается и возвращается.
Дальше: если с последнего состоявшегося вызова прошло меньше паузы, исходная функция не вызывается, возвращается запомненный результат, а счётчик «propushcheno» растёт на единицу. Ровно пауза — уже можно. Имя исходной функции сохраняется.
Образцовый тест целиком
vremya = [0]
def chasy():
return vremya[0]
vyzovy = []
@ne_chashche(chasy, 60)
def svodka():
vyzovy.append(vremya[0])
return f"сводка на {vremya[0]}"
pervyy = svodka()
vremya[0] = 30
vtoroy = svodka()
vremya[0] = 61
tretiy = svodka()
(pervyy, vtoroy, tretiy, vyzovy, svodka.propushcheno)
('сводка на 0', 'сводка на 0', 'сводка на 61', [0, 61], 1)
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.