如何重构Python“switch语句”

2024-09-28 01:28:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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”):自身宽度)这无法编译。在

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


Tags: key代码selfdataiflineint重构
3条回答

将键映射到属性的名称,并使用setattr(self, attribute_name, int(tokens[1])来设置值。E、 g.:

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函数为每个键执行代码。在

用以下操作设置dict

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

然后:

^{pr2}$

相关问题 更多 >

    热门问题