我正在对我的不和机器人执行命令,它根据用户对命令的响应发送回响应。我有一个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.channel
是channel
时,您希望check()
返回True
。不幸的是,你的第一个条件的语法是不正确的,它总是计算为True
,因为Pythonstr
s的真实性。这样做的结果是,即使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)
由于非空str
S求值为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')