基于枚举值返回对应项目列表的更优实现方案咨询
优化方案建议
针对你当前的字典映射实现,这里有几个实用的优化方向,既能减少重复代码,也能提升维护性:
1. 提取复用的项目列表为常量,减少重复实例
当前代码中大量枚举对应完全相同的项目列表,直接重复定义会导致冗余,且修改时容易漏改。可以先把重复的列表定义为常量,再在字典中引用:
# 预先定义复用的项目列表常量 GROUP_A = [item1, item2, item3, item4, item5] GROUP_B = [item2, item3, item4, item5] GROUP_C = [item2, item3, item4, item6] GROUP_D = [item1, item2, item3, item4, item6] GROUP_E = [item1] GROUP_F = [item2, item3, item4] def Method(enum): mapping = { enum1: GROUP_A, enum2: GROUP_A, enum3: GROUP_B, enum4: GROUP_B, enum5: GROUP_B, enum6: GROUP_B, enum7: GROUP_B, enum8: GROUP_C, enum9: GROUP_D, enum10: GROUP_E, enum11: GROUP_E, enum12: GROUP_E, enum13: GROUP_E, enum14: GROUP_E, enum15: GROUP_F } return mapping[enum]
这样修改某个分组的项目时,只需要改动对应的常量,所有引用该常量的枚举都会同步生效,同时也节省了内存(避免创建多个内容相同的列表对象)。
2. 基于枚举属性分组匹配(适合枚举有扩展需求的场景)
如果你的枚举类型支持自定义属性(比如Python的Enum类),可以给每个枚举项添加分组标识,再通过分组映射到项目列表:
from enum import Enum class MyEnum(Enum): enum1 = 1 enum2 = 2 enum3 = 3 enum4 = 4 enum5 = 5 enum6 = 6 enum7 = 7 enum8 = 8 enum9 = 9 enum10 = 10 enum11 = 11 enum12 = 12 enum13 = 13 enum14 = 14 enum15 = 15 # 为每个枚举项定义分组属性 @property def group(self): if self in (MyEnum.enum1, MyEnum.enum2): return "A" elif self in (MyEnum.enum3, MyEnum.enum4, MyEnum.enum5, MyEnum.enum6, MyEnum.enum7): return "B" elif self == MyEnum.enum8: return "C" elif self == MyEnum.enum9: return "D" elif self in (MyEnum.enum10, MyEnum.enum11, MyEnum.enum12, MyEnum.enum13, MyEnum.enum14): return "E" elif self == MyEnum.enum15: return "F" # 分组到项目列表的映射 GROUP_TO_ITEMS = { "A": [item1, item2, item3, item4, item5], "B": [item2, item3, item4, item5], "C": [item2, item3, item4, item6], "D": [item1, item2, item3, item4, item6], "E": [item1], "F": [item2, item3, item4] } def Method(enum): return GROUP_TO_ITEMS[enum.group]
这种方式的优势是:后续新增枚举时,只需要在group属性的判断逻辑中添加新的分组规则,无需修改映射字典,扩展性更好。
3. 增强代码健壮性(可选)
为了避免传入未定义的枚举值导致KeyError,可以添加默认返回或明确的异常处理:
- 返回默认空列表:
return mapping.get(enum, []) - 抛出明确异常:
def Method(enum): mapping = { # ... 映射内容 ... } if enum not in mapping: raise ValueError(f"不支持的枚举值: {enum}") return mapping[enum]
内容的提问来源于stack exchange,提问作者Havyia Ayv
相关产品推荐
相关产品推荐

