Использование декораторов в microPython на микроконтроллере ESP8266.

В данном уроке мы рассмотрим такое понятие как декоратор.

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

Для понимания как это работает, рассмотрим программный код:

from machine import Pin
import time
led1 = Pin(15, Pin.OUT)#D8
led2 = Pin(2, Pin.OUT)#D4
led3 = Pin(13, Pin.OUT)#D7
led4 = Pin(4, Pin.OUT)#D2

def all_off():
   led1.off()
   led2.off()
   led3.off()
   led4.off()

def my_prog1(fun_dekor):
   def function1():
       print (‘Led1’)
       led1.on()
       fun_dekor()
       print (‘Led2’)
       led2.on()
   return function1

def my_prog2():
     print(‘Led3’)
     led3.on()

def my_prog3():
     print(‘Led4’)
     led4.on()

all_off()
my_prog2()
time.sleep(5)
all_off()
time.sleep(5)
print(‘ ‘)
#
#
my_prog2_decorated = my_prog1(my_prog2)
my_prog2_decorated()
time.sleep(5)
all_off()
time.sleep(5)
print(‘ ‘)
my_prog3_decorated = my_prog1(my_prog3)
my_prog3_decorated() time.sleep(5)
all_off()
print(‘END’)

В данном коде мы создаем подпрограмму, аргументом которой является функция:

def my_prog1(fun_dekor):

В данной подпрограмме мы сделаем функцию, которую получаем в качестве аргумента.  

 fun_dekor()

Далее создаем пару подпрограмм, в которых будем включать светодиоды:

def my_prog2(fun_dekor):

Теперь предположим нам надо, что бы процессы которые происходят в подпрограмме my_prog2 и my_prog3 происходили одновременно (по очереди) с действиями в подпрограмме my_prog1. Что бы не создавать две подпрограммы в которых прописываем данные действия, мы создаем одну подпрограмму my_prog1, где описываем общие условия для работы подпрограммы my_prog2 и my_prog3. 

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

Вставка внутрь функции другую функцию:

my_prog2_decorated = my_prog1(my_prog2)
my_prog2_decorated()

Результат выполнения выше написаннойпрограммы :

В качестве визуализации я добавил светодиоды, сначала запустил функцию my_prog2(), а после символов ## добавил демонстрацию работы декоратора. Результат работы можно увидеть на видео.