Правильная конструкция условий в циклах

Допустим есть цикл

while True:
    any_sql_req = ... # Получаем запрос из базы данных, записей может не быть и приходит пустой ответ
    if not any_sql_req:
        time.sleep(600)
        continue

    for item in any_sql_req:
        ... # дальше код и где-то глубоко цикл ломается

Суть вопроса, правильное ли это оформление кода с точки зрения PEP?

Ведь можно (и я подозреваю, что нужно) писать так:

while True:
    any_sql_req = ...
    if not any_sql_req:
        time.sleep(600)
    else:
        for item in any_sql_req:
            ... # дальше код

Но у меня огромная вложенность (если это класс 2 табуляции, потом метод еще 2 табуляции, условия, а может быть условие в условие, try конструкции, итерации и тд и тп) и код в редакторе (ide) начинается с середины, что усложняет читабельность, да и еще по PEP длина строчки 128 символов...

Как быть в таких случаях?


Ответы (2 шт):

Автор решения: Zhihar

все нормально,

в приведённом коде else конструкция совершенно избыточная,

если же очень хочется использовать if/else конструкцию, то надо было бы делать так:

while True:
    any_sql_req = ...
    if not any_sql_req:
        time.sleep(600)
    else:
        for item in any_sql_req:
            ... # дальше код

потому что тут уже continue избыточен, но в данном случае визуально хуже воспринимается смысл кода

на счет PEP - проверяйте свой код на http://pep8online.com/checkresult

→ Ссылка
Автор решения: CrazyElf

Не знаю как насчёт PEP, а в плане рефакторинга я бы разделил на функции/методы. Не уверен за то, как у вас внешний цикл прерывается, сделал по своим предположениям, что по некоему флагу он всё же выходит из цикла по результатам обработки данных:

def process_data_loop:
    while True:
        req = get_sql_req()
        result = process_sql_req(req)
        if not result:
            break

def get_sql_req():
    while True:
        any_sql_req = ...
        if any_sql_req:
            return any_sql_req
        time.sleep(600)

def process_sql_req(req):
    for item in any_sql_req:
        ... # дальше код
    return result

Возможно, надо не выставлять флаг, а бросать прерывание во внутренней функции обработки и таким образом выходить из внешнего цикла. Зависит от дизайна, можно по-разному делать. Но с исключением внешний цикл лаконичнее будет:

def process_data_loop:
    while True:
        req = get_sql_req()
        process_sql_req(req)

Смысл правильного рефакторинга в том, чтобы не замусоривать верхние уровни абстракции деталями реализации нижних уровней.

→ Ссылка