Как в такой ситуации следовать принципу DRY?
Возможно я сотворил чудовище, и оно не даёт мне спать по ночам:
i = -1
while i !=4:
GoodLabel = QLabel(self,margin=10,)
GoodLabel.setStyleSheet("border: 1px solid black;")
i+=1
if i == 0:
GoodLabel.setMaximumWidth(84)
GoodLabel.setAlignment(Qt.AlignLeft)
GoodLabel.setText(str(Time))
if ViewMod == False:
if i == 1:
GoodLabel.setMinimumWidth(160)
GoodLabel.setAlignment(Qt.AlignLeft)
GoodLabel.setText(Lesson)
if i == 2:
GoodLabel.setMaximumWidth(60)
GoodLabel.setText(Audit)
if i == 3:
GoodLabel.setMaximumWidth(80)
GoodLabel.setText(teacher)
else:
if i == 1:
GoodLabel.setMinimumWidth(60)
GoodLabel.setAlignment(Qt.AlignLeft)
GoodLabel.setText(group)
if i == 2:
GoodLabel.setMaximumWidth(160)
GoodLabel.setText(Lesson)
if i == 3:
GoodLabel.setMaximumWidth(80)
GoodLabel.setText(Audit)
Ответы (3 шт):
Вариант упрощения для DRY (не проверял работоспособность).
def dry_func (MaximumWidth, Alignment, Text):
GoodLabel.setMaximumWidth(MaximumWidth)
if Alignment != None:
GoodLabel.setAlignment(AlignLeft)
GoodLabel.setText(Text)
i = -1
while i !=4:
GoodLabel = QLabel(self,margin=10,)
GoodLabel.setStyleSheet("border: 1px solid black;")
i+=1
if i == 0:
dry_func (84, Qt.AlignLeft, str(Time))
if ViewMod == False:
if i == 1:
dry_func(160, Qt.AlignLeft, str(Lesson))
elif i == 2:
dry_func(60, None, Audit)
elif i == 3:
dry_func(80, None, teacher)
else:
if i == 1:
dry_func(60, None, group)
elif i == 2:
dry_func(160, None, Lesson)
elif i == 3:
dry_func(80, None, Audit)
- Во-первых, конечно же нужно вынести повторяющийся код в функцию (это вообще самое очевидное, что можно сделать, если есть какой-то повторяющийся код)
- Для создания 4 объектов в данном случае не нужен цикл со счетчиком - просто 4 раза вызовите функцию. Сразу отпадет необходимость проверять значение счетчика
i. if ViewMod == False:немного извращенно: или замените наif not ViewMod:, или еще лучше - инвертируйте условие (if ViewMod:) и поменяйте местами блоки.- Для именования переменных лучше придерживаться pep8:
good_labelвместоGoodLabel,auditвместоAudit, и т.д. Именование в стилеGoodLabelв Python используется для имен классов, но не для переменных.
Итого:
def create_good_label (maximum_width, text, alignment=None):
good_label = QLabel(self,margin=10,)
good_label.setStyleSheet("border: 1px solid black;")
good_label.setMaximumWidth(maximum_width)
if alignment is not None:
good_label.setAlignment(alignment)
good_label.setText(text)
create_good_label(84, str(Time), Qt.AlignLeft)
if ViewMod:
create_good_label(60, group)
create_good_label(160, Lesson)
create_good_label(80, Audit)
else:
create_good_label(160, str(Lesson), Qt.AlignLeft)
create_good_label(60, Audit)
create_good_label(80, teacher)
Дополнительно, если с созданным объектом потом еще нужно что-то делать (вызвать какой-то метод, например, чтобы разместить объект в окне), возвращайте его из функции через return, потом вызывайте метод или передаете в функцию, или что-то еще.
Для примера, если нужно вызвать метод pack объекта (в Qt его скорее всего нет, это аналогия из tkinter):
def create_good_label (maximum_width, text, alignment=None):
good_label = QLabel(self,margin=10,)
good_label.setStyleSheet("border: 1px solid black;")
good_label.setMaximumWidth(maximum_width)
if alignment != None:
good_label.setAlignment(alignment)
good_label.setText(text)
return good_label
create_good_label(84, str(Time), Qt.AlignLeft).pack()
if ViewMod:
create_good_label(60, group).pack()
create_good_label(160, Lesson).pack()
create_good_label(80, Audit).pack()
else:
create_good_label(160, str(Lesson), Qt.AlignLeft).pack()
create_good_label(60, Audit).pack()
create_good_label(80, teacher).pack()
Если борьба с повторами порождает вот такое, ты что-то делаешь не так.
По хорошему, нужно сделать декларативное описание того, что ты собираешься создавать и функцию, умеющую создать это по его декларации)
В любом случае, создание 4х Label не надо было сушить таким образом, как у тебя))