我对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
成员对象的字符串表示(即打印或放入字符串时)是用户名+鉴别器。但是当您在语句中使用member对象时,它不会将其转换为字符串
有两种方法可以解决这个问题:
这将检查作为字符串的成员。另一种方法是通过ID(ID更“安全”,因为ID永远不会改变,但用户可以改变他们的名字和识别码)
另一件需要注意的事情是,当机器人编辑角色、尝试更改用户名或踢/禁止某人,而此人的权限高于机器人(即服务器所有者)时,它将抛出
Forbidden
错误,因为它在层次结构中的级别不够高,无法执行该操作最后一件事是在if语句中,您正在检查
member == "person#1234" or "person2#2345"
,这在简单的英语中非常有意义。但是,当解释器对语句求值时,它会分别对语句求值:if member == "person1#1234"
if "person2#2345"
由于第二部分的原因,它将始终计算为
True
,并且只有当对象为None
时才是False
,但是因为字符串不是None
,所以它将是True
希望这有点道理
参考文献:
str(x)
以查看转换为str时返回的内容表达式
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")
相关问题 更多 >
编程相关推荐