Discord.py send() принимает от 1 до 2 позиционных аргументов

Я попытался закодировать систему голосования с помощью discord.py. Я хотел, чтобы бот отправил сообщение, которое пользователь отправил до того, как я уже узнал, что могу сделать это, закодировав async def voting(ctx, *text): и поставив символ * перед текстовым аргументом, но когда я пытаюсь закодировать бота так, чтобы он отправлял текстовым аргументом ошибку:

discord.ext.commands.errors.CommandInvokeError: команда вызвала исключение: TypeError: send() принимает от 1 до 2 позиционных аргументов, но было передано 6

появляется в консоли. Я уже пробовал такие вещи, как положить его в f-строку, но это не сработает.

Вот полный код этой команды

@client.command()
async def voting(ctx, *text):
    await ctx.channel.purge(limit = 1)
    message = await ctx.send(*text)

    cross = client.get_emoji(790243377953636372)
    check = client.get_emoji(790243459050110977)
    voting_cross = 0
    voting_check = 0

    await client.add_reaction(message, emoji = cross)
    await client.add_reaction( emoji = check )

    @client.event
    async def on_reaction_add(reaction, user):

        reaction_channel = reaction.message.channel
        voting_channel = client.get_channel(voting_channel_id)

        if reaction_channel == voting_channel :

            if str(reaction.emoji) == "✅":

                voting_check = voting_check + 1
                print(f'{user} has votet with ')

            if str(reaction.emoji) == "❌":

                voting_cross = voting_cross + 1
                print(f'{user} has votet with ')

    @client.command()
    async def results(ctx):

        if voting_check > voting_cross :
            await ctx.send(f'More people votet for :greencheckmark: ({voting_check} votes)')

        else :
            await ctx.send(f'More people votet for :redcross: ({voting_cross} votes)')

Вы уверены, что *text не представляет более двух аргументов?

ishak O. 20.12.2020 17:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот код действительно плохой.

  1. Вы распаковываете список, а не присоединяетесь к нему
>>> lst = [1, 2, 3]
>>> print(lst)
[1, 2, 3]
>>> print(*lst)
1 2 3 # It's not the same, you need to join it using str.join(list)
>>> ' '.join(lst)
'1 2 3'

Также, если вы хотите передать его уже как строку, используйте это:

@client.command()
async def voting(ctx, *, text):
  1. client.add_reaction это уже не важно, если вы используете discord.py 1.0+ это Message.add_reaction
await message.add_reaction(whatever)
  1. Вы не помещаете события в команды, вы используете client.wait_for(event), вот пример
@client.command()
async def voting(ctx, *text):
    # add the reactions to the message here or whatever

    # Here's how to wait for a reaction
    def check_reaction(reaction, user):
        return user == ctx.author

    reaction, user = await client.wait_for('message', check=check_reaction)

    # Here's how to wait for a message
    def check_message(message):
        return message.author == ctx.author

    message = await client.wait_for('message', check=check_message)

ждите_для

Хорошо, большое спасибо за этот хорошо объясненный ответ :) Я новичок в кодировании Python и не очень много об этом знаю...

neqt 20.12.2020 20:36

не беспокойтесь, не забудьте принять ответ, если он помог

Łukasz Kwieciński 20.12.2020 21:23

Другие вопросы по теме