【问题标题】:discord.py - Is there a more pythonic way to create list of specified permissions?discord.py - 是否有更 Pythonic 的方式来创建指定权限列表?
【发布时间】:2021-10-19 13:31:34
【问题描述】:

底部代码

我现在的目标基本上是实现创建指定管理权限的列表。我能够做到这一点,但我想知道是否会有更pythonic的方式来实现这一点。您可能已经知道,discord.py 权限具有类似guild_permissionsguild_permissions.text 之类的列表,但它们没有我想要列出的所有管理权限的所有指定权限。

    list = []
    if member.guild_permissions.administrator:
        list.append("Administrator")
    if member.guild_permissions.manage_guild:
        list.append("Manage Server")
    if member.guild_permissions.manage_roles:
        list.append("Manage Roles")
    if member.guild_permissions.manage_channels:
        list.append("Manage Channels")
    if member.guild_permissions.manage_messages:
        list.append("Manage Messages")
    if member.guild_permissions.manage_webhooks:
        list.append("Manage Webhooks")
    if member.guild_permissions.manage_nicknames:
        list.append("Manage Nicknames") 
    if member.guild_permissions.manage_emojis:
        list.append("Manage Emojis")
    if member.guild_permissions.kick_members:
        list.append("Kick Members")
    if member.guild_permissions.ban_members:
        list.append("Ban Members")   
    if member.guild_permissions.mention_everyone:
        list.append("Mention Everyone")

【问题讨论】:

    标签: python python-3.x discord discord.py append


    【解决方案1】:

    根据@Chuaat 的回答,您还可以根据您感兴趣的属性名称列表动态地执行此操作:

    # the permissions to check
    perms_to_check = [
        "administrator",
        "manage_guild",
        "manage_roles",
        "manage_channels",
        "manage_messages",
        "manage_webhooks",
        "manage_nicknames",
        "manage_emojis",
        "kick_members",
        "ban_members",
        "mention_everyone",
    ]
    
    perm_list = discord.Permissions()
    for perm in perms_to_check:
        if getattr(member.guild_permissions, perm):
            perm_list.update(**{perm: True})
    

    或者,一旦你知道感兴趣的权限值,你可以直接用一些数学来做同样的事情

    # this is the value of Administrator | Manage Server | Manage Roles, ... etc.
    perms_to_check_flags = 2013405246
    perm_list = discord.Permissions(permissions=perms_to_check_flags & member.guild_permissions.value)
    

    【讨论】:

    • TypeError: &: 'int' 和 'Permissions' 的操作数类型不受支持
    • 我知道权限计算器中的 2013405246 是什么,但是会做什么?
    • @ineedhelp 啊,抱歉 - 忘记了.value,现在应该可以使用了
    • & 是 python 中的按位“与”运算符。公会权限值是一种“标志”,一种设计为 s.t. 的常见模式。在二进制中,每个 1 代表 True 或 on,每个 0 代表 False 或 off。因此,当您运行 2013405246 和 member.guild_permissions.value 时,您将获得一个新数字 s.t.仅当成员都具有该权限并且它是感兴趣的权限之一时,每个权限才为真。换句话说,你得到代表两者交集的值,例如用户拥有的所有您感兴趣的权限。
    • 没关系,你知道如何重新安排订单吗?如果你不这样做也没关系
    【解决方案2】:

    你应该使用discord.py提供的permission对象:

    permissionList = discord.Permissions()
    if member.guild_permissions.administrator:
        permissionList.update(administrator = True)
    if member.guild_permissions.manage_guild:
        permissionList.update(manage_guild=True)
    if member.guild_permissions.manage_roles:
        permissionList.update(manage_roles=True)
    # ....
    

    然后您就有了一个权限对象,其工作方式与例如 guild_permissions.text 相同

    【讨论】:

    • 小错字,应该是permissionList.update(manage_roles=True)
    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 2010-10-29
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2018-12-29
    相关资源
    最近更新 更多