You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
}

关键细节说明

  1. 自动生成可读字符串:用正则表达式自动将驼峰式枚举名(如CanAddPost)转换为空格分隔的小写字符串(如can add post),枚举新增/修改时无需手动更新映射。
  2. 过滤组合值:通过member.value & (member.value - 1) == 0判断是否为单个权限位(2的幂),避免将All这类组合值加入映射表,保证映射表只存储基础权限项。
  3. 静态初始化:映射表仅在类定义后初始化一次,后续查询直接读取字典,无重复计算开销。

组合掩码查询实现

为了支持传入掩码组合后返回对应字符串列表,可添加一个轻量查询函数:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:41:46