如何避免重复if语句,实现多值匹配触发对应函数?
替代大量if/else的实现方案
下面给你几种实用的替代方案,涵盖不同复杂度的场景,解决你不想写一堆if判断的问题:
基础字典映射(单参数场景)
字典映射其实是最常用的替代方案,你觉得复杂可能是没找到简洁的写法。先把press_type和对应函数的映射关系提前定义,然后直接通过键取值调用,代码会清爽很多:
# 提前定义映射关系 PRESS_HANDLERS = { "keyboard": function1, "left click": function2, "right click": function3, "middle click": function4 } def start(press_type): # 取出对应处理函数,无匹配则用空操作避免报错 handler = PRESS_HANDLERS.get(press_type, lambda: None) handler()
后续新增press_type时,只需要在字典里加键值对即可,完全不用修改start函数的逻辑。
多参数场景的适配
如果还有其他带多选项的参数(比如同时存在press_type和device_type),可以用以下两种方式适配:
元组作为字典键
把多个参数组合成元组当作字典的键,直接匹配参数组合:
# 匹配press_type和device_type的组合 HANDLERS = { ("keyboard", "pc"): pc_keyboard_handler, ("keyboard", "mobile"): mobile_keyboard_handler, ("left click", "pc"): pc_left_click_handler, # ... 其他参数组合 } def start(press_type, device_type): handler = HANDLERS.get((press_type, device_type), lambda: None) handler()
嵌套字典
按参数层级嵌套字典,逐层匹配:
HANDLERS = { "keyboard": { "pc": pc_keyboard_handler, "mobile": mobile_keyboard_handler }, "left click": { "pc": pc_left_click_handler, # ... 其他设备对应的处理函数 } } def start(press_type, device_type): # 链式get避免KeyError,无匹配则用空操作 handler = HANDLERS.get(press_type, {}).get(device_type, lambda: None) handler()
装饰器注册方案(高扩展性场景)
如果需要频繁新增处理逻辑,或者不想把所有函数提前写到字典里,可以用装饰器注册处理函数,灵活性拉满:
press_handlers = {} def register_press_handler(press_type): def decorator(func): press_handlers[press_type] = func return func return decorator # 用装饰器直接注册处理函数 @register_press_handler("keyboard") def function1(): print("处理键盘输入") @register_press_handler("left click") def function2(): print("处理左键点击") def start(press_type): handler = press_handlers.get(press_type, lambda: None) handler()
新增press_type的处理逻辑时,只需要给对应函数加个装饰器,完全不用修改start函数或映射字典,维护成本极低。多参数场景下,也可以把装饰器参数改成元组(比如@register_press_handler(("keyboard", "pc"))),逻辑和元组键方式一致。
类策略模式(复杂业务场景)
如果每个处理逻辑涉及状态管理、上下文复用等复杂需求,可以用类封装不同的处理策略:
class PressHandler: def handle(self): pass # 默认空实现 class KeyboardHandler(PressHandler): def handle(self): print("处理键盘输入") class LeftClickHandler(PressHandler): def handle(self): print("处理左键点击") # 映射类型和对应的处理类 HANDLER_CLASSES = { "keyboard": KeyboardHandler, "left click": LeftClickHandler, # ... 其他类型 } def start(press_type): handler_cls = HANDLER_CLASSES.get(press_type, PressHandler) handler = handler_cls() handler.handle()
这种模式适合处理逻辑复杂、需要复用公共方法的场景,扩展性和可读性都很强。
内容的提问来源于stack exchange,提问作者ori raisfeld
相关产品推荐
相关产品推荐

