Написать, держитесь крепче, генератор-декоратор 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)
Не пугайтесь, у меня statcounter() занял 8 строк
- Почитайте, что было на лекции про позднее связывание