如何实现字符串匹配双常量,让First Team与First-Team均判定为CHOICE_B?
实现方案
最佳实践是将匹配逻辑统一封装在SomeChoices类内部,保证所有调用方使用一致的比对规则,避免逻辑分散导致的规则不一致问题。
基础实现(仅满足当前需求)
class SomeChoices(object): CHOICE_A = "Sub" CHOICE_B = "First Team" @classmethod def choices(cls): return cls.CHOICE_A, cls.CHOICE_B @classmethod def is_match_choice_b(cls, input_str: str) -> bool: # 对输入做归一化处理:替换连字符为空格,去除两端空白 normalized_input = input_str.strip().replace('-', ' ') return normalized_input == cls.CHOICE_B
业务侧直接调用即可:
# 调用示例 print(SomeChoices.is_match_choice_b("First Team")) # True print(SomeChoices.is_match_choice_b("First-Team")) # True print(SomeChoices.is_match_choice_b("Sub")) # False
可扩展实现(适配后续同类需求)
如果后续其他选项也需要类似的多格式匹配需求,可以抽离通用归一化逻辑,方便扩展:
class SomeChoices(object): CHOICE_A = "Sub" CHOICE_B = "First Team" @classmethod def choices(cls): return cls.CHOICE_A, cls.CHOICE_B @classmethod def _normalize(cls, s: str) -> str: """统一字符串归一化规则,可根据需求新增替换规则、大小写转换等""" return s.strip().replace('-', ' ') @classmethod def match_choice(cls, input_str: str): """匹配所有选项,匹配成功返回对应常量值,失败返回None""" normalized_input = cls._normalize(input_str) for choice in cls.choices(): if cls._normalize(choice) == normalized_input: return choice return None
调用示例:
print(SomeChoices.match_choice("First Team") == SomeChoices.CHOICE_B) # True print(SomeChoices.match_choice("First-Team") == SomeChoices.CHOICE_B) # True print(SomeChoices.match_choice("Sub") == SomeChoices.CHOICE_A) # True
方案优势
- 规则收敛:所有匹配逻辑统一维护在常量类中,不会出现不同业务场景比对逻辑不一致的问题
- 易扩展:后续需要新增匹配规则(如支持下划线、大小写不敏感)时,仅需要修改
_normalize方法一处即可 - 可读性强:业务侧调用语义清晰,不需要理解底层匹配规则即可直接使用
内容的提问来源于stack exchange,提问作者Priom
相关产品推荐
相关产品推荐

