“如何重构Python”;开关语句";

“如何重构Python”;开关语句";,python,switch-statement,Python,Switch Statement,我正在重构一位朋友编写的一些代码,最近偶然发现了这个函数: 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.debu

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

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\u 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)
将键映射到属性的名称,并使用
setattr(self,attribute\u 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)

您可以使用键作为访问器和lambda函数建立字典,以执行每个键的代码。

您可以使用键作为访问器和lambda函数建立字典,以执行每个键的代码。

使用以下操作设置dict

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

 actions[key](tokens)

设置一个dict,操作如下

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

 actions[key](tokens)

重复问题:看到你正在努力重构代码,我建议你看看并使用标准的python配置解析器模块重复问题:看到你正在努力重构代码,我建议你看看并使用标准的python配置解析器模块他调用了random.seed(int(tokens[1])),所以这不适用于所有情况。这就是为什么它由一个单独的
if
branch:)处理,直到您编辑它并将代码示例放入:)他调用了random.seed(int(tokens[1]),所以它不适用于所有情况。这就是为什么它由一个单独的
if
分支处理:)在您编辑它并将代码示例放入之前,它并不存在:)