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

Не работает ветвление if-elif-else в python, игнорирует условия. Как исправить?

Всем привет, пишу простенького справочного телеграм-бота, который выдаёт заготовленные ответы на текстовые запросы пользователя. Запросы и ответы заключены в условиях конструкции if-elif-else. Вот скрипт:
import telebot

TOKEN = "TOKEN"
bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    bot.send_message(message.chat.id, 'Привет, напиши тривиальное название химического вещества, а я посмотрю, что о нём знаю.')

@bot.message_handler(content_types=['text'])
def text_handler(message):
    text = message.text.lower()
    chat_id = message.chat.id
    if text == 'привет' or 'привет)' or 'здравствуй' or 'здравствуйте' or 'здорово' or 'здравствуй)' or 'здравствуйте)' or 'ghbdtn' or 'plhfdcndeqnt' or 'plhfdcndeq':
        bot.send_message(chat_id, 'Привет, меня зовут Врунишка - главный знаток химических названий... А если серьёзно, то я всего-навсего обычный бот, который любит химию.\n\n'
                                  'Буду рад поделиться своими знаниями. Просто напиши название вещества, а я посмотрю в своей химической базе данных.')
    elif text == 'как дела?':
        bot.send_message(chat_id, 'Хорошо, а у тебя?')
    elif text == 'бензол' or 'benzene' or 'бензен' or 'фениловый водород' or 'фенан' or 'фениленгидрид' or 'циклогекса-1,3,5-триен' or '1,3,5-циклогексатриен' or '[6]-аннулен' or '[6]аннулен':
        bot.send_message(chat_id, 'Название ИЮПАК: бензол, циклогекса-1,3,5-триен\n'
                                  'Прочие названия: бензен, фениловый водород, [6]-аннулен\n'
                                  'На английском: benzene, phenane, phenylene hydride, 1,3,5-Cyclohexatriene, [6]Annulene\n\n'
                                  'Брутто-формула: C\u2086H\u2086 \n'
                                  'Молярная масса: 78,11 г/моль')
    else:
        bot.send_message(chat_id, 'Простите, я ваc не понял :(')
bot.polling(none_stop=True, interval=0)

Сначала всё работало, после добавления второго elif стало игнорироваться условие else, потом вообще на любой запрос пользователя бот отправляет сообщение из условия if, игнорируя всё остальное.
Копался на форумах, но всё, что удалось найти - это метод register_next_step_handler. Добавил две строчки кода перед elif:
if text == 'привет' or 'привет)' or 'здравствуй' or 'здравствуйте' or 'здорово' or 'здравствуй)' or 'здравствуйте)' or 'ghbdtn' or 'plhfdcndeqnt' or 'plhfdcndeq':
        bot.send_message(chat_id, 'Привет, меня зовут Врунишка - главный знаток химических названий... А если серьёзно, то я всего-навсего обычный бот, который любит химию.\n\n'
                                  'Буду рад поделиться своими знаниями. Просто напиши название вещества, а я посмотрю в своей химической базе данных.')
    bot.register_next_step_handler(text, text_handler)
def text_handler(message):
    elif text == 'как дела?':
        bot.send_message(chat_id, 'Хорошо, а у тебя?')

Но теперь выдаёт ошибку:
File "C:\Program Files (x86)\Python projects\ChemBot\main.py", line 19
    elif text == 'как дела?':
    ^^^^
SyntaxError: invalid syntax

Process finished with exit code 1

Что я делаю не так? Как исправить? Обязательно ли выносить все текстовые условия в отдельный файл .py или таблицу exel? Планируется добавить множественные условия elif, поэтому важно понять, почему не работает.
Telebot устанавливал через pipenv install pyTelegramBotAPI, перед этим pip install pipenv
Windows 10 22H2
Python 3.11
PyCharm Community Edition 2022.3.3

Сразу скажу, что я абсолютный ноль в программировании, в python в частности, но срочно нужно написать бота для защиты проекта. Помогите, пожалуйста, а то уже отчаиваюсь.
  • Вопрос задан
  • 1343 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 1
@Scream034
Новичок в разработке
У тебя неправильная конструкция if-elif-else, не надо использовать такое
if text == 'привет' or 'привет)' or 'здравствуйте': pass
.
Вот верно
if text == 'привет' or text == 'привет)' or text == 'здравствуйте': pass

Вот код исправный:
import telebot

TOKEN = "TOKEN"
bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    bot.send_message(message.chat.id, 'Привет, напиши тривиальное название химического вещества, а я посмотрю, что о нём знаю.')

@bot.message_handler(content_types=['text'])
def text_handler(message):
    text = message.text.lower()
    
    # from re import sub
    # text = sub(r'[^\w\s]', '', text) # Можешь использовать для удаления всех не нужных знаков по типу - : ; ! , ? . - _ и т.д
    
    chat_id = message.chat.id
    if text == 'привет' or text == 'привет)' or text == 'здравствуй' or text == 'здравствуйте' or text == 'здорово' or text == 'здравствуй)' or text == 'здравствуйте)' or text == 'ghbdtn' or text == 'plhfdcndeqnt' or text == 'plhfdcndeq':
        bot.send_message(chat_id, 'Привет, меня зовут Врунишка - главный знаток химических названий... А если серьёзно, то я всего-навсего обычный бот, который любит химию.\n\n'
                                  'Буду рад поделиться своими знаниями. Просто напиши название вещества, а я посмотрю в своей химической базе данных.')
    elif text == 'как дела?':
        bot.send_message(chat_id, 'Хорошо, а у тебя?')
    elif text == 'бензол' or text == 'benzene' or text == 'бензен' or text == 'фениловый водород' or text == 'фенан' or text == 'фениленгидрид' or text == 'циклогекса-1,3,5-триен' or text == '1,3,5-циклогексатриен' or text == '[6]-аннулен' or text == '[6]аннулен':
        bot.send_message(chat_id, 'Название ИЮПАК: бензол, циклогекса-1,3,5-триен\n'
                                  'Прочие названия: бензен, фениловый водород, [6]-аннулен\n'
                                  'На английском: benzene, phenane, phenylene hydride, 1,3,5-Cyclohexatriene, [6]Annulene\n\n'
                                  'Брутто-формула: C\u2086H\u2086 \n'
                                  'Молярная масса: 78,11 г/моль')
    else:
        bot.send_message(chat_id, 'Простите, я ваc не понял :(')
bot.polling(none_stop=True, interval=0)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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