我正在尝试为不和谐的bot(python)编写代码,以显示属于特定角色的成员列表。
很抱歉,这个问题很长,我是编程新手,并尽可能做到透彻,就像我边做边学。
@client.command()
async def team(ctx): # Always same role, no input needed
guild = ctx.message.guild
tk = guild.get_role(role_id)
tkm = tk.members
# print(type(tkm)) shows it as "list"
for row in tkm:
a = row.name
# print(type(a)) # shows "<class 'discord.member.Member'>" x amount of times
await ctx.send(a)
这确实可以完成一些工作。该漫游器在单独的消息中发送该角色中每个成员的名称,但是它很慢,甚至在列出4-5个成员之后每次都“停止”。 我四处搜寻,只发现类似的代码。
我不做ctx.send(tkm)的原因是,对于每个成员,它都包含太多信息。它可以一口气发布在聊天中。
[<Member id=_________ name='___' discriminator='__' bot=False nick='_____' guild=<Guild i
_______ name='________' shard_id=None chunked=True member_count=28>>,....]
这不会让我做tkm.name(这是一个列表,并且列表没有属性'name') 我只对名称感兴趣,因此“ a = row.name”确实为我提供了成员的名称。 但也会导致列表分裂并给我这些对象
<class 'discord.member.Member'>
<class 'discord.member.Member'>
...
...
我遇到的困难是: 我似乎无法执行tkm = tk.members.name(再次,因为没有属性'name')
我从这里想要的是将“ a”中的成员重新添加到列表中,然后在聊天中发布新列表。但是我似乎不知道如何。 或者,如果有一种方法可以操纵“ tkm”,使其仅以成员名开头,那么也可以。
谢谢:)
答案 0 :(得分:0)
首先,感谢您辛苦编写了如此详细的问题。这有点棘手,因为它包含一些猜测,因为我们无法通过一个可运行的示例轻松地重现该猜测。有关更多信息,请参见MCVE的文章。
但 ...由于您的问题如此详细,因此有助于进行一些“明智的猜测”。我的猜测是这样的:
我注意到了两件事:首先,您的代码中有此内容:
# print(type(a)) # shows "<class 'discord.member.Member'>" x amount of times
还有这个:
...这是一个列表,并且列表没有属性'name'...
所以我的猜测是您有一个dicord.member.Member
对象的列表。每个这样的“成员”可能都有 属性name
。但是您会遇到的困扰是:“如何从该列表中获取每个成员的姓名?”。
您可以使用“循环”执行此操作。 Python中有一个非常不错的形式,称为“列表理解”。在您的情况下看起来像这样:
names = [item.name for item in a]
您还可以编写一个更“传统”的循环,如下所示:
names = []
for item in a:
names.append(item.name)
两种形式是相同的
再次,这是一个疯狂的猜测,但是幸运的是,它将起作用:)