discord.py有没有更符合Python风格的方式创建指定管理员权限列表?
优化后的Python风格实现
你原来的写法可以正常运行,但存在两个可以优化的点:一是使用了Python内置关键字list作为变量名,会覆盖默认的列表类型定义,属于不推荐的实践;二是重复的if判断逻辑冗余,后续要调整权限列表需要修改多处代码。
你可以通过预定义权限映射表+列表推导式的方式简化逻辑:
# 预定义需要筛选的权限属性名和对应展示名称的映射关系 PERMISSION_MAPPING = { "administrator": "管理员", "manage_guild": "管理服务器", "manage_roles": "管理角色", "manage_channels": "管理频道", "manage_messages": "管理消息", "manage_webhooks": "管理Webhook", "manage_nicknames": "管理昵称", "manage_emojis": "管理表情", "kick_members": "踢出成员", "ban_members": "封禁成员", "mention_everyone": "@全体成员" } # 也可以保留你原来的英文显示名,直接修改映射的值即可 # 一行生成符合要求的权限列表 admin_permissions = [ display_name for perm_attr, display_name in PERMISSION_MAPPING.items() if getattr(member.guild_permissions, perm_attr) ]
这种写法的优势:
- 逻辑更简洁,没有冗余的重复判断
- 扩展性更强,后续需要新增/删除展示的权限,只需要修改
PERMISSION_MAPPING即可,不需要改动核心筛选逻辑 - 变量名语义清晰,不会污染内置命名空间
可选优化:由于discord权限体系中,拥有
administrator权限的用户默认拥有所有其他权限,如果你只需要展示管理员这一项而不需要列全其他权限,可以提前做判断减少遍历:if member.guild_permissions.administrator: admin_permissions = ["管理员"] else: admin_permissions = [ display_name for perm_attr, display_name in PERMISSION_MAPPING.items() if perm_attr != "administrator" and getattr(member.guild_permissions, perm_attr) ]
内容的提问来源于stack exchange,提问作者ggggggggggggggggggg
相关产品推荐
相关产品推荐

