Написать, держитесь крепче, генератор-декоратор statcounter(), который конструирует объекты (назовём один из них stat) со следующим поведением. Первый вызов next(stat) (он же stat.send(None)) возвращает словарь, в котором stat будет хранить информацию вида функция: количество вызовов, где функция — это исходный (не обёрнутый) объект-функция (да, так тоже можно!). Словарь заполняется в порядке вызовов соответствующих декораторов. Все последующие вызовы stat.send(function) оборачивают вызов произвольной функции function увеличением на 1 соответствующего элемента словаря. Глобальными именами пользоваться нельзя.

stat = statcounter()
stats = next(stat)

@stat.send
def f1(a): return a+1

@stat.send
def f2(a, b): return f1(a)+f1(b)

print(f1(f2(2,3)+f2(5,6)))
print(*((f.__name__, c) for f, c in stats.items()))

21
('f1', 5) ('f2', 2)
  1. Не пугайтесь, у меня statcounter() занял 8 строк

  2. Почитайте, что было на лекции про позднее связывание


CategoryHomework

LecturesCMC/PythonIntro2022/Homework_StatCounter (последним исправлял пользователь FrBrGeorge 2022-11-16 21:59:40)