如何重构Python的“switch语句”

1 投票
3 回答
713 浏览
提问于 2025-04-17 01:55

我正在重构一些我朋友写的代码,最近遇到了这个函数:

def setup_parameters(self, data):
    '''Parse raw data to determine game settings.'''
    for line in data.split('\n'):
      line = line.strip().lower()
      if line:
        tokens = line.split()

        self.L.debug("tokens: " + str(tokens))

        key = tokens[0]
        if key == 'cols':
          self.width = int(tokens[1])
        elif key == 'rows':
          self.height = int(tokens[1])
        elif key == 'player_seed':
          random.seed(int(tokens[1]))
        elif key == 'turntime':
          self.turntime = int(tokens[1])
        elif key == 'loadtime':
          self.loadtime = int(tokens[1])
        elif key == 'viewradius2':
          self.viewradius2 = int(tokens[1])
        elif key == 'attackradius2':
          self.attackradius2 = int(tokens[1])
        elif key == 'spawnradius2':
          self.spawnradius2 = int(tokens[1])

你可以看到,这里有一个很复杂的 switch 语句,明显可以用字典来替代。我很想把它写成一个类字典,因为键是固定的,但由于这些键对应的是实例的属性(比如 'cols': self.width),所以这样写会出错。

我的问题是,重构这样的代码的正确方法是什么呢?

3 个回答

1

设置一个字典,里面包含一些动作,比如:

actions = dict(cols = lambda tokens: setattr(self, "width", int(tokens[1]), ... 
               player_seed = lambda tokens: random.seed(int(tokens[1]))
              )

然后你可以这样做:

 actions[key](tokens)
1

你可以创建一个字典,把每个键当作访问器,然后用lambda函数来执行每个键对应的代码。

6

把键映射到属性的名称上,然后用setattr(self, attribute_name, int(tokens[1]))来设置这个值。比如:

attribute_dict = dict(cols="width", rows="height", turntime="turntime", ...)
[...]
value = int(tokens[1])
if key == "player_seed":
    random.seed(value)
else:
    setattr(self, attribute_dict[key], value)

撰写回答