Декораторы · 3 из 14
Журнал окна
К вечеру Зинаида Петровна спрашивает, что за день прошло через окно. Расчёты в программе разные — тариф, доплата, возврат, — и заводить в каждом свою запись в журнал значит ту же строчку писать пять раз.
Что сделать
Ведите журнал окна одним декоратором — вместо одной и той же строчки в пяти расчётах.
Что приходит
rabota— функция с любыми аргументами
Что вернуть
Обёртку: зовёт rabota, отдаёт её результат и дописывает в своё поле zhurnal кортеж (позиционные, именованные, результат); упавший вызов не записывается.
Допишите функцию s_zhurnalom в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
После f(2000) и f(1500, srochno=True) в журнале две записи: ((2000,), {}, 200) и ((1500,), {"srochno": True}, 300). Каждый следующий вызов — ещё одна.
Функция принимает другую функцию и возвращает обёртку.
Обёртка принимает любые аргументы — позиционные и именованные, — вызывает исходную функцию с ними и возвращает её результат. Кроме того, она дописывает в свой список «zhurnal» запись о вызове: кортеж из трёх — кортеж позиционных аргументов, словарь именованных, результат. До первого вызова список пуст. Упавший вызов в журнал не попадает: записывается то, что состоялось.
Образцовый тест целиком
def tarif(gramm, srochno=False):
return gramm // 1000 * 100 + (200 if srochno else 0)
f = s_zhurnalom(tarif)
f(2000)
f(1500, srochno=True)
(f(3000), f.zhurnal)
(300, [((2000,), {}, 200), ((1500,), {'srochno': True}, 300), ((3000,), {}, 300)])
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.