Александр Кошелев
Александр Кошелев Python-разработчик

Декоративные изыски

Пока пост про спринт с фотками и видео по техническим причинам задерживает, я решил поразмышлять вслух о декораторах.

Декораторы в питоне, это такая полезная абстракция, позволяющая оборачивать функции, тем самым придавая им новые свойства и функционал прозрачным для них самих способом.

Причем количество декораторов применимых к функции не ограничено, а следовательно можно очень сильно изменить первоначальное поведение.

Но тут встает эстетический вопрос, насколько удобно и практично писать код, который выглядит примерно так:

@a
@bb("dd","ff")
@ccc
def foobar(arg1,arg2):
   #...

Т.е. получается “декоратор на декораторе”. Я не вижу в этом ничего плохого и считаю, что это никак не мешает восприятию. А наоборот, благодаря некой декларативности, помогает лучше структурировать код. Даже если учесть альтернативный, “старый” вариант их использования.

Конечно, иногда декораторы избыточны. Если мы сами авторы функции, то мы можем и не использовать декораторы, а просто явно вызывать некие сторонние функции, которые делают работу декораторов. Но для этого надо чуть-чуть больше знать о том, что они делают и как. И к тому же мы теряем, так любимою мною, декларативность и “скатываемся” до условно императивных конструкций. Код выше мог бы выглядеть так:

def foobar(arg1,arg2):
   arg1 = a(arg1)
   arg2 = bb("dd","ff", arg2)
   if not arg2:
        return
   #...
   return ccc(some_result)

Вам так больше нравится? Мне определенно нет. Переписав всё без декораторов, мы мыло того что увеличили объем кода, так ещё и уменьшили его декомпозицию, перенеся часть “лишней” логики в нашу функцию.

Так вот, мой вывод - декораторы нужно использовать часто, если с их использованием, код получается стройнее и выразительнее. Даже не смотря на возможные потери из-за “декораторной обвязки”, которые можно и сократить (время написания) воспользовавшись модулем decorators, если конечно вам не нужно совместимость со старым питоном:)

Вот я за собой заметил, что стал чаще ими пользоваться. И мне пока нравится.

А какое ваше мнение о декораторах и их активном применении?

comments powered by Disqus