Python大小写不敏感StrEnum实现疑问:为何部分场景匹配失效?
大小写不敏感的Python StrEnum实现问题
我尝试构建大小写不敏感的Python枚举(StrEnum),参考了如下实现方案:
from enum import StrEnum, auto class Fruits(StrEnum): DRAGON_FRUIT = auto() APPLE = auto() @classmethod def _missing_(cls, value): value = value.lower() for member in cls: if member == value: return member return None if Fruits.DRAGON_FRUIT == "dragon_fruit": print(True) else: print(False) if Fruits.DRAGON_FRUIT == "dragon_Fruit": print(True) else: print(False) if Fruits.APPLE == "apple": print(True) else: print(False) if Fruits.APPLE == "Apple": print(True) else: print(False)
测试结果为:True、False、True、False。我认为该方案应该生效,因为已对输入值执行转小写操作并比较,但部分场景匹配失败,请问原因是什么?
问题原因
你的测试逻辑根本没触发_missing_方法——这个方法只有在通过枚举类实例化或查找成员(比如Fruits("dragon_Fruit"))时,当传入的值匹配不到任何成员的原始值,才会被调用。而你直接用Fruits.DRAGON_FRUIT == "dragon_Fruit"是在做普通的字符串相等比较:枚举成员的字符串值是"dragon_fruit",和"dragon_Fruit"大小写不一致,自然返回False。
解决办法
根据你的需求,有两种可行的调整方式:
方式1:通过枚举类查找成员时支持大小写不敏感
保留_missing_方法,但调用时使用Fruits(value)的方式获取枚举成员,而非直接用成员和字符串比较:
# 这样会触发_missing_,返回正确的成员 print(Fruits("dragon_Fruit") == Fruits.DRAGON_FRUIT) # 输出True
方式2:让枚举成员与任意大小写字符串直接比较时返回True
重写枚举的__eq__方法,同时完善_missing_的匹配逻辑:
from enum import StrEnum, auto class Fruits(StrEnum): DRAGON_FRUIT = auto() APPLE = auto() def __eq__(self, other): # 处理与字符串的大小写不敏感比较 if isinstance(other, str): return self.value.lower() == other.lower() # 保留与其他枚举成员的正常比较逻辑 return super().__eq__(other) @classmethod def _missing_(cls, value): # 统一转小写后匹配成员值 target = value.lower() for member in cls: if member.value.lower() == target: return member return None # 现在所有测试都会返回True print(Fruits.DRAGON_FRUIT == "dragon_fruit") # True print(Fruits.DRAGON_FRUIT == "dragon_Fruit") # True print(Fruits.APPLE == "apple") # True print(Fruits.APPLE == "Apple") # True
内容的提问来源于stack exchange,提问作者user2816215
相关产品推荐
相关产品推荐

