You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.9 Driver类中替代switch-case的优雅方案咨询

优雅替代if-else的动作映射方案

在Python中处理这种“编号-方法”的映射需求,最常用且优雅的方案是字典映射法,另外还有枚举类、动态属性获取等可选方案,以下是具体实现:

1. 字典映射法(推荐)

直接构建一个以动作编号为键、对应方法为值的字典,初始化时完成映射,遍历输入数组即可直接调用方法,结构清晰且易于维护:

class Driver:
    def __init__(self, action_numbers):
        # 建立动作编号到方法的映射
        self.action_map = {
            0: self.act_left,
            1: self.act_right,
            2: self.act_straight,
            # 补充剩余7个动作的映射,格式为 编号: self.act_xxx
        }
        # 执行输入的动作序列
        self.run_actions(action_numbers)
    
    def act_left(self):
        print("执行左转动作")
    
    def act_right(self):
        print("执行右转动作")
    
    def act_straight(self):
        print("执行直行动作")
    
    # 此处添加剩余7个动作方法...
    
    def run_actions(self, action_numbers):
        for num in action_numbers:
            # 校验编号合法性,避免KeyError
            if action := self.action_map.get(num):
                action()
            else:
                print(f"忽略无效动作编号: {num}")

优势:

  • 新增/修改动作只需在字典中调整键值对,无需修改逻辑代码
  • 调用逻辑简洁直观,可读性强
  • 可以灵活处理非法编号

2. 枚举类增强语义

如果需要让动作编号更具语义性(避免硬编码数字),可以结合enum枚举类使用:

from enum import Enum

# 定义动作枚举,将编号与语义绑定
class ActionType(Enum):
    LEFT = 0
    RIGHT = 1
    STRAIGHT = 2
    # 补充剩余动作的枚举定义...

class Driver:
    def __init__(self, action_numbers):
        self.action_map = {
            ActionType.LEFT.value: self.act_left,
            ActionType.RIGHT.value: self.act_right,
            ActionType.STRAIGHT.value: self.act_straight,
            # 补充剩余映射
        }
        self.run_actions(action_numbers)
    
    # 动作方法同前...
    
    def run_actions(self, action_numbers):
        for num in action_numbers:
            try:
                self.action_map[num]()
            except KeyError:
                print(f"忽略无效动作编号: {num}")

优势:

  • 动作编号语义化,团队协作时更清晰
  • 避免数字硬编码带来的维护问题

3. 动态属性获取(适合方法命名有规律的场景)

如果你的动作方法命名严格遵循act_xxx的规则,且编号与方法后缀顺序一一对应,可以用getattr动态获取方法:

class Driver:
    def __init__(self, action_numbers):
        # 按编号顺序定义方法后缀
        self.action_suffixes = ["left", "right", "straight"]  # 补充剩余7个后缀
        self.run_actions(action_numbers)
    
    def act_left(self):
        print("执行左转动作")
    
    # 其他动作方法...
    
    def run_actions(self, action_numbers):
        for num in action_numbers:
            if 0 <= num < len(self.action_suffixes):
                method_name = f"act_{self.action_suffixes[num]}"
                # 动态获取方法并调用
                getattr(self, method_name)()
            else:
                print(f"忽略无效动作编号: {num}")

优势:

  • 无需手动维护映射字典,适合方法命名规则固定的场景
  • 代码量更少

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:54:24