>>> def add_ints(a, b):
... return a + b
...
>>> add_ints(3, 5)
8
>>> cooler_add_ints = document_it(add_ints) # мануальное присваивание декоратора
>>> cooler_add_ints(3, 5)
Running function: add_ints
Positional arguments: (3, 5)
Keyword arguments: {}
Result: 8
8
В качестве альтернативы мануальному присваиванию декоратора, показанному
выше, просто добавьте конструкцию @ имя_декоратора перед функцией, которую
хотите декорировать:
>>> @document_it
... def add_ints(a, b):
... return a + b
...
>>> add_ints(3, 5)
Start function add_ints
Positional arguments: (3, 5)
Keyword arguments: {}
Result: 8
8
Каждая функция может иметь более одного декоратора. Напишем еще один
декоратор, который называется square_it() и возводит результат в квадрат.
>>> def square_it(func):
... def new_function(*args, **kwargs):
... result = func(*args, **kwargs)
... return result * result
... return new_function
...
134
Глава 4. Корочка Python: структуры кода
Декоратор, размещенный ближе всего к функции (прямо над def), будет вы-
полнен первым, а затем — тот, что находится сразу над ним. Любой порядок
вызова вернет один и тот же конечный результат, но вы можете увидеть, как меня-
ются промежуточные шаги:
>>> @document_it
... @square_it
... def add_ints(a, b):
... return a + b
...
>>> add_ints(3, 5)
Running function: new_function
Positional arguments: (3, 5)
Keyword arguments: {}
Result: 64