我对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
答案 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"
if member == "person1#1234"
由于第二部分的原因,它将始终为if "person2#2345"
,并且仅当对象为True
时才为False
,但是因为字符串不是{{ 1}},它将为None
。
希望这很有道理。
参考:
Guild.ban()
Member.id
discord.Member
-检出None
,以查看转换为str时返回的内容答案 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")