Discord.py API: цикл не прерывается, когда пользователь вводит «bingo»

#python #discord #discord.py

#python #Discord #discord.py

Вопрос:

 elif "!bingo" in message.content.lower():
        await message.channel.send("Here's your miniature Bingo sequence")
        shuffled = shuffle(bingo)
        await message.channel.send(bingo[0:3])
        await message.channel.send(bingo[3:6])
        await message.channel.send(bingo[6:9])
        channel = message.channel
        while userinput != "bingo":
            await message.channel.send("Type anything to move on, or type bingo to end!")
            def check(m):
                return m.channel == channel
                userinput[0](str(m.content))
            if message.author == client.user:
                return
            else:
                msg = await client.wait_for('message', check=check)
                if str(userinput) == "bingo":
                    break
                else:
                    await message.channel.send(random.randint(1,9))
  

Предполагается, что функция прерывается при вводе bingo, но по какой-то причине строка userinput не имеет никакого значения. Это определено ранее в коде, поэтому это не причина проблемы.

Пожалуйста, помогите, спасибо

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

1. Спасибо всем, я нашел решение. Оба комментария не решили проблему полностью (хотя второй комментарий помог мне найти проблему, которая присутствовала), цикл был в порядке, но проблема заключалась в том, что вы не можете сравнивать str(userinput) со строкой, потому userinput что переменная представляет собой список. Очень любительская ошибка. В любом случае, оператор if был изменен на if "bingo" in userinput: . Все остальное осталось прежним. Еще раз спасибо за вашу помощь!

2. Вы можете самостоятельно ответить и принять свой вопрос, это поможет другим найти этот ответ в будущем.

Ответ №1:

     def check(m):
        return m.channel == channel
        userinput[0](str(m.content))
  

Вторая часть никогда не выполняется, поскольку вы всегда возвращаетесь с первым оператором.
So userinput никогда не устанавливается m.content по назначению.

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

1. Спасибо за вашу помощь! В этом утверждении была проблема, поскольку он не выполнял проверку. Однако возникла более серьезная проблема, которую userinput невозможно было сравнить. Вместо этого я использовал in оператор.

Ответ №2:

Довольно простой ответ:

 if str(userinput) == "bingo":
    return
  

break предполагается, что он используется для выхода из функции. И в любом случае он не работает так хорошо, как задумано.

Извините, если я ошибаюсь, я довольно новичок в discord.py , но я не новичок в Python. Discord.py возможно, что-то меняется, связанное с Python. Если это не сработает, к сожалению, я, вероятно, не смогу вам помочь.

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

1. Я думаю, что break используется для выхода из цикла while, а не функции. Использование возврата в этот момент изменяет поведение, поскольку никакой код после цикла while в этой функции выполняться не будет.

2. Ну, как я уже говорил, break это не очень надежно.

3. Что заставляет вас так думать? Я никогда не слышал ни о каком случае, когда break не работал должным образом. У вас есть какие-либо доказательства или пример? Описание того, что должен делать break, см. В документе Python: «Оператор break, как и в C, выходит из самого внутреннего окружающего цикла for или while».

4. По моему опыту, break не удается выйти из программы.

5. Что вы подразумеваете под выходом из программы? Ни return, ни break не завершают программу. Return завершает работу функции, а break завершает цикл или переключатель / регистр…