Message.content.split() Discord.PY

#python #python-3.x #discord #discord.py

#python #python-3.x #Discord #discord.py

Вопрос:

У меня есть несколько команд, которые могут иметь более одного значения, для которых мне нужно разделить сообщение. Тогда проблема в том, что я хочу иметь возможность предоставить пользователю возможность использовать только 1 значение или до 4. Когда я использую message.content.split(" ", 4) , я получаю ошибку индекса, потому что он ожидает 4 значения. Есть ли более простой способ сделать это?

   if message.content.lower().startswith('!rip'):
        x = message.content.split(" ", 4)
        riptext = x[1]
        riptext2 = x[2]
        riptext3 = x[3]
        riptext4 = x[4]
        rip = discord.Embed(color=random.randint(0x000000, 0xFFFFFF))
        rip.set_image(
            url=f"http://www.tombstonebuilder.com/generate.php?top1={quote(riptext)}amp;top2={quote(riptext2)}amp;top3={quote(riptext3)}amp;top4={quote(riptext4)}amp;sp=")
        await client.send_message(message.channel, embed=rip)
  

Комментарии:

1. индексы начинаются с 0 !

2. у вас все еще есть проблема после исправления вашего индекса? Кроме того, почему вы используете 4 разных переменных? почему бы просто не использовать x[0],x[1] напрямую?

3. @penta я должен сохранить индекс 1-4, иначе он использует «!rip» в качестве первого значения. Но я все равно получаю ошибку indexerror, если я использую менее 4 значений.

4. Используйте http://pythontutor.com/visualize.html#mode=display для визуализации и отладки вашего кода, я думаю, вы можете использовать нарезку, чтобы игнорировать первый !rip

Ответ №1:

Вы можете обрезать split() вывод, чтобы игнорировать первый элемент ( '!rip' ), используя:

 message.content.split(" ",4)[1:]
  

Затем вы можете дополнить его пустыми строками, если длина меньше 4.

Обратите внимание, что нет необходимости в отдельных переменных riptext1 riptext2 , и т.д. Вы можете просто внести riptext в список и получить доступ, например. первый элемент с riptext[0] :

 if message.content.lower().startswith('!rip'):
    # store arguments in x, excluding the first element (!rip)
    x = message.content.split(" ",4)[1:]
    # pad x with empty strings in case there are less than 4 arguments, and store the result in riptext
    riptext = x[:4]   ['']*(4 - len(x))
    print(riptext)

    rip = discord.Embed(color=random.randint(0x000000, 0xFFFFFF))
    rip.set_image(
            url=f"http://www.tombstonebuilder.com/generate.php?top1={quote(riptext[0])}amp;top2={quote(riptext[1])}amp;top3={quote(riptext[2])}amp;top4={quote(riptext[3])}amp;sp=")
    await client.send_message(message.channel, embed=rip)
  

Например, если message.content = '!rip 1 2' ,

  • x будет ['1', '2']
  • riptext будет ['1', '2', '', '']

Комментарии:

1. Имеет большой смысл. Я знал, что мне нужно где-то добавить len(), чтобы подсчитать количество элементов, но не был уверен, как к этому подойти. Это отлично работает