@rav_pr

Как устроена бибилотека aiogram внутри а именно FSM?

Как вы изучаете устройство библиотеки какой-либо?

Мне сейчас сложно понять как работает FSM и как устроена связь между State, StateGRoup, FSMContext, MemoryStorage.

Попытался покапаться в бибилотеки но дается очень трудно, слабо получается структуризовать и переходить по разным участкам кода чтобы понять принцип работу и взаимосвязь
Интерсно это понять потому как параллельно написанию ьотов учу и питон как язык программирования

Может тут есть кто лазил по исходникам aiogram?
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну конкретно по вопросу: можно сделать обоснованную догадку, если знаком с понятием "конечный автомат".
Это нечто, обладающее набором состояний. В рамках состояния автомат выполняет определённую деятельность и/или ждёт определённого события.
Автомат может переходить из состояния в состояние по внешнему сигналу. При этом правила перехода зависят от сигнала И от состояния. Иными словами, автомат может реагировать по разному на один и тот же сигнал, в зависимости от своего состояния.

Пример: часы-будильник. У них могут быть четыре состояния:
- будильник выключен (только часы)
- будильник включен (ожидание времени следующего звонка)
- звучит звонок
- досыпание
И три события:
- сменилась минута
- пользователь нажал кнопку "вкл-выкл"
- пользователь нажал кнопку досыпания
Схему переходов между состояниями можешь придумать сам. В частности, событие "сменилась минута" будет обрабатываться по-разному в каждом из состояний.

Это базовое понятие. В твоём случае автомат - это StateGroup, его отдельные состояние - это State, а сигналы - события бота, привязанные к автомату. Важно понимать, что у тебя, скорее всего, будет много копий автомата - по одной на каждого пользователя.

Далее возникает вопрос: а что если нам нужно передавать какие-то данные из состояния в состояние? Вот тут возникает понятие контекста автомата, т.е. какого-то набора данных, которые могут читаться и изменяться при его работе. Это FSMContext.

Наконец, сугубо практический вопрос: автомат должен "помнить", в каком он состоянии, и должен хранить свой контекст. Где он будет это делать? Вот тут на помощь приходят классы Storage. В частности, MemoryStorage хранит эти данные в памяти. Ненадёжно, не переживает перезапуск бота, но работает быстро и удобно при отладке.

Попробуй реализовать очень простого бота с автоматом состояний, не используя State, а храня состояние для пользователя самостоятельно. Например, в словаре вида userid: (состояние, контекст). И проверяй вручную состояние и контекст при обработке событий. Тогда поймёшь, что примерно происходит внутри FSM.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы