В результате выполнения кода, который показан в тренажёре
- Декоратор
@dealer
должен напечатать строки «Полезная работа декоратора до/после вызова». - Декоратор
@counter
должен посчитать количество вызовов функций и сложить их в словарь в формате'имя_функции': количество_вызовов
, а в конце этот словарь тоже будет напечатан.
Ожидалось, что будет такой вывод:
Полезная работа декоратора до вызова функции first
Вызвана first
Полезная работа декоратора после вызова функции first
Полезная работа декоратора до вызова функции second
Вызвана second
Полезная работа декоратора после вызова функции second
Полезная работа декоратора до вызова функции second
Вызвана second
Полезная работа декоратора после вызова функции second
{'first': 1, 'second': 2}
Однако код выводит другой результат:
Исправьте код, чтобы печатался ожидаемый результат.
Правильный код:
from functools import wraps count = {} def counter(func): """Cчитает и печатает количество вызовов декорируемой функции.""" # Создаём запись в словаре с ключом в виде имени декорируемой функции # В качестве ключа используем имя функции, полученное из магического метода count[func.__name__] = 0 @wraps(func) def wrapper(*args, **kwargs): # При вызове добавили к счётчику единицу count[func.__name__] += 1 return func(*args, **kwargs) return wrapper def dealer(func): """Делает что-то полезное до и после вызова декорируемой функции.""" @wraps(func) def wrapper(*args, **kwargs): print(f'Полезная работа декоратора до вызова функции {func.__name__}') result = func(*args, **kwargs) print(f'Полезная работа декоратора после вызова функции {func.__name__}') return result return wrapper @counter @dealer def first(): print('Вызвана first') @dealer @counter def second(): print('Вызвана second') first() second() second() print(count)