循环的问题,该循环检查Discord服务器中的成员

时间:2020-05-29 11:42:11

标签: python discord.py discord.py-rewrite

我对Python还是很陌生,所以这让我很困惑。我正在尝试检查列表中的所有成员,在其中为每个成员检查是人A /人B还是都不是人B,然后根据是否是该人来做某件事。由于某种原因,当第一个检查的人与它所检查的人相同时,它表示随后的所有人也都是该人。 该代码用于清除不和谐服务器中的所有成员,但少数成员除外(用于在迷你游戏后重置)。

async def serverreset(ctx):
for member in ctx.message.guild.members:
    print(member)
    if member == "person1#1234" or "person2#2345":
        print(f"Unable to ban {member.display_name}")
    else:
        await member.ban(reason="Reset", delete_message_days=7)
        print(f"Banned {member.display_name}")

运行程序的结果:

person1#1234
Unable to ban person1
person2#2345
Unable to ban person2
accountthatshouldbebanned#5678
Unable to ban accountthatshouldbebanned

2 个答案:

答案 0 :(得分:2)

发生的事情是成员对象的字符串表示形式(即,在打印或放入字符串中时)是用户名+鉴别符。但是,当您在语句中使用成员对象时,它不会将其转换为字符串。

您可以通过以下几种方式进行操作:

if str(member) in ["person1#1234", "person2#2345"]:
    print(f"Unable to ban {member.display_name}")
else:
    # other code

这将检查成员是否为字符串。另一种选择是通过ID来做到这一点(因为ID永不更改,但用户可以更改其名称和区分符,因此更具“故障保护”功能。)

if member.id in [112233445566778899, 223344556677889900]:
    print(f"Unable to ban {member.display_name}")
else:
    # other code

要注意的另一件事是,当漫游器编辑角色,尝试更改用户名或踢人/禁止某人且该人具有比漫游器(即服务器所有者)更高的特权时,它将抛出{{ 1}}错误,因为它在层次结构中不够高,无法执行操作。

最后一件事是您的if语句中,您正在检查Forbidden,用通俗易懂的英语来说,这很有意义。但是,当解释器评估语句时,它将单独执行语句:

  • member == "person#1234" or "person2#2345"
  • OR
  • if member == "person1#1234"

由于第二部分的原因,它将始终为if "person2#2345",并且仅当对象为True时才为False,但是因为字符串不是{{ 1}},它将为None

希望这很有道理。


参考:

答案 1 :(得分:1)

表达式member == "person1#1234" or "person2#2345" 实际上被解析为( member == "person1#1234") or ("person2#2345),它将始终评估为True

您需要使用 member == "person1#1234" or member == "person2#2345"

您也可以使用 member in ("person1#1234", "person2#2345")