Я написал код Python в следующем формате:
if a1 in list1:
if b1 == 1 and c1>1:
raise Exception ('invalid c1 for b1')
elif b1 == 2 and c1>2:
raise Exception ('invalid c1 for b1')
elif b1 == 3 and c1>3:
raise Exception ('invalid c1 for b1')
else
z = c1 * d * f
else:
raise Exception ('invalid a1')
Я выполнил тест pylint для своего кода, и он показывает ошибку: «Ненужный «elif» после «raise». Измените «elif» на «if»». Я сделал это, как следующий код:
if a1 in list1:
if b1 == 1 and c1>1:
raise Exception ('invalid c1 for b1')
if b1 == 2 and c1>2:
raise Exception ('invalid c1 for b1')
if b1 == 3 and c1>3:
raise Exception ('invalid c1 for b1')
else
z = c1 * d * f
else:
raise Exception ('invalid a1')
теперь пилинт говорит: «Ненужное «else» после «raise», удалите «else» и устраните отступ в коде внутри него». Я не хочу этого делать, потому что два утверждения «else» относятся к двум разным ситуациям. Мне интересно, есть ли лучший способ реализации этого кода, чтобы pylint не вызывал никаких проблем. (Я знаю, что могу отключить ошибки pylint, используя «#pylint Disable=...», но это не мой первый вариант)
Вы знакомы или?
Я знаком. Я думаю, вы имеете в виду, что я могу объединить несколько операторов if и изменить их на один оператор if, используя или. Конечно, это работает в сценарии, который я упомянул выше. Первоначально мои сообщения об исключениях для каждого «если» зависели от регистра; однако в коде, который я упомянул выше, все они выглядят одинаково. В любом случае, спасибо за совет!






Согласно документации pylint, raise Exception не должен быть частью блока else или elif.
Согласно pylint ваш код должен выглядеть так:
if a1 not in list1:
raise Exception('invalid a1')
if b1 == 1 and c1 > 1:
raise Exception('invalid c1 for b1')
if b1 == 2 and c1 > 2:
raise Exception('invalid c1 for b1')
if b1 == 3 and c1 > 3:
raise Exception('invalid c1 for b1')
z = c1 * d * f
Предупреждение пилинта касается первого else, а не второго. Поэтому он предлагает написать ваш код следующим образом:
if a1 in list1:
if b1 == 1 and c1>1:
raise Exception ('invalid c1 for b1')
if b1 == 2 and c1>2:
raise Exception ('invalid c1 for b1')
if b1 == 3 and c1>3:
raise Exception ('invalid c1 for b1')
z = c1 * d * f
else:
raise Exception ('invalid a1')
... что было бы эквивалентно. Единственный способ добраться до утверждения z = c1 * d * f — это когда все условия в трёх предыдущих утверждениях if ложны.
Мне интересно, есть ли лучший способ реализовать этот код?
Вышеописанное подойдет, но вы также можете сэкономить на одном уровне отступа, отменив первое условие:
if a1 not in list1:
raise Exception ('invalid a1')
if b1 == 1 and c1>1:
raise Exception ('invalid c1 for b1')
if b1 == 2 and c1>2:
raise Exception ('invalid c1 for b1')
if b1 == 3 and c1>3:
raise Exception ('invalid c1 for b1')
z = c1 * d * f
А еще вы можете комбинировать условия, которые приводят к одному и тому же исключению:
if a1 not in list1:
raise Exception ('invalid a1')
if b1 in (1, 2, 3) and c1>b1:
raise Exception ('invalid c1 for b1')
z = c1 * d * f
Спасибо @trincot за предложение. Они оба были полезны.
Я думаю, что пилинт говорит о первом «еще» (внутри «если»). Удаление второго «else» меняет логику.