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

如何在Python枚举中允许特定范围的未定义值?

需求描述

现有如下Python IntEnum定义:

class Result(IntEnum):
    A = 0 
    B = 1
    C = 3

我希望能动态创建新的枚举成员,但仅允许值处于指定范围内。例如定义:

class Result(IntEnum, valid_range=(4, 10)):
    A = 0 
    B = 1
    C = 3

预期行为

  • Result(10)可正常执行,返回一个.value为10的枚举实例;
  • Result(0)返回Result.A;
  • Result(20)或Result("hello")将抛出ValueError。

背景说明

此需求源于BACnet标准(一种楼宇管理/HVAC协议)。该协议定义了一组标准消息类型(如READ、WRITE、LIST)并映射为整数值,我已将其建模为枚举:

class MessageType(IntEnum):
    READ = 0
    WRITE = 1
    LIST = 2

并按如下方式使用:

from dataclasses import dataclass
import struct

@dataclass
class Message:
    message_type: MessageType
    data: bytes

def decode(raw: bytes) -> Message:
    message_type = MessageType(struct.unpack("!H", raw[:2])[0])
    data = raw[2:]
    return Message(message_type=message_type, data=data)

该协议允许厂商自定义消息类型,但限制其值必须处于特定范围(如10至20之间)。

已考虑的方案

  • 显式或动态为每个有效值添加枚举属性(如MessageType.VENDOR_10),但有效值数量可达数百万,多数不会被使用;
  • 不使用枚举,直接用int、int类型别名或自定义类;
  • 将Message的类型注解改为int | MessageType,解码时尝试创建MessageType,捕获ValueError后赋值为整数。

现寻求实现上述枚举功能的最优方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:46:23