检查Discord服务器中成员的循环出现问题

2024-10-01 05:06:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python非常陌生,所以这让我很困惑。我试图检查一个列表中的所有成员,其中每个成员都会检查它是否是人a/人B,然后根据它是否是那个人做某件事。出于某种原因,当第一个被检查的人与它检查的人相同时,它表示下面所有的人也都是那个人。 该代码用于清除discord服务器中的所有成员,除了少数成员(用于在小游戏后重置)

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

Tags: tonamemessage列表display成员memberctx
2条回答

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

有两种方法可以解决这个问题:

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

这将检查作为字符串的成员。另一种方法是通过ID(ID更“安全”,因为ID永远不会改变,但用户可以改变他们的名字和识别码)

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

另一件需要注意的事情是,当机器人编辑角色、尝试更改用户名或踢/禁止某人,而此人的权限高于机器人(即服务器所有者)时,它将抛出Forbidden错误,因为它在层次结构中的级别不够高,无法执行该操作

最后一件事是在if语句中,您正在检查member == "person#1234" or "person2#2345",这在简单的英语中非常有意义。但是,当解释器对语句求值时,它会分别对语句求值:

  • if member == "person1#1234"
  • if "person2#2345"

由于第二部分的原因,它将始终计算为True,并且只有当对象为None时才是False,但是因为字符串不是None,所以它将是True

希望这有点道理


参考文献:

表达式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")

相关问题 更多 >