С pylint я знаю, что предупреждение R1705 срабатывает, когда вы помещаете «возврат» внутри «иначе».
Это предупреждение:
R1705: Unnecessary "else" after "return" (no-else-return)
Вот что об этом говорят документы:
Unnecessary “else” after “return” Used in order to highlight an unnecessary block of code following an if containing a return statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a return statement.
Фрагмент кода, который вызовет R1705:
if CONDITION1:
return something1
else:
return something2
Желаемое исправление для отключения предупреждения:
if CONDITION1:
return something1
return something2
Действительно ли нужно подчиняться этому? Какая польза? Я имею в виду, что я понимаю, что после возврата чего-то из функции нет возможности вернуться и прочитать дальнейший код.
Но я нахожу более организованным использование else.
Спасибо ФорсБру! Я боялся чего-то "наказуемого" :)
Если вы пытаетесь соответствовать Стиль кодирования Mozilla или похожие тогда R1705 имеет смысл. Цитата:
Don't put an else right after a return (or a break). Delete the else, it's unnecessary and increases indentation level.
В противном случае вы можете отключить это предупреждение.
А еще лучше переключиться на flake8
,
который имеет тенденцию оставаться довольно тихим, если вы пишете разумный код.
За пределами сообщества Mozilla,
большинство людей предпочло бы видеть простые параллельные функциональные предложения
обрабатывается с помощью else
, например:
def max(a, b):
if a > b:
return a
else:
return b
Этот сообщение дает два разных случая для этого проектного решения:
Охранные оговорки.
def try_something()
if precondition():
result = compute_something()
return result
else:
display_error()
return None
Автор утверждает, что для нескольких таких условий их инверсия и implicit else
лучше:
# Implicit else, inverted condition
def try_something():
if not precondition_one():
display_error_one()
return
if not precondition_two():
display_error_two()
return
result = compute_something()
return result
Симметричная оговорка.
# Explicit else
def check_link(link) -> bool:
if is_internal_link(link):
return check_internal_link(link)
else:
return check_external_link(link)
Я согласен с автором, что здесь явно лучше.
Я бы также процитировал комментарий из этого поста, в котором говорится, что этот выбор является выбором парадигмы:
- "Explicit else": "if-then-else" is treated as lazy computation and more suited in "functional-first" environments. If this "if-then-else" is applied to large datasets and code in F#, Scala, Haskel, Closure or even SQL - explicitness is preferred. Most probably language/platform itself will encourage to write "pure" code and discourage/make near impossible to make imperative stunts.
- "Implicit else/(explicit return)": computation depends on 100% on side-effects and result is combination of side-effects too. It's impossible to guarantee correctness in strict sense anyway, so explicit return becomes clear declaration: "Because of laws of physics in our Universe, this computation could work incorrect. In majority of such cases this default value will be returned".
else
просто избыточен, потому что уже очевидно, куда пойдет управление, если условие не будет выполнено. Это также сохраняет уровень отступа в предложенииelse
. Конечно, вы можете не захотеть писать такой код, потому что вы «находите его более организованным для использованияelse
». Это действительно зависит от вас, на мой взгляд.