2011-09-09 177 views
1

我重構一些代碼,一個朋友寫的,最近碰到這個功能偶然發現:如何重構Python的「switch語句」

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),所以不能編譯。

我的問題是,什麼是重構這種代碼的正確方法?

+0

重複的問題:http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in -python – JBernardo

+3

「清楚」?基於什麼? –

+1

看到你正在努力重構代碼,我建議你看看並使用標準的Python ConfigParser模塊 – fabrizioM

回答

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) 
+1

他有一個調用random.seed(int(tokens [1])),所以這將不起作用所有的情況。 –

+0

這就是爲什麼它是由一個單獨的「if」分支處理:) –

+0

那麼,直到你編輯它,並把代碼示例在:) –

1

您可以使用鍵作爲訪問器和lambda函數來構建一個字典,以執行每個鍵的代碼。

1

設置與操作的字典一樣

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

然後:

actions[key](tokens)