如何在Python中为支持位运算的枚举构建高效可读字符串映射表
实现高效可维护的IntFlag枚举可读字符串映射表
初始化静态映射表strings_map的方案
你可以通过驼峰命名自动转换+静态字典推导的方式完成初始化,完全满足自动维护、高效查询的需求:
from enum import IntFlag, unique import re @unique class Privileges(IntFlag): """Privileges enum that supports bitwise operations""" NoPrivileges = 0 CanAddPost = 1 CanDeletePost = 2 CanBanUser = 4 CanResetPasswords = 8 CanModerateDiscussions = 16 CanSuspendAccounts = 32 All = CanAddPost | CanDeletePost | CanBanUser |\ CanResetPasswords | CanModerateDiscussions | CanSuspendAccounts # 工具函数:驼峰命名转可读小写字符串 def camel_to_readable(name): # 在每个大写字母前(非开头)插入空格,再转小写 return re.sub(r'(?<!^)(?=[A-Z])', ' ', name).lower() # 初始化静态映射表:仅保留单个权限位成员和无权限项 Privileges.strings_map = { member: camel_to_readable(member.name) for member in Privileges if member.value == 0 or (member.value & (member.value - 1)) == 0 }
关键细节说明
- 自动生成可读字符串:用正则表达式自动将驼峰式枚举名(如
CanAddPost)转换为空格分隔的小写字符串(如can add post),枚举新增/修改时无需手动更新映射。 - 过滤组合值:通过
member.value & (member.value - 1) == 0判断是否为单个权限位(2的幂),避免将All这类组合值加入映射表,保证映射表只存储基础权限项。 - 静态初始化:映射表仅在类定义后初始化一次,后续查询直接读取字典,无重复计算开销。
组合掩码查询实现
为了支持传入掩码组合后返回对应字符串列表,可添加一个轻量查询函数:
def get_privilege_labels(privilege_mask): if privilege_mask == Privileges.NoPrivileges: return [Privileges.strings_map[Privileges.NoPrivileges]] # 遍历基础权限项,匹配掩码中包含的权限 return [ label for priv, label in Privileges.strings_map.items() if priv != Privileges.NoPrivileges and (privilege_mask & priv) == priv ]
使用示例
# 查询单个权限 print(get_privilege_labels(Privileges.CanDeletePost)) # 输出: ['can delete post'] # 查询组合权限 combined_priv = Privileges.CanAddPost | Privileges.CanResetPasswords print(get_privilege_labels(combined_priv)) # 输出: ['can add post', 'can reset passwords'] # 查询无权限 print(get_privilege_labels(Privileges.NoPrivileges)) # 输出: ['no privileges']
内容的提问来源于stack exchange,提问作者tdemay
相关产品推荐
相关产品推荐

