Python: Как я могу сократить это и сделать его более элегантным? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть несколько классов, которые генерируют математические выражения, используя списочные выражения.Все эти классы генерируют уравнения, которые имеют похожую структуру, но есть небольшие отличия.В целом, это много кода и его немного сложно поддерживать.Я ищу способы сделать этот код короче и элегантнее.

Ниже приведен упрощенный пример, иллюстрирующий проблему.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 не будут зависеть от наборов индексов, и я изо всех сил пытаюсь понять, как этого добиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...