2011-06-21 169 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])