Задать вопрос
@ROMANOFF174

Как вынести обработчик сообщений в отдельный модуль?

Начал изучение Python+Telebot
Столкнулся с необходимостью выноса обработчика next_step_handler в отдельные файлы (модули). Не очень ясно, что и куда импортировать при такой необходимости. Нашел информацию о том, что декоратор - это просто вызов функции, в которую передаётся функция или класс. И применил такую конструкцию:
bot.py
import telebot
import config

bot = telebot.TeleBot(config.token)
from functions import init_bot as init_second
init_second(bot)

if __name__=='__main__':
    bot.polling(none_stop=True)


functions.py
def start(message):
    msg = bot.send_message(message.chat.id, f'_Введи имя:_', parse_mode='markdown')
    bot.register_next_step_handler(msg, step1)

def step1(message):
    name = message.text
    msg = bot.send_message(message.chat.id, f'_Введи фамилию:_', parse_mode='markdown')
    bot.register_next_step_handler(msg, step2, name)
    
def step2(message, name):
    surname = message.text
    bot.send_message(message.chat.id, f'Фамилия: {surname} Имя: {name}', parse_mode='markdown')
    
def init_bot(bot):
    bot.message_handler(commands=['start']) (start)


Но, к сожалению, этот код - не работает.
Я не могу понять, как мне передать переменную bot в вызов функции Start которого файла.
Или, возможно, я вообще все делаю не так.
  • Вопрос задан
  • 722 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
О, мой старый ответ. С тех пор я нашел, как его улучшить. Выглядит довольно коряво, но зато просто.
def init_bot(bot):
    # и прямо тут и описываешь все обработчики. Они получат доступ к параметру bot через замыкание.
    @bot.message_handler(commands=['start'])
    def start(message):
        msg = bot.send_message(message.chat.id, f'_Введи имя:_', parse_mode='markdown')
        bot.register_next_step_handler(msg, step1)
Ответ написан
@ROMANOFF174 Автор вопроса
Пример решения такой:
bot.py
import telebot
import config
import file3 

bot = telebot.TeleBot(config.token)


@bot.message_handler(func=lambda message: message.chat.type == 'private', commands=['test'])
def test(message):
   file3.test(bot, message)


if __name__=='__main__':
    bot.polling(none_stop=True)


file2.py
class MyHandlers:
    def __init__(self, bot):
        self.bot = bot

    def callable_method(self, message):
        msg = self.bot.send_message(message.chat.id, f'_Введи имя:_', parse_mode='markdown')
        self.bot.register_next_step_handler(msg, self.step1)
        
    def step1(self, message):
        name = message.text
        msg = self.bot.send_message(message.chat.id, f'_Введи фамилию:_', parse_mode='markdown')
        self.bot.register_next_step_handler(msg, self.step2, name)
    
    def step2(self, message, name):
        surname = message.text
        self.bot.send_message(message.chat.id, f'Фамилия: {surname} Имя: {name}', parse_mode='markdown')


file3.py
from file2 import MyHandlers

def test(bot, message):
    handlers1 = MyHandlers(bot)
    handlers1.callable_method(message)


Спасибо господину Vindicar за помощь. в решении задачи!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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