Правильная конструкция условий в циклах
Допустим есть цикл
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 шт):
все нормально,
в приведённом коде 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
Не знаю как насчёт 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)
Смысл правильного рефакторинга в том, чтобы не замусоривать верхние уровни абстракции деталями реализации нижних уровней.