数年前に引き継いだPythonプロジェクトに、最近話題の超高速linter「ruff」を導入してみたら… 案の定、エラーがざっくざく!でも、ひとつずつ直していくことで、コードがどんどんキレイになっていくのが気持ちよかったので、備忘録も兼ねてまとめてみました🧽
- 🐍 発見されたエラーとその修正方法
- 🔹 F403: from random import * used; unable to detect undefined names
- 🔹 E712: Avoid equality comparisons to False / True
- 🔹 F401: re / datetime imported but unused
- 🔹 E402: Module level import not at top of file
- 🔹 F821: Undefined name df_test
- 🔹 F811: Redefinition of unused datetime
- 🔹 F841: Local variable num_amout is assigned to but never used
- 🔹 F541: f-string without any placeholders
- 🛠 修正内容まとめ(ざっくり解説)
- 🧽 おわりに
🐍 発見されたエラーとその修正方法
🔹 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("処理が完了しました")
🛠 修正内容まとめ(ざっくり解説)
| エラーコード | 内容 | 修正ポイント |
|---|---|---|
| F403 | import * は曖昧すぎる | 必要な関数だけを明示的にインポートしよう |
| E712 | == True/False は非推奨 | not や .notnull() を使ってシンプルに |
| F401 | インポートしたけど未使用 | 使ってないなら削除しよう |
| E402 | インポートがファイルの途中にある | インポートはファイルの先頭にまとめよう |
| F821 | 未定義の変数を使ってる | スペルミスや定義漏れをチェックしよう |
| F811 | 同じ名前を再定義してる | モジュール名と変数名がかぶらないように |
| F841 | 使ってない変数がある | 不要なら削除、必要ならちゃんと使おう |
| F541 | f-stringに変数がない | f-stringじゃなくて普通の文字列でOK |
🧽 おわりに
ruff を導入してみて分かったのは、古いコードほどlintの恩恵が大きい!ということ。 最初はエラーの多さにひるむけど、ひとつずつ直していけば、
- 可読性アップ
- バグの予防
- チームでの保守性向上
と、いいことづくめ!✨


コメント