Python Enum类是否内置大小写不敏感字符串匹配的惯用实现?
大小写不敏感的Enum匹配实现方案
Python标准库的Enum类没有直接内置大小写不敏感的匹配方法,但可以通过以下两种惯用方式实现,无需重复编写样板代码,同时保留枚举值原有格式:
1. 自定义枚举基类(通用复用)
创建一个支持大小写匹配的基类,所有需要该功能的枚举都继承它:
from enum import Enum class CaseInsensitiveEnum(Enum): @classmethod def match(cls, s: str) -> Enum | None: s_lower = s.lower() for member in cls: if member.value.lower() == s_lower: return member return None # 示例使用 class Fruit(CaseInsensitiveEnum): APPLE = "Apple" ORANGE = "Orange" BANANA = "Banana" # 调用测试 print(Fruit.match("apple")) # 输出: Fruit.APPLE print(Fruit.match("ORANGE")) # 输出: Fruit.ORANGE print(Fruit.match("grape")) # 输出: None
2. 预构建小写映射(高效查找)
利用Enum内置的_value2member_map_属性,提前生成小写值到枚举成员的映射,适合成员较多的场景:
from enum import Enum class Fruit(Enum): APPLE = "Apple" ORANGE = "Orange" BANANA = "Banana" # 初始化时构建小写映射 _lower_value_map = {v.lower(): member for v, member in _value2member_map_.items()} @classmethod def match(cls, s: str) -> Fruit | None: return cls._lower_value_map.get(s.lower()) # 调用测试 print(Fruit.match("apple")) # 输出: Fruit.APPLE
两种方案都不会修改原有枚举值的格式,完全满足你在其他场景使用CamelCase展示的需求。
内容的提问来源于stack exchange,提问作者Alex Eustis
相关产品推荐
相关产品推荐

