...
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, поэтому вы получите результат работы