discord.py - 'command' 不可迭代?

discord.py - 'command' is not iterable?

我是 python 的新手,正在制作不和谐的机器人,如果这是一个菜鸟问题,我很抱歉,但我被困住了。

几个小时以来一直在努力弄明白。

我正在编写一个简单的机器人,它将遍历 28 个对象的列表并随机选择其中的 4 个。然后将这 4 个选择发送到聊天中,以便人们可以为他们的选择投票。

昨晚我在用

@client.event
async def on_message(message):
        if message.author == client.user:
                return

        if message.content.startswith('!maps'):
                await message.delete()
                channel = client.get_channel(800086126173225010)
                await channel.send('**New poll! Vote below now for tomorrow\'s map!**')
                choice = random.sample(maps,4)

                for x in range(0, 4):

                        mapemp.append(emoji[x]+" - "+choice[x])

                msg = await channel.send('\n\n'.join(mapemp))

                for x in range(0,4):
                
                        await msg.add_reaction(emoji[x]) 
                mapemp.clear()

这很好用。但后来我发现 @bot.command 而不是 @client.event 所以我想换成那个。但是,当我尝试 运行 命令时 returns

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: 'Command' object is not iterable

@bot.command(pass_context=True)
async def maps(ctx):
    await ctx.message.delete()
    channel = bot.get_channel(800086126173225010)
    await channel.send('**New poll! Vote below now for tomorrow\'s map!**')
    choice = random.sample(list(maps,4)

    for x in range(0, 4):

            mapemp.append(emoji[x]+" - "+choice[x])

    msg = await channel.send('\n\n'.join(mapemp))

    for x in range(0,4):
    
            await msg.add_reaction(emoji[x])
    mapemp.clear()

是什么让 @bot.command@client.event 如此不同以至于我无法遍历这些选择?

我以前没有 random.sample(list(maps,4),但是当我尝试 运行 它时 random.sample(maps,4) 我得到了一个不同的错误。

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: Population must be a sequence or set. For dicts, use list(d).

所以我将其更改为 random.sample(list(maps,4) 如果重要的话。

问题是你的函数名和列表名都是maps。因此,当您 运行 choice = random.sample(list(maps,4) 时,它认为您指的是函数 maps,而不是列表。为了解决这个问题,您要么想要

  1. 更改函数的名称(也更改命令的名称)。您只需将 async def maps(ctx): 更改为 async def newCommandName(ctx): 即可完成此操作(将 newCommandName 更改为您想要的函数新名称)。

  2. 更改 maps 列表的名称。我不知道这个定义在哪里,但我假设它是这样的maps = []。相反,您需要将名称更改为 mapsList 之类的名称,然后将对列表的所有引用更改为使用 mapsList

此外,作为旁注,choice = random.sample(list(maps,4) 应该是 choice = random.sample(list(maps),4)