Вопрос или проблема
Я пытаюсь написать код для чат-бота (LSAR), в который я вручную ввожу команды и ответы. У меня настроено несколько команд, и я пытаюсь понять, как установить сообщение об ошибке.
В последней строке я поместил все команды в фигурные скобки, разделенные запятыми (я также пробовал с квадратными скобками, если это важно). Это должно было сделать так, чтобы при вводе неверной команды отображалось сообщение об ошибке и предлагалось попробовать снова. Сначала это работало, но теперь, когда я ввожу что-то, что не является командой, все последующие команды также показывают сообщение об ошибке. Например, я ввожу “asdf”, LSAR отправляет свое сообщение об ошибке, я ввожу “CYN”, и оно снова отправляет сообщение об ошибке. Это только мой второй или третий опыт программирования на python, поэтому я действительно не уверен, как разобраться, в чем здесь проблема; любая помощь станет очень полезной. Вот мой код:
while var == "How are you?": var = input("\nim s0 g00d!! im just chilllin as usuallll ykn0w >_<\n\n")
while var == "What's your name?": var = input("\nim LSAR! nice t0 meet y0u friend :3\n\n")
while var == "CYN": var = input ("\n[CALLBACK PING]\n\n")
while var == "Who are you?": var = input("\nIt seems you have asked about LS's chat client auto-responder. This is an application designed to simulate LS's otherwise inimitable rad typing style, tone, cadence, personality, and substance of retort while he is unavailable. The algorithms are guaranteed to be 93 percent indistinguishable from LS's native neurological responses, based on some statistical analysis I basically just pulled out of my ass right now.\n\n")
while var == "What are you?": var = input("\nim n0t a what. be nice!! X(\n\n")
while var != {"How are you?", "CYN", "Who are you?", "What are you?", "What's your name?"}: var = input("ummmm wat. s0rry, idk what y0ure talllking ab0ut! X(\ntry an0ther c0mmand plllease, 0ne i understand this time ^_^\n\n"```
Проблема заключается в том, как вы сравниваете var
с набором всех возможных ответов в последней строке. Вам следует использовать оператор in
вместо этого.
while var not in {"How are you?", "CYN", "Who are you?", "What are you?", "What's your name?"}: var = input("ummmm wat. s0rry, idk what y0ure talllking ab0ut! X(\ntry an0ther c0mmand plllease, 0ne i understand this time ^_^\n\n"
Кроме того, вы можете использовать блок try/catch для обработки ошибок. Например, ваш код будет выглядеть так:
try:
while var == "How are you?": var = input("\nim s0 g00d!! im just chilllin as usuallll ykn0w >_<\n\n")
while var == "What's your name?": var = input("\nim LSAR! nice t0 meet y0u friend :3\n\n")
while var == "CYN": var = input ("\n[CALLBACK PING]\n\n")
while var == "Who are you?": var = input("\nIt seems you have asked about LS's chat client auto-responder. This is an application designed to simulate LS's otherwise inimitable rad typing style, tone, cadence, personality, and substance of retort while he is unavailable. The algorithms are guaranteed to be 93 percent indistinguishable from LS's native neurological responses, based on some statistical analysis I basically just pulled out of my ass right now.\n\n")
while var == "What are you?": var = input("\nim n0t a what. be nice!! X(\n\n")
while var != {"How are you?", "CYN", "Who are you?", "What are you?", "What's your name?"}: var = input("ummmm wat. s0rry, idk what y0ure talllking ab0ut! X(\ntry an0ther c0mmand plllease, 0ne i understand this time ^_^\n\n"
except Exception:
print("Произошла ошибка!")
var != {"How are you?", "CYN", "Who are you?", "What are you?", "What's your name?"}
фактически проверяет, является ли var
множеством всех этих строк, а не проверяет, равен ли var
любому из них.
Другая проблема заключается в том, что вы проверяете команды только в порядке, в котором они были перечислены. Например, если попробовать “CYN” после “Who are you?”, ответа не будет, так как вы уже вышли за пределы этого условия.
Сохраните свои команды и ответы в словаре, используйте dict.get()
для получения ответа или возвращайте сообщение об ошибке, если команда не распознана, и используйте один цикл while:
commands = {
"How are you?": "\nim s0 g00d!! im just chilllin as usuallll ykn0w >_<\n\n",
"What's your name?": "\nim LSAR! nice t0 meet y0u friend :3\n\n",
"CYN": "\n[CALLBACK PING]\n\n",
"Who are you?": "\nIt seems you have asked about LS's chat client auto-responder. This is an application designed to simulate LS's otherwise inimitable rad typing style, tone, cadence, personality, and substance of retort while he is unavailable. The algorithms are guaranteed to be 93 percent indistinguishable from LS's native neurological responses, based on some statistical analysis I basically just pulled out of my ass right now.\n\n",
"What are you?": "\nim n0t a what. be nice!! X(\n\n"
}
error_message = "ummmm wat. s0rry, idk what y0ure talllking ab0ut! X(\ntry an0ther c0mmand plllease, 0ne i understand this time ^_^\n\n"
var = input("Ask a question or quit")
while var.lower() != "quit":
response = commands.get(var, error_message)
var = input(response)
Ответ или решение
Для правильного добавления сообщения об ошибке в ваш чат-бот (LSAR), необходимо учесть несколько ключевых аспектов в вашей программе. Ваша текущая реализация имеет несколько проблем, которые в итоге приводят к неправильной обработке команд и повторению сообщений об ошибках. Ниже представлен подробный анализ вашей проблемы и рекомендации по исправлению кода.
Проблемы в текущем коде
-
Некорректная проверка ввода: Использование проверки
var != {"command1", "command2", ...}
неверно, так как это сравниваетvar
с набором (set), что не решает задачу проверки наличия команды. -
Порядковая обработка команд: Использование нескольких последовательных
while
циклов приводит к тому, что программа проверяет только одну команду за раз. После успешного выполнения одного из командных блоков, вызов следующей команды отсутствует, и если пользователь вводит несколько команд подряд, можно "пропустить" правильные команды. -
Отсутствие системы возврата к запросу: Если пользователь вводит некорректную команду, у него нет возможности повторно ввести команду без выхода из цикла.
Рекомендации по исправлению
Для эффективной работы чат-бота рекомендуется использовать структуру данных словарь
(dictionary) для хранения команд и соответствующих ответов. Это упростит проверку команд и позволит вам с легкостью управлять вводом пользователя. Вот оптимизированный пример вашего кода:
commands = {
"How are you?": "\nim s0 g00d!! im just chilllin as usuallll ykn0w >_<\n\n",
"What's your name?": "\nim LSAR! nice t0 meet y0u friend :3\n\n",
"CYN": "\n[CALLBACK PING]\n\n",
"Who are you?": "\nIt seems you have asked about LS's chat client auto-responder. This is an application designed to simulate LS's otherwise inimitable rad typing style, tone, cadence, personality, and substance of retort while he is unavailable. The algorithms are guaranteed to be 93 percent indistinguishable from LS's native neurological responses, based on some statistical analysis I basically just pulled out of my ass right now.\n\n",
"What are you?": "\nim n0t a what. be nice!! X(\n\n"
}
error_message = "ummmm wat. s0rry, idk what y0ure talllking ab0ut! X(\ntry an0ther c0mmand plllease, 0ne i understand this time ^_^\n\n"
var = input("Ask a question or quit: ")
while var.lower() != "quit":
response = commands.get(var, error_message)
print(response) # Отправка ответа пользователю
var = input("Ask another question or quit: ")
Объяснение улучшений
-
Словарь для команд: Использование словаря позволяет легко добавлять, изменять и получать команды. Метод
dict.get()
возвращает значение по ключу, а если ключа нет, он возвращает заданное значение по умолчанию (error_message
). -
Цикл ввода: Программа продолжает запрашивать ввод до тех пор, пока пользователь не введет "quit". При этом пользователь сразу получает ответ на введенную команду.
-
Чистая и понятная структура: Код становится более читаемым и логичным. Легкость внесения изменений в команды способствует более быстрой разработке и улучшению функциональности.
Заключение
С формированием структуры команд через словарь и оптимизированной логикой пользовательского ввода вы сможете значительно улучшить функциональность своего чат-бота. Важно обращать внимание на обработку ошибок и удобно организовать вывод сообщений, так как это способствует лучшему взаимодействию с пользователем. Надеюсь, эти рекомендации помогут вам успешно доработать ваш проект.