如何在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
相关产品推荐
相关产品推荐

