Задать вопрос
Этот вопрос закрыт для ответов, так как повторяет вопрос Для чего используется "@" перед переменными в Python?
@Asad1502
Начинающий Frontend-разрбаотчик

Зачем нужен декоратор @dp и все в этом духе, типо @dp.message_handler() в aiogram?

Объясните пожалуйста зачем нужны декораторы в aiogram, @dp, @dp.message_handler, и все по типу этого. Документацию по aiogram не понял.
Вот пример кода:
@dp.message_handler()
async def echo(message: Message):
text = f"Привет, ты написал {message.text}"
await bot.send_message(chat_id=message.from_user.id, text=text)
await message.answer(text=text)
  • Вопрос задан
  • 2511 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
На пальцах: чтобы бот работал, его функции должны вызываться при наступлении определённых событий (например, входящего сообщения). Проблема в том, что aiogram знает о возможных событиях, но ему нужно сказать, какие функции когда вызывать. Обычно это называется "зарегистрировать обработчик".
В питоне функции - объекты первого рода, т.е. их можно сохранять в переменные, передавать как параметры, возвращать как результат и вообще поступать с ними как с любым другим значением.
Т.е. по идее можно было бы сделать так:
async def echo(message: Message):
    text = f"Привет, ты написал {message.text}"
    await bot.send_message(chat_id=message.from_user.id, text=text)

dp.register_function_for_message(echo)  # это не настоящий метод aiogram, только пример

Тогда каждому объявленному обработчику событий соответствовал бы вызов метода, ответственного за регистрацию этого обработчика.

Но то же самое можно сделать через декораторы. Декоратор - это сокращённый вызов функции, которая принимает в качестве параметра другую функцию.
Т.е. вот это
@dp.message_handler()
async def echo(message: Message):
    text = f"Привет, ты написал {message.text}"
    await bot.send_message(chat_id=message.from_user.id, text=text)

абсолютно эквивалентно вот этому
_decorator = dp.message_handler()

async def echo(message: Message):
    text = f"Привет, ты написал {message.text}"
    await bot.send_message(chat_id=message.from_user.id, text=text)

echo = _decorator(echo)

Как видишь, очень похоже на "простую" регистрацию обработчика, но записывается чуть короче.
Ответ написан
Ответы на вопрос 1
@dima20155
you don't choose c++. It chooses you
У подобных библиотек, обычно, множество событий, которые они регистрируют (получение текста, картинки, видео и т.д.). При этом сама по себе библиотека содержит лишь регистрацию этих событий, но никак на них не реагирует (кроме внутренних манипуляций). Чтобы написать какое-то кастомное поведение в ответ на определенные события (в данном случае при получении сообщения) необходимо дополнить обработчик событий (message_handler) своим кодом. В python'e для этого удобно использовать декораторы (см. гугл).
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект