@vilaugra

Как работают декораторы в aiogram?

Делаю бота для вк, используя vk_api. Раньше работал только с телеграмом через aiogram. Там все было понятно - функцию через декоратор прописываешь, например @dp.message_handler(commands=['start'], state='*'), и она сама вызывается в нужный момент, в данном случае при любом состоянии и команде /start.
А у вк, ничего подобного нет. Там просто в цикле событие проверяешь.
Так вот, я хотел спросить, как работают эти декораторы в aiogram? Может попробую сделать что-нибудь подобное у себя, чтобы функция сама вызывалась в нужный момент, но для этого мне нужно понять, как это реализовано aiogram.
  • Вопрос задан
  • 2917 просмотров
Решения вопроса 1
@cython
По сути, это через декораторы aiogram(не единственная библиотека, которая так делает) регистрирует обработчик команд.
Пример такой реализации:
class Bot:
  def __init__(self):
    self.handlers = dict()
    self.on_message = None
  
  def on(self, command):
    def decorator(func):
      self.handlers[command] = func
      return func
    return decorator

  def handle(self, event)
    if event["object"]["message"]["text"] in self.handlers:
      self.handlers[event["object"]["message"]["text"]](event["object"])
    elif self.on_message is not None:
      self.on_message(event["object"])


bot = Bot()

@bot.on("привет")
def hello_handler(msg):
  print(f"Hello: {msg}")
  # Для ответа можете реализовать отдельную функцию, которая обращается к vk_api

def on_message(msg):
  print(msg)

Здесь надо реализовать ещё инициализацию бота, основной цикл и запуск.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@buvanenko
Решение простое: не используй vk_api. Даже его разработчик советует использовать более продвинутые аналоги с поддержкой асинхронности, такие как vkbottle.

Да и после aiogram тебе будет легко пересесть.
https://github.com/timoniq/vkbottle
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
23 нояб. 2024, в 01:31
1000 руб./за проект
23 нояб. 2024, в 00:16
2000 руб./за проект
22 нояб. 2024, в 23:55
3000 руб./за проект