スポンサーリンク
Python

レガシーPythonコードにruffを導入してわかった改善ポイント

Python
この記事は約4分で読めます。

数年前に引き継いだPythonプロジェクトに、最近話題の超高速linter「ruff」を導入してみたら… 案の定、エラーがざっくざく!でも、ひとつずつ直していくことで、コードがどんどんキレイになっていくのが気持ちよかったので、備忘録も兼ねてまとめてみました🧽

🐍 発見されたエラーとその修正方法

🔹 F403: from random import * used; unable to detect undefined names

問題点 import * は何をインポートしているかが明示されず、可読性が下がるうえに、静的解析ツールが正しく動作しない原因になる。

修正ポイント 使用している関数やクラスを明示的に指定してインポートする。

# 修正前
from random import *
value = randint(1, 10)

# 修正後
from random import randint
value = randint(1, 10)

🔹 E712: Avoid equality comparisons to False / True

問題点 == False== True は冗長で、Pythonらしくない書き方。読みづらく、バグの温床にもなりやすい。

修正ポイント not を使うか、.notnull() などのメソッドを活用して、より自然な条件式にする。

# 修正前
if df["col"].isnull() == False:

# 修正後
if df["col"].notnull():

🔹 F401: re / datetime imported but unused

問題点 インポートしたモジュールが使われていないと、コードが散らかり、保守性が下がる。

修正ポイント 使用していないインポート文は削除する。

# 修正前
import re

# 修正後
# (削除)

🔹 E402: Module level import not at top of file

問題点 インポート文がファイルの途中にあると、コードの構造が分かりづらくなる。

修正ポイント インポート文はファイルの先頭にまとめて記述する。

# 修正前
print("Start")
import os

# 修正後
import os
print("Start")

🔹 F821: Undefined name df_test

問題点 定義されていない変数を使っている。スペルミスや定義漏れ、スコープの問題が原因のことも。

修正ポイント 変数の定義を確認し、必要なら定義を追加するか、名前を修正する。

🔹 F811: Redefinition of unused datetime

問題点 すでにインポートした名前を変数として再定義すると、元の機能が上書きされてしまう。

修正ポイント 名前の衝突を避けるため、変数名を変更する。

# 修正前
from datetime import datetime
datetime = "2024-01-01"

# 修正後
from datetime import datetime
date_str = "2024-01-01"

🔹 F841: Local variable num_amout is assigned to but never used

問題点 値を代入した変数が使われていない。スペルミスや使い忘れの可能性もある。

修正ポイント 不要なら削除し、必要なら使用箇所を追加する。スペルミスも要チェック!

# 修正前
num_amout = 100

# 修正後(使う場合)
num_amount = 100
print(num_amount)

🔹 F541: f-string without any placeholders

問題点 f-string を使っているのに {} で変数を埋め込んでいない。無意味な f-string は混乱のもと。

修正ポイント プレースホルダがないなら、f-string をやめて通常の文字列にする。

# 修正前
print(f"処理が完了しました")

# 修正後
print("処理が完了しました")

🛠 修正内容まとめ(ざっくり解説)

エラーコード内容修正ポイント
F403import * は曖昧すぎる必要な関数だけを明示的にインポートしよう
E712== True/False は非推奨not.notnull() を使ってシンプルに
F401インポートしたけど未使用使ってないなら削除しよう
E402インポートがファイルの途中にあるインポートはファイルの先頭にまとめよう
F821未定義の変数を使ってるスペルミスや定義漏れをチェックしよう
F811同じ名前を再定義してるモジュール名と変数名がかぶらないように
F841使ってない変数がある不要なら削除、必要ならちゃんと使おう
F541f-stringに変数がないf-stringじゃなくて普通の文字列でOK

🧽 おわりに

ruff を導入してみて分かったのは、古いコードほどlintの恩恵が大きい!ということ。 最初はエラーの多さにひるむけど、ひとつずつ直していけば、

  • 可読性アップ
  • バグの予防
  • チームでの保守性向上

と、いいことづくめ!✨

コメント

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