Декораторы в Python, задание

В результате выполнения кода, который показан в тренажёре

  1. Декоратор @dealer должен напечатать строки «Полезная работа декоратора до/после вызова».
  2. Декоратор @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)


Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий