2011-06-21 219 views
0

下面的代碼從文件中讀取行,然後執行自定義函數(創建my_function)和返回值的變量(例如condition_A)如何重寫代碼更優雅

for line in input_file: 
    if condition_A: 
     condition_A = My_Function(A_tuple[0], B_tuple[0]) 

    if condition_B: 
     condition_B = My_Function(A_tuple[1], B_tuple[1]) 

    if condition_C: 
     condition_C = My_Function(A_tuple[2], B_tuple[2]) 

    if condition_D: 
     condition_D = My_Function(A_tuple[3], B_tuple[3]) 

    if condition_E: 
     condition_E = My_Function(A_tuple[4], B_tuple[4]) 

... 

我的問題是:代碼被修改爲更優雅的版本?畢竟,許多代碼是相似的(我不想定義另一個函數來簡化它,因爲在定義新函數後代碼仍然相似)。謝謝。

+2

你可以更具體的條件是什麼?你是否在測試各種事物的平等線,還是比這更復雜? –

+2

我正在投票結束這個問題,因爲代碼重構應該被問及Code Review而不是Stack Overflow。 – TylerH

回答

8

而不必5個變量condition_*的,使用列表,conditions

conditions=[1]*5 # initialize conditions as you wish 
for line in input_file: 
    for i,condition in enumerate(conditions): 
     if condition: 
      conditions[i]=My_Function(A_tuple[i],B_tuple[i]) 
+0

+1:這非常乾淨,最符合給定的例子。 –

1

什麼像

conditions = [condition_A, condition_B, condition_C, condition_D, condition_E] 
condition_test = lambda c, i: My_Function(A_tuple[i], B_tuple[i]) if c else c 
for line in input_file: 
    conditions = [condition_test(c, i) for i, c in enumerate(conditions)] 
0

'線' 是不是在格蘭循環引用,是一個錯誤簡化發佈?

如何

condition=1 #or 2 or... 
for line in input_file: 
    My_Function(A_tuple[condition],B_tuple[condition]) 
+0

對不起,這不是等值的。 – Pete

0

重構一個純粹的語法層次代碼(這是覆蓋在上面的例子中)之前,它可能是有用的,以評估你的代碼在功能級別

做什麼

查看你的condition_x變量。我認爲你可能對兩種不同的東西(類型和邏輯)都使用相同的變量 - 在弱類型語言中通常是一個壞主意。它看起來好像用戶將條件設置爲true或false,然後將該條件分配給輸出 - 是輸出布爾值?它與該變量的原始值有關嗎?反思這可能會導致更易於理解的代碼。

也很難評估如何在不看到什麼進入condition_x的情況下對其進行重構 - 因爲這些可能有共同之處。

0

還有一個樣品,經unutbu的(不解決方案):

data = [1,2,3,'',4,5,6, '', 0] 
for i in (i for i in xrange(len(data)) if data[i] not in ['',0]): 
    data[i] += 1 

如果對不起復制

0

這裏是一個通用的解決方案,你可以有自定義索引,你也可以通過名稱如果需要訪問條件是,它可以很容易地擴展到添加任何新的複雜性

class Condition(object): 
    def __init__(self, active, index1, index2): 
     self.active = active 
     self.index1 = index1 
     self.index2 = index2 

conditions = { 
    'A': Condition(True,0,0), 
    'B': Condition(True,1,1), 
    'C': Condition(True,2,2), 
    'D': Condition(True,3,3), 
    'E': Condition(True,4,4), 
} 

for line in input_file: 
    for condition in conditions.itervalues(): 
     if condition.active: 
      condition.active = My_Function(A_tuple[condition.active.index1], B_tuple[condition.active.index2])