我目前正打算用python做一个不和谐的机器人。自从我开始学习以来已经有大约1周的时间了,我认为我应该去尝试一下。我正在尝试清除功能,以清除聊天记录。我想让机器人说“请输入一个有效的数字”。如果键入除int
外的其他任何内容。一些字符。
例如,当我输入“ .clear t”时,它什么也不会做,并且在终端中很生气。当我输入“ .clear 3”之类的有效参数时,它将抛出“请输入有效数字”。清除所有内容后。
我尝试了if语句的不同变体,包括放置。无法解决。我觉得这应该放在if语句的位置。感谢您抽出宝贵的时间阅读。
@client.command(pass_context = True)
async def clear(ctx, number = 5):
number = int(number)
counter = 0
channel = ctx.message.channel
async for x in client.logs_from(ctx.message.channel, limit = number):
if counter < number:
await client.delete_message(x)
counter += 1
await asyncio.sleep(0.5)
if number != int():
await client.send_message(channel, "Please enter a valid number.")
答案 0 :(得分:1)
您需要学习如何正确检查对象的类型。在您的情况下,如果number = 5
并且您执行if number != int():
,则由于int()
返回0
,因此您基本上是在说if 5 != 0:
,总是这样。
要克服上述问题,请使用isinstance(obj, type)
。但是,这并不重要,因为number
始终是字符串(除非使用默认值)。
如果number
无法转换为整数,则具有以下行将引发错误。
number = int(number)
在引发ValueError
时,您需要抓住该错误才能发送错误消息。
@client.command(pass_context=True)
async def clear(ctx, number=5):
channel = ctx.message.channel
try:
number = int(number)
except ValueError:
return await client.send_message(channel, "Please enter a valid number.")
async for x in client.logs_from(channel, limit=number):
await client.delete_message(x)
await asyncio.sleep(0.5)
但是,使用discord.py,有一种更简单的方法,可以通过使用类型注释语法来进行类型对话:
@client.command(pass_context=True)
async def clear(ctx, number: int=5):
channel = ctx.message.channel
async for x in client.logs_from(channel, limit=number):
await client.delete_message(x)
await asyncio.sleep(0.5)
如果您迫切需要将该错误消息发送到频道,则可以通过on_command_error
事件来执行。 (搜索他们的文档)
您可能已经注意到,我删除了counter
部分,因为limit
的作用完全相同。 (已删除冗余)