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

Python如何基于SQL返回元组列表动态生成自定义IntEnum枚举

问题原因

Enum类的元类EnumMeta在解析类定义体时,会将命名空间内所有非下划线开头、非特殊方法/描述符的标识符识别为枚举成员。你在类内部写for循环时,循环变量i会被当作枚举成员名,第二次循环给i重新赋值时就会触发Attempted to reuse key: 'i'错误,本质是类体内部的临时变量被枚举元类误判为成员定义。

最优解决方案

使用Python枚举原生支持的函数式创建API动态追加成员,不需要修改原有枚举类的构造逻辑,兼容所有Python3版本,代码最简洁:

from enum import IntEnum, Enum

# 从SQL查询得到的元组列表
lst = [('PROCESS_0', 0, "value", 123, False), ('PROCESS_1',1,"anothervalue", 456, True)]

class Jobs(IntEnum):
    def __new__(cls, value: int, label: str, heartbeat: int = 60, heartbeat_required: bool = False):
        obj = int.__new__(cls, value)
        obj._value_ = value
        obj.label = label
        obj.heartbeat = heartbeat
        obj.heartbeat_required = heartbeat_required
        return obj

# 批量加载SQL数据生成枚举成员
Jobs = Enum(
    "Jobs",
    # 组装枚举成员映射:{成员名: 构造参数元组}
    {member_name: (val, label, hb, hb_required) for member_name, val, label, hb, hb_required in lst},
    # 绑定已定义的Jobs类,保留自定义__new__逻辑
    type=Jobs
)

使用验证

# 成员访问
print(Jobs.PROCESS_0)                  # Jobs.PROCESS_0
print(Jobs.PROCESS_0.value)            # 0
print(Jobs.PROCESS_0.label)            # value
print(Jobs.PROCESS_0.heartbeat)        # 123
print(Jobs.PROCESS_1.heartbeat_required) # True

# IntEnum特性保留,支持整数比较
print(Jobs.PROCESS_0 == 0)             # True
print(isinstance(Jobs.PROCESS_1, int)) # True

方案优势

  • 不需要自定义元类,不侵入枚举类的原有逻辑
  • 动态加载逻辑完全独立,后续SQL表结构调整只需要修改成员映射的组装逻辑即可
  • 完全避开类体内部定义临时变量导致的键重复问题
  • 保留IntEnum的所有原生特性,自定义属性正常挂载

如果使用Python 3.11及以上版本,也可以在类定义完成后调用Jobs.add_member()方法逐个追加成员,但批量加载场景下上述函数式方案效率更高。

内容的提问来源于stack exchange,提问作者max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:45:48