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



我正在对我的不和机器人执行命令,它根据用户对命令的响应发送回响应。我有一个while循环,在这里我遍历所有可能的答案如果它们都不为真,那么就转到else语句。然而,每次循环运行时,它都会根据第一个语句返回答案(如果答案是高的),并且实际上似乎并不关心其他elif语句。这和那封短信有关吗。内容部分,因为它们似乎根本不起作用?这里是循环:

编辑:添加整个事件

@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

命令在一个齿轮中。

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

message.content == 'high' or 'low' or 'vihje' and message.channel == channel总是True

在我看来,当message.content是高,低或vihje之一时,当message.channelchannel时,您希望check()返回True。不幸的是,你的第一个条件的语法是不正确的,它总是计算为True,因为Pythonstrs的真实性。这样做的结果是,即使message.content是'pinkalicious'甚至None,check()也可以返回True。将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')

最新更新