555просмотров
16 мая 2023 г.
Score: 611
Комбинируем декораторы Допустим, у нас есть функции, которые работают со строками. Возьмем, например, функцию, которая возвращает строчку из Zen of Python: def readability(): return 'Readability counts' print(readability())
Readability counts А теперь мы хотим, чтобы можно было показать текст в двух вариантах: жирным и курсивом. Вот два декоратора, один из которых добавляет тег <<жирный>>, а второй <<курсив>> : def bold(func): def wrapper(): return '<b>' + func() + '</b>' return wrapper def italic(func): def wrapper(): return '<i>' + func() + '</i>' return wrapper Как уже договаривались в прошлом посте запись: @bold
def readable(): return 'Readability counts' Эквивалентна записи readable = bold(readable) И после применения декоратора вызов функции дает текст print(readable())
<b>Readability counts</b> А что если мы хотим получить текст одновременно и жирный и с курсивом? Можно сделать композицию декораторов: @italic
@bold
def readable(): return 'Readability counts' print(readable())
<i><b>Readability counts</b></i> Обратите внимание, что результат в зависимости от порядка применения декораторов будет разным: @bold
@italic
def readable(): return 'Readability counts' print(readable())
<b><i>Readability counts</i></b> Так получается из-за разного порядка выполнения функций: в первом случае мы сначала добавляем тэг <<жирный>>, а сверху оборачиваем в <<курсив>>: readable = italic(bold(readable)) А во втором -- наоборот: readable = bold(italic(readable))