#python #discord.py #chatterbot
#python #discord.py #чат-бот
Вопрос:
Я кодирую Discord-бота, который использует ChatterBot для взаимодействия.
Я хочу создать команду, которая заставляет бота изучать ввод через чат.
@client.command(aliases=['tc'])
async def treinocustom(ctx, response, input_statement):
chatbot.learn_response(response, input_statement)
ctx.send('Thanks for the feedback')
Но когда я выполняю команду, эта ошибка отображается на консоли:
Ignoring exception in command treinocustom:
Traceback (most recent call last):
File "C:Usersuseranaconda3envsenvbomlibsite-packagesdiscordextcommandscore.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "C:/Users/user/PycharmProjects/SamuelBot/SamuelBot.py", line 227, in treinocustom
chatbot.learn_response(arg1, arg2)
File "C:Usersuseranaconda3envsenvbomlibsite-packageschatterbotchatterbot.py", line 225, in learn_response
statement.in_response_to = previous_statement
AttributeError: 'str' object has no attribute 'in_response_to'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:Usersuseranaconda3envsenvbomlibsite-packagesdiscordextcommandsbot.py", line 903, in invoke
await ctx.command.invoke(ctx)
File "C:Usersuseranaconda3envsenvbomlibsite-packagesdiscordextcommandscore.py", line 855, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "C:Usersuseranaconda3envsenvbomlibsite-packagesdiscordextcommandscore.py", line 94, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'in_response_to'
Что я могу сделать, чтобы это исправить?
Комментарии:
1. я не знаком с используемой вами библиотекой, но, похоже, это ошибка типа. Похоже, что вы передали строку библиотечной функции, которая ожидает объект statement (или, по крайней мере, объект, имеющий
in_response_to
атрибут). Возможно, проверьте документацию наlearn_response
, чтобы увидеть, какие аргументы он ожидает.2. @cruculence Функция говорит:
def learn_response(self, statement, previous_statement=None):
3. поскольку в Python довольно слабая система ввода, сигнатура функции сама по себе не очень эффективна с точки зрения определения того, как действовать с ошибками типа / интерфейса. Если вы посмотрите документацию библиотеки, там, вероятно , есть более подробное объяснение того, как использовать функцию, или пример кода. Если это бесполезно, может быть, поискать документацию или исходный код для класса Statement?
4. ссылка на @truculence на официальном сайте показано только, что функция существует и требует
(statement, previous_statement)
, и единственным классом являетсяclass ChatBot(object)
5. возможно, это поможет ссылка
Ответ №1:
Итак, проблема здесь в том, что функция chatterbot learn_response()
принимает в качестве аргументов НЕ строки, а специальный тип данных (локальный для chatterbot), называемый a Statement
. Итак, чтобы получить ваш ответ в этом типе данных, вы должны сначала импортировать его с помощью:
from chatterbot.conversation import Statement
в верхней части вашего кода. Во-вторых, просто внесите эти изменения в свою treinocustom()
функцию:
@client.command(aliases = ["tc"])
async def treinocustom(ctx, *, parts):
if parts.count(">") == 1:
Question, Answer= [i.strip() for i in parts.split('>')]
#here, we are changing the strings 'Question' and 'Answer' to a Statment datatype.
input_statement = Statement(text=Question)
correct_response = Statement(text=Answer)
chatbot.learn_response(correct_response, input_statement)
await ctx.send("Ok, I have learnt the correct response to this query!")
else:
await ctx.send("Please enter only two arguments!")
Итак, что я заметил в вашем коде, так это то, что аргументы response
и input_statement
будут принимать только одно слово в качестве входных данных, но на самом деле нам нужны предложения в качестве входных данных.
Однако в этой функции выше пользователь может дать команду следующим образом:
[bot_prefix] tc what is your name? > My name is ChatterBot!
Во-вторых, я преобразовал Question
и Answer
строки в Statement
s, которые распознает функция learn_response().
В-третьих, команда будет работать, даже если пользователь вводит, сколько пробелов до и после «>», другими словами, даже
[bot_prefix] tc what is your name? > My name is ChatterBot!
будет работать отлично! это связано с strip()
используемой функцией…
Я столкнулся с той же проблемой, что и вы, но, покопавшись в репозитории chatterbot на githup, я нашел несколько очень хороших примеров кодов и выяснил из них правильное использование функции. Если вам интересно, вы можете найти learn_response()
пример кода здесь.