80 Глава 3 • Эффективные функции
Ключевые
выводы
Лямбда-функции — это функции одного-единственного выражения,
которые не обязательно привязаны к имени (анонимны).
В лямбда-функциях нельзя использовать обычные инструкции Python,
и в них всегда содержится неявная инструкция возврата
return
.
Всегда спрашивайте себя: обеспечит ли применение обычной (именован-
ной) функции либо конструкции включения в список большую ясность?
3 .3 . Сила декораторов
В своей основе декораторы Python позволяют расширять и изменять
поведение вызываемых объектов (функций, методов и классов)
без не-
обратимой модификации самих вызываемых объектов.
Любая достаточно универсальная функциональность, которую можно
прикрепить к существующему классу или поведению функции, является
отличным кандидатом для декорирования. Сюда входят:
ведение протокола операций (журналирование);
обеспечение контроля за
доступом и аутентификацией;
функции инструментального оформления и хронометража;
ограничение
частоты вызова API;
кэширование и др.
Итак, зачем осваивать использование декораторов в Python? В конце кон-
цов, только что упомянутое мною выше выглядит довольно абстрактным,
и, вполне возможно, вообще сложно увидеть, какую пользу принесут де-
кораторы в повседневной работе разработчика. Позвольте мне несколько
прояснить этот вопрос, предоставив вам вполне реальный пример.
Предположим, в вашей программе составления отчетности есть 30 функ-
ций с бизнес-логикой. Одним дождливым утром понедельника ваш босс
подходит к вашему столу и заявляет: «
Доброго понедельника! Помните
3 .3 . Сила декораторов
81
ту отчетность по TPS? Мне нужно, чтобы вы в каждый шаг генератора
отчетов добавили ведение протокола входных и выходных операций. Ком-
пании XYZ это нужно для аудиторских целей. Да, и еще. Я им сказал, что
к среде мы сможем все отправить».
В зависимости от того, насколько вы разбираетесь в декораторах, от этого
поручения либо у вас подскочит давление, либо вы останетесь в относи-
тельном спокойствии.
Без декораторов следующие три дня вам пришлось бы провести в попыт-
ках модифицировать каждую из этих 30 функций, приводя их в полный
беспорядок ручными вызовами операции журналирования. Чудесно, не
правда ли?
А если вы знаете свои декораторы, вы спокойно улыбнетесь своему боссу
и скажете: «
Не беспокойся, Джим. Я сделаю это сегодня к 14:00».
Сразу после этого вы наберете исходный код для универсального декора-
тора
@audit_log
(всего порядка 10 строк кода) и быстро вставите его перед
каждым определением функции. Затем вы зафиксируете код в GitHub
и перехватите очередную чашечку кофе…
Здесь я драматизирую, но лишь капельку. Декораторы действительно
бывают такими мощными. Я даже сказал бы, что для любого серьезного
программиста на Python понимание декораторов является важной вехой.
Они требуют твердого усвоения нескольких продвинутых концепций
языка,
включая свойства функций первого класса.
Do'stlaringiz bilan baham: