Skip to main content
 首页 » 编程设计

python之如何重构 Python "switch statement"

2025年05月04日10wayfarer

我正在重构 friend 编写的一些代码,最近偶然发现了这个函数:

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),因此无法编译。

那么我的问题是,重构此类代码的正确方法是什么?

请您参考如下方法:

将键映射到属性的名称,并使用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)