Как в такой ситуации следовать принципу 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)
→ Ссылка
Автор решения: insolor
  1. Во-первых, конечно же нужно вынести повторяющийся код в функцию (это вообще самое очевидное, что можно сделать, если есть какой-то повторяющийся код)
  2. Для создания 4 объектов в данном случае не нужен цикл со счетчиком - просто 4 раза вызовите функцию. Сразу отпадет необходимость проверять значение счетчика i.
  3. if ViewMod == False: немного извращенно: или замените на if not ViewMod:, или еще лучше - инвертируйте условие (if ViewMod:) и поменяйте местами блоки.
  4. Для именования переменных лучше придерживаться 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()
→ Ссылка
Автор решения: vp_arth

Если борьба с повторами порождает вот такое, ты что-то делаешь не так.

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

В любом случае, создание 4х Label не надо было сушить таким образом, как у тебя))

→ Ссылка