Python:如何缩短它并使它更优雅?

时间:2019-05-15 10:22:49

标签: python design-patterns methods

我有几个使用列表推导生成数学表达式的类。所有这些类都生成具有相似结构的方程,但是存在一些细微差异。总体而言,这是很多代码,并且很难维护。我正在寻找使这段代码更短,更优雅的方法。

下面是一个说明问题的简化示例。 method_1存在于多个类中,但是取决于该类,表达式中的index_sets和exp_conditions会发生变化。

def method_1(index_1):
    if some_condition:
        exp_1 = min_num-sum([
                                variable[(index_1, index_2, index_3)] +
                                variable[(index_2, index_1, index_3)]
                                for index_2 in index_set_2 
                                for index_3 in index_set_3
                                if index_1 != index_2 and 
                                if exp_condition_1 and exp_condition_2
                                ])
        exp_2 = sum([variable[(index_1, index_2, index_3a)] +
                                variable[(index_2, index_1, index_3a)]
                                for index_2 in index_set_2 
                                for index_3 in different_index_set_3
                                if index_1 != index_2 and 
                                if exp_condition_1 and exp_condition_4
                                ])-max_num
    elif some_other_condition:
        exp_1 = min_num-sum([
                                variable[(index_1, index_2, index_3)]
                                for index_2 in index_set_2 
                                for index_3 in index_set_3
                                if index_1 != index_2 and 
                                if exp_condition_1 and exp_condition_2
                                ])
        exp_2 = sum([variable[(index_1, index_2, index_3a)]
                                for index_2 in index_set_2 
                                for index_3 in different_index_set_3
                                if index_1 != index_2 and 
                                if exp_condition_1 and exp_condition_4
                                ])-max_num
    else:
        exp_1 = self.min_num-sum([
                                variable[(index_2, index_1, index_3)]
                                for index_2 in different_index_set_2 
                                for index_3 in index_set_3
                                if index_1 != index_2 and 
                                if exp_condition_1 and exp_condition_5 and exp_condition_6
                                ])
        exp_2 = sum([variable[(index_2, index_1, index_3a)]
                                for index_2 in index_set_2 
                                for index_3 in different_index_set_3
                                if index_1 != index_2 and 
                                if exp_condition_1 and exp_condition_5 and exp_condition_6
                                ])-self.max_num
    return [exp_1, exp_2]

一贯相同的事情是,根据method_1中的条件,我们总是希望该方法返回两个条件:exp_1和exp_2。

exp_1 = min_num-term_1
exp_2 = term_2-max_num

min_num和max_num是常量,因此它们始终相同。

term_1和term_2是列表理解力的总和。这些列表理解具有类似的结构:

[some_expression for i in ..... for j in .... for x in ... if (list_of_conditions_depending_on_indexes)]

some_expression只能是字典中的值,例如my_dict [(i,j,k)]或字典中值的线性组合,例如my_dict[(i,j,k)]+my_other_dict[(i,j,l,m)]

我认为必须有某种方法可以将传回term_1和term_2的方法作为参数:

  • some_expression
  • index_sets
  • list_of_conditions_depending_on_indexes

如果some_expression和list_of_conditions_depending_on索引不依赖于索引集,那么所有这些都不会成为问题,而我正在努力寻找如何实现这一目标。

0 个答案:

没有答案