勉強を兼ねて 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"]
コメント