Ruff flake8-return (RET)の全てのルールを確認する

勉強を兼ねて Ruff の lint ルールを全て確認しています。(多分更新していきます…)
主観でおススメ度を 5 段階でつけているので、良ければ参考にしてください。

  • 5: デメリットがないため、必ずつけるべき
  • 4: 一定の制約がつくが、つけた方が良い
  • 3: つけてもつけなくてもいい
  • 2: つけない方がいい場面が多い
  • 1: つけるべきではない

公式のルール一覧はこちら

isort(I)はこちら
flake8-annotations(ANN)はこちら
Pyflakes(F)はこちら

flake8-return (RET)

Ruff の RET のルールは flake8-return を Ruff に移植したものになります。名前の通り return の方法に関する lint ルールです。

unnecessary-return-none (RET501) 1/5

返り値がNoneのみ許容される関数で、return Noneステートメントが存在する場合に警告を出します。

悪い例

def foo(bar) -> None:
    if not bar:
        return
    return None

良い例:

def foo(bar) -> None:
    if not bar:
        return
    return

言語仕様として、 Python は明示的な return 値が省略された場合にreturn Noneを暗黙に仮定します。関数の返り値がNoneであることが分かっている場合、RET501 はこうした明示的なNoneの返却に対して警告を出し、冗長な表現を防いでくれます。

言語仕様上冗長と言われればそうなんですが、私としてはNoneを書いてリターンしたいので、むしろNoneを書かなかった場合に警告を出してほしいです。おススメ度は主観でつけているため、1 にしています。

implicit-return-value (RET502) 5/5

返り値がNoneのみに限定されない関数が、返り値を明示しないreturnステートメントを持つ場合に警告を出します。

悪い例

def foo(bar):
    if not bar:
        return
    return 1

良い例:

def foo(bar):
    if not bar:
        return None
    return 1

意図せず返り値を書き損ねてしまう、といったミスを防げるため、導入推奨です。
ミスではなく、わざと None を返している、ということを明示する意味でも、return Noneの価値はあると思います。

implicit-return (RET503) 5/5

明示的にreturnステートメントを書いていない関数に対して警告を出します。

悪い例

def foo(bar):
    if not bar:
        return 1

良い例:

def foo(bar):
    if not bar:
        return 1
    return None

502 と同様に意図せず返り値を書き損ねてしまう、といったミスを防げるため、導入推奨です。

unnecessary-assign (RET504) 3/5

すぐにreturnに用いられるような、不必要な変数定義に対して警告を出します。

悪い例

def foo():
    bar = 1
    return bar

良い例:

def foo():
    return 1

個人的に導入するメリットがあまり感じられないルールです。
(冗長にはなりますが)変数名で意図を明確にできることもあるため、一長一短あるルールだと思います。

superfluous-else-return (RET505) 1/5

if文でreturnを行っている場合に、else句をあれば警告を出します。

悪い例

def foo(bar, baz):
    if bar:
        return 1
    else:
        return baz

良い例:

def foo(bar, baz):
    if bar:
        return 1
    return baz

RET502 と同じく、「確かにそうだけど…」感のあるルールです。
私は冗長でも意図が明確な方が良いと考えているためelse句はつけたいです。if 文の内部で return をしなくなったときに破綻しますし
本質的に同値なら冗長じゃない方が良い、という方は lint に加えても良いと思います。

superfluous-else-continue (RET507) 2/5

if文でcontinueを行っている場合に、else句をあれば警告を出します。

悪い例

def foo(bar, baz):
    if bar:
        return 1
    else:
        return baz

良い例:

def foo(bar, baz):
    if bar:
        return 1
    return baz

RET505 のcontinue版です。
本質的に同値なら冗長じゃない方が良い、という方は lint に加えても良いと思います。

superfluous-else-break (RET508) 1/5

if文でbreakを行っている場合に、else句をあれば警告を出します。

悪い例

def foo(bar, baz):
    if bar:
        return 1
    else:
        return baz

良い例:

def foo(bar, baz):
    if bar:
        return 1
    return baz

RET505 のbreak版です。私は必要のないルールだと思います。
本質的に同値なら冗長じゃない方が良い、という方は lint に加えても良いと思います。

終わりに

flake8-return(RET) は 要らないと感じるルールが多かったですが、RET502 と RET503 は非常に有用なルールだと思いました。

私が lint に追加する場合は以下のようになると思います。

[tool.ruff.lint]
select = [
"RET502",
"RET503",
]

すべて追加したい場合はpyproject.tomlに以下のように書いてください。

[tool.ruff.lint]
select = ["RET"]

コメント

タイトルとURLをコピーしました