Python while 循环仅首先检查 if 语句(discord.py)

时间:2021-02-27 17:24:32

标签: python-3.x discord.py

我正在对我的不和谐机器人执行命令,它会根据用户对命令的响应发回响应。我有一个 while 循环,在那里我遍历所有可能的答案,如果它们都不正确,则转到 else 语句。但是,每次循环运行时,它都会根据第一个语句返回答案(如果答案为高)并且实际上似乎并不关心其他 elif 语句。这是否与 message.content 部分有关,因为它们似乎根本不起作用?这是循环:

编辑:添加了整个事件

@commands.Cog.listener()
    async def on_message(self, message):
        if '.highlow' in message.content:
            randomnumber = random.randint(0,100)
            hintnumber = random.randint(0,100)
            channel = message.channel
            await channel.send('Satunnainen luku on valittu väliltä ``0-100``.\n'
                            f'Vihjeesi on ``{hintnumber}``.\n'
                            'Vastaa kirjoittamalla ``high``, ``low`` tai ``vihje``.')

            def check(message):
                return message.content == 'high' or 'low' or 'vihje' and message.channel == channel

            msg = await self.client.wait_for('message', check=check)

            while True:
                if message.author != self.client.user:
                    if 'high' in message.content:
                        if randomnumber > hintnumber:
                            await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten voitit pelin!'.format(msg))
                            break
                        elif randomnumber < hintnumber:
                            await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten hävisit pelin!'.format(msg))
                            break
                    elif 'low' in message.content:
                        if randomnumber < hintnumber:
                            await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten voitit pelin!'.format(msg))
                            break
                        elif randomnumber > hintnumber:
                            await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten hävisit pelin!'.format(msg))
                            break
                    elif 'vihje' in message.content:
                        if randomnumber == hintnumber:
                            await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten voitit pelin!'.format(msg))
                            break
                        elif randomnumber != hintnumber:
                            await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten hävisit pelin!'.format(msg))
                            break
                    else:
                        await channel.send('Tuo ei ole oikea vaihtoehto!')
                        break

命令在一个齿轮中。

1 个答案:

答案 0 :(得分:1)

问题出在check()。您的条件看起来不正确。

message.content == 'high' or 'low' or 'vihje' and message.channel == channel 将始终为 True

在我看来,当 check() 是高、低或 vihje 之一,并且当 Truemessage.content 时,您希望 message.channel 返回 channel .不幸的是,您的第一个条件的语法不正确,由于 Python TrueS 的 truthiness,它总是计算为 str。这样做的结果是,即使 check() 是“粉红色”甚至是 Truemessage.content 也可以返回 None。将 check() 重写为:

def check(message):
    return message.content in {'high', 'low', 'vihje'} and message.channel == channel

您的条件实际上被评估为:

(message.content == 'high') or ('low') or ('vihje') and (message.channel == channel)

由于非空 strS 评估为 True,因此您的条件是:

(message.content == 'high') or (True) or (True) and (message.channel == channel)

# Which reduces to
True

如果您想亲自查看 Python 字符串的真实性,请运行以下代码段:

if '':
    print('empty string is True')
else:
    print('empty string is False')

if 'foo':
    print('non-empty string is True')
else:
    print('non-empty string is False')

if 'false':
    print('"false" is True')
else:
    print('"false" is False')