функция lamda в @bot.message_handler() не работает должным образом в telebot python

#python #if-statement #lambda #telegram #telegram-bot

#python #оператор if #лямбда #telegram #telegram-бот

Вопрос:

Я попытался реализовать следующую строку кода в скрипте python для построения бота telegram с использованием telebot.

 @bot.message_handler(func=lambda msg:True if msg.text.startswith('/test'))
def test_start(message):
    msg=bot.send_message(message.chat.id,'This feature is under developement')
  

Приведенный выше код выдает синтаксическую ошибку.

 @bot.message_handler(func=lambda msg:True if msg.text.startswith('/test') else False)
def test_start(message):
    msg=bot.send_message(message.chat.id,'This feature is under developement')
  

Этот код устраняет синтаксическую ошибку, но, тем не менее, он не выполняет то, что я хочу, чтобы он делал. Когда пользователь отправляет «/ test some text», я хочу определить это и выполнить некоторые действия после этого.

Я относительно новичок в python, и я впервые использую функции telebot и lambda. Поэтому, пожалуйста, помогите мне в

  1. определение того, почему 1-й код выдал мне синтаксическую ошибку.
  2. Как правильно реализовать это startswith(‘/ test’) . Заранее большое вам спасибо.

Ответ №1:

Поскольку троичный оператор имеет определенный синтаксис, ему необходимо следовать:

 <value if True> if <condition> else <value if False>
  

То, что вы сделали в первом примере, это:

 <value if True> if <condition>
  

Также вам не нужно делать это так, как вы делали

 True if msg.text.startswith('/test') else False
  

.startswith() возвращает bool сам по себе.

Неясно, что делает декоратор, но почему бы вам просто не выполнить проверку внутри функции?

 @bot.message_handler
def test_start(message):
    if msg.startswith('/test'):
        msg=bot.send_message(message.chat.id,'This is feature is under developement')
  

Ответ №2:

Я думаю, вы ищете что-то подобное:

 @bot.message_handler(func=lambda msg: True == msg.text.startswith("/test"))
def starts_with_test(message):
    args = message.text.split(' ');
    for arg in args:
        bot.send_message(message.chat.id, "arg = "   arg)
  

Он будет обрабатывать только команды, которые начинались с «/ test». Затем вы можете использовать split(‘ ‘) для анализа аргументов. Для некоторых типов полей могут быть ограничения. Например, для поля «InlineKeyboardButton» -> «callback_data». Это может быть <= 64 байта. Другие обработчики будут работать так, как задумано.