【问题标题】:Issue with a loop which checks members in a Discord server检查 Discord 服务器中的成员的循环问题
【发布时间】:2020-05-29 20:00:07
【问题描述】:

我对 Python 还很陌生,所以这让我很困惑。我正在尝试检查列表中的所有成员,对于每个成员,它会检查它是否是人 A/人 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

【问题讨论】:

  • 试试if member == "person1#1234" or member == "person2#2345":
  • 检查人们的姓名/鉴别器是个坏主意,您应该使用 ID (member.id)。也如本金所说,or是低优先级操作,试试if member not in ('person1#1234', 'person2#2345')
  • 当使用if member not in ('person1#1234', 'person2#2345'): 并在下一行正确缩进ban 命令时,它仍然会尝试禁止这两个用户。有什么我可能做错了吗?编辑:就在我发布了这个 Diggy 之后,他的回复就解决了我的问题

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


【解决方案1】:

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

有几种方法可以解决:

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

另外需要注意的是,当机器人编辑角色、尝试更改用户名或踢/禁止某人并且该人具有比机器人更高的权限(即服务器所有者)时,它会抛出 @987654327 @error,因为它在层次结构中不够高,无法执行操作。

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

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

由于第二部分,它将始终评估为 True,并且只有在对象为 None 时才会为 False,但因为字符串不是 None,所以它将是True.

希望这是有道理的。


参考资料:

【讨论】:

  • 非常感谢,这确实是该声明始终正确,非常感谢您的帮助!
  • 别担心,一开始他们总是有点挑剔,但几次之后你就会变得自然!祝机器人好运:^)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-10-23
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多