Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 98

функции func, а также дополнительные данные:

>>> 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