В чем реальная польза от соблюдения R1705 в pylint? Действительно ли код безопаснее?

С 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.

else просто избыточен, потому что уже очевидно, куда пойдет управление, если условие не будет выполнено. Это также сохраняет уровень отступа в предложении else. Конечно, вы можете не захотеть писать такой код, потому что вы «находите его более организованным для использования else». Это действительно зависит от вас, на мой взгляд.

ForceBru 07.04.2019 18:26

Спасибо ФорсБру! Я боялся чего-то "наказуемого" :)

Alex M.M. 07.04.2019 18:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
2
1 854
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы пытаетесь соответствовать Стиль кодирования 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

Этот сообщение дает два разных случая для этого проектного решения:

  1. Охранные оговорки.

    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
  1. Симметричная оговорка.

    # Explicit else
    def check_link(link) -> bool:
        if is_internal_link(link):
            return check_internal_link(link)
        else:
            return check_external_link(link)
    

Я согласен с автором, что здесь явно лучше.

Я бы также процитировал комментарий из этого поста, в котором говорится, что этот выбор является выбором парадигмы:

  1. "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.
  2. "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".

Другие вопросы по теме