如何更优雅地重写代码

时间:2011-06-21 17:00:56

标签: python

下面的代码从文件中读取行,然后执行自定义函数(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])

...

我的问题是:可以将代码修改为更优雅的版本吗?毕竟,许多代码是相似的(我不想定义另一个函数来简化它,因为在定义新函数后代码仍然相似)。感谢。

6 个答案:

答案 0 :(得分:8)

使用列表condition_*

,而不是使用5个变量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])

答案 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)]

答案 2 :(得分:0)

'line'未在循环中引用,是否在简化发布时出错?

怎么样

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

答案 3 :(得分:0)

在纯粹语法层面重构代码之前(上面的示例中已经介绍过),评估您在功能级别上对代码执行的操作可能很有用

查看您的condition_x变量。我认为你可能在两个不同的东西(包括类型和逻辑上)使用相同的变量 - 通常在弱类型语言中是一个坏主意。它看起来好像用户将条件设置为true或false,然后为该条件分配输出 - 是输出布尔值?它与该变量的原始值有关吗?重新考虑这可能会导致更易理解的代码。

在没有看到condition_x的内容的情况下评估如何重构这一点也很困难 - 因为这些可能具有共性。

答案 4 :(得分: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

对不起,如果重复

答案 5 :(得分: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])