Python 3.x Python while循环只检查第一个if语句(discord.py)

Python 3.x Python while循环只检查第一个if语句(discord.py),python-3.x,discord.py,Python 3.x,Discord.py,我正在对我的discord bot执行一个命令,它根据用户对该命令的响应发回响应。我有一个while循环,在这个循环中,我遍历所有可能的答案,如果没有一个是正确的,那么转到else语句。但是,每次循环运行时,它都会根据第一条语句返回答案(如果答案为high),而实际上似乎并不关心其他elif语句。这是否与message.content部分有关,因为它们似乎根本不起作用?以下是循环: 编辑:添加整个事件 @commands.Cog.listener() async def on_messa

我正在对我的discord bot执行一个命令,它根据用户对该命令的响应发回响应。我有一个while循环,在这个循环中,我遍历所有可能的答案,如果没有一个是正确的,那么转到else语句。但是,每次循环运行时,它都会根据第一条语句返回答案(如果答案为high),而实际上似乎并不关心其他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
@commands.Cog.listener()
_消息上的异步定义(self,message):
如果message.content中的“.highlow”:
randomnumber=random.randint(0100)
hintnumber=random.randint(0100)
channel=message.channel
等待频道。发送('satuninen luku on valittu väliltä`0-100`.\n'
f'Vihjeesi在`{hintnumber}``上。\n
‘Vastaa kirjoittamalla ``高``低``泰``维耶`` `)
def检查(消息):
返回message.content=='high'或'low'或'vihje'和message.channel==频道
msg=wait self.client.wait_for('message',check=check)
尽管如此:
如果message.author!=self.client.user:
如果message.content中为“高”:
如果randomnumber>hintnumber:
等待频道。发送(f'satuninen luku oli`{randomnumber}``,joten voitit pelin!'。格式(msg))
打破
elif randomnumberhintnumber:
wait channel.send(f'satuninen luku oli`{randomnumber}``,joten hävisit pelin!'。格式(msg))
打破
message.content中的elif“vihje”:
如果randomnumber==hintnumber:
等待频道。发送(f'satuninen luku oli`{randomnumber}``,joten voitit pelin!'。格式(msg))
打破
elif随机数!=hintnumber:
wait channel.send(f'satuninen luku oli`{randomnumber}``,joten hävisit pelin!'。格式(msg))
打破
其他:
等待频道发送('Tuo ei ole oikea vaithotehto!')
打破

该命令位于一个齿轮中。

问题出在
check()
中。你的条件语句看起来不正确

message.content=='high'或'low'或'vihje'和message.channel==channel
将始终为
True

在我看来,您希望
check()
message时返回
True
。content
是high、low或vihje之一,而
message.channel
channel
。不幸的是,第一个条件的语法不正确,由于Python
str
S的原因,它的计算结果总是
True
。其效果是
check()
即使在
消息时也可以返回
True
。内容
是“pinkalicous”甚至
None
。将
check()重写为:

def检查(消息):
返回{'high','low','vihje'}中的message.content和message.channel==channel
您的条件值实际计算为:

(message.content='high')或('low')或('vihje')和(message.channel==channel)
由于非空的
str
S求值为
True
,因此您的条件是:

(message.content='high')或(True)或(True)和(message.channel==channel)
#减少到
真的
如果您想亲自查看Python字符串的真实性,请运行以下代码段:

如果“”:
print('空字符串为True')
其他:
print('空字符串为False')
如果“foo”:
打印('非空字符串为True')
其他:
打印('非空字符串为False')
如果“假”:
打印(“‘假’为真”)
其他:
打印(“‘假’为假”)

命令是什么/您是如何定义它的?@Dominik我将整个事件编辑为问题。我将检查函数更改为您建议的,但是现在我收到了以下错误:discord.ext.commands.errors.CommandInvokeError:command引发了异常:禁止:403禁止(错误代码:50013):缺少权限这到底意味着什么?@tontsa28错误应该是不言自明的:bot或用户缺少权限。请看以下内容:@Dominik yeah这是不言自明的,我只是想知道用户或机器人是否缺少权限。已成功修复,但bot缺少对专用通道的权限。