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

... number += step

...

132

Глава 4. Корочка Python: структуры кода

Это нормальная функция:

>>> my_range

<function my_range at 0x10193e268>

И она возвращает объект генератора:

>>> ranger = my_range(1, 5)

>>> ranger

<generator object my_range at 0x101a0a168>

Мы можем проитерировать по этому объекту генератора:

>>> for x in ranger:

... print(x)

...

1

2

3

4

Декораторы

Иногда вам нужно модифицировать существующую функцию, не меняя при этом

ее исходный код. Зачастую нужно добавить выражение для отладки, чтобы посмо-

треть, какие аргументы были туда переданы.

Декоратор — это функция, которая принимает одну функцию в качестве аргу-

мента и возвращает другую функцию. Мы используем следующие приемы из на-

шего арсенала:

 *args и **kwargs;

 внутренние функции;

 функции в качестве аргументов.

Функция document_it() определяет декоратор, который:

 выведет имя функции и значение переданных в нее аргументов;

 запустит функцию с полученными аргументами;

 выведет результат;

 вернет модифицированную функцию, готовую для использования.

Код будет выглядеть так:

>>> def document_it(func):

... def new_function(*args, **kwargs):

... print('Running function:', func.__name__)

... print('Positional arguments:', args)

... print('Keyword arguments:', kwargs)

Декораторы

133

... result = func(*args, **kwargs)

... print('Result:', result)

... return result

... return new_function

Независимо от того, какую функцию func вы передадите document_it(), вы полу-

чите новую функцию, которая содержит дополнительные выражения, добавля емые

document_it(). Декоратор не обязательно должен запускать код функции func, но

функция document_it() вызовет часть func, поэтому вы получите результат работы