08 январь 2018 29 январь 2018 Python | решать тесты


Во время развития функционала любого приложения появляется необходимость дополнить или изменить поведение ранее созданных функций. Например, вы разработали вычисление некоторых функций для себя, но c изменением круга пользователей программе уже не достаточно просто вычислять значения, появляется необходимость вести учёт правильным или неправильным вычислениям или проводить эти вычисления с учётом авторизации пользователя в системе и самым простым решением будет дополнить код функции дополнительным кодом. Но в результате вы получите пухлый, рыхлый и плохо управляемый программный код.

# начальная версия кода
def вычисление_значения(a, b):
    return a+b

# код после добавления новых требований
def вычисление_значения(a, b):
    if проверка_пользователя:
        учёт_результатов
    результат = a+b
    учёт_результатов(результат)
    печать_результатов(результат)

Более эфектным и эффективным будет поместить созданный ранее код внутрь другого кода, который будет предварять или завершать ваш код по новым задачам. И сделать это можно с помощью декораторов.

В программировании декоратор это обёртка функционального кода применяемая относительно другого функционального кода

Можно декорировать любой функциональный код

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

Декораторам можно передавать параметры для использования текущего контекста

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

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

Вот так будет выглядеть необходимые нам декораторы

def проверка_пользователя(декорируемая_функция):
    if пользователь.авторизован == True:
        декорируемая_функция()
    генерация исключения авторизации

def печать_результатов(декорируемая_функция):
   печать( "шапка бланка печати" )
   печать( декорируемая_функция() )
   печать( "подвал бланка печати" )

def учёт_результатов(декорируемая_функция):
   try:
      декорируемая_функция()
      журнал("положительное вычисление")
   except:
      журнал("неудачное вычисление")

Схематично использование декораторов можно представить в виде:

@проверка_пользователя
@печать_результатов_вычисление_значения
@учёт_результатов_вычисление_значения
def вычисление_значения(a, b):
    return a+b

Функционально декораторы это простой функциональный код который запускается на этапе интерпретации и в качестве входных аргументов получив имя декорируемой функции (в даннам случае указатель на функцию) манипулирует аргументами и результатами декорируемой функции