@Ivanzolo2001

Как выполняются декораторы в aiogram?

Сейчас начал писать ботов на aiogram, тут вопрос: Как вызываются декорируемые функции? В обычных примерах о декораторах необходимо эту самую декорируемую функцию ВЫЗВАТЬ , но в аиограм это работает как то странно для меня. Почему декорируемые функции вообще работают если я их не вызвал? Чтобы вы поняли о чем я, представьте обычный декоратор на команду start.
  • Вопрос задан
  • 614 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Функции(как и методы) в питоне - это объекты первого рода, их можно сохранять в переменные, передавать как параметры и так далее. Соответственно, декоратор - это тоже функция, и тогда
@decorator("params")
def myfunc(func_params):
    pass

это тоже, что и
def myfunc(func_params):
    pass
wrapper = decorator("params")
myfunc = wrapper(myfunc)


Никто не мешает decorator() и wrapper() в примере сохранять адрес оборачиваемой функции в какую-то структуру данных, используемую затем ботом для диспетчеризации поступающих событий. Пример без класса:
registered_funcs = []

def decorator(param):
  #вложенная функция - фактический декоратор
  def wrapper(func):
    global registered_funcs
    #запоминаем декорируемую функцию
    registered_funcs.append( (param, func) )
    return func #не забываем её вернуть
  #возвращаем wrapper, чтобы им можно было продекорировать целевую функцию
  return wrapper

#пример использования декоратора
@decorator("foo")
def myfunc(x):
  print("Hello from myfunc(), ", x)

print(registered_funcs)
#>>> [ ("foo", <function myfunc at 0xdeadf00d>) ]
#и мы можем этим списком пользоваться, например:
for arg, func in registered_funcs:
  func(arg)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы