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