python-clean-code について
python-clean-codeは、Robert C. MartinのClean Code原則をPython向けに適用したコードレビュー・編集スキルです。開発者がルール番号で問題を特定し、コード変更時に修正内容を報告できます。
主な機能
- 01コメント、関数、命名、テスト、設計の指針
- 02インポート、列挙型、型ヒントのPython固有ルール
- 03ルール番号による違反箇所の提示
- 04該当ルール番号を添えた修正報告
活用シーン
- 01PythonコードのClean Code違反のレビュー
- 02引数過多や責務混在の関数のリファクタリング
- 03テスト、命名、境界条件の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ ertugrul-dmr/ clean-code-skills --skill python-clean-codeインストール後、Claude Code で/python-clean-codeを入力して読み込まれたか確認します。
詳細
Clean Python:完全リファレンス
Robert C. Martin の第 17 章にある Clean Code の原則をすべて、Python 向けに適用して徹底します。
コメント(C1-C5)
- C1:コメントにメタデータを書かない(Git を使う)
- C2:古くなったコメントはすぐに削除する
- C3:冗長なコメントを書かない
- C4:コメントが必要なら、適切に書く
- C5:コメントアウトしたコードは絶対にコミットしない
環境(E1-E2)
- E1:ビルドコマンドは 1 つにする(
pip install -e ".[dev]") - E2:テストコマンドは 1 つにする(
pytest)
関数(F1-F4)
- F1:引数は最大 3 つにする(それ以上は dataclass を使う)
- F2:出力引数を使わない(戻り値を返す)
- F3:フラグ引数を使わない(関数を分割する)
- F4:使われていない関数は削除する
全般(G1-G36)
- G1:1 ファイルにつき 1 つの言語を使う
- G2:期待される動作を実装する
- G3:境界条件を処理する
- G4:安全策を無効にしない
- G5:DRY — 重複をなくす
- G6:抽象化レベルを統一する
- G7:基底クラスが子クラスを把握しないようにする
- G8:公開インターフェースを最小限にする
- G9:使われていないコードを削除する
- G10:変数は使用箇所の近くに置く
- G11:一貫性を保つ
- G12:余計なものを取り除く
- G13:人為的な結合を避ける
- G14:フィーチャー・エンヴィーを避ける
- G15:セレクター引数を使わない
- G16:意図を曖昧にしない
- G17:期待される場所にコードを配置する
- G18:インスタンスメソッドを優先する
- G19:説明的な変数を使う
- G20:関数名で処理内容を示す
- G21:アルゴリズムを理解する
- G22:依存関係を明示する
- G23:if/else よりポリモーフィズムを優先する
- G24:規約に従う(PEP 8)
- G25:マジックナンバーではなく名前付き定数を使う
- G26:正確を期す
- G27:規約より構造を重視する
- G28:条件判定をカプセル化する
- G29:否定条件を避ける
- G30:関数は 1 つのことだけを行う
- G31:時間的な結合を明示する
- G32:恣意的な設計をしない
- G33:境界条件をカプセル化する
- G34:関数内の抽象化レベルを統一する
- G35:設定は高いレベルに置く
- G36:デメテルの法則(連鎖呼び出しを避ける)
Python 固有のルール(P1-P3)
Java 固有のルール(J1-J3)を Python の規約に合わせたものです。
- P1:ワイルドカードインポート(
from x import *)を使わない — PEP 8 に基づく Java とは逆の方針 - P2:マジック定数ではなく Enum を使う — J3 と同じ原則
- P3:公開インターフェースに型ヒントを付ける — Python における Java の静的型付けに相当
名前(N1-N7)
- N1:説明的な名前を選ぶ
- N2:適切な抽象化レベルの名前を付ける
- N3:標準的な命名法を使う
- N4:曖昧さのない名前を付ける
- N5:スコープに応じた長さの名前を付ける
- N6:エンコーディングを使わない
- N7:副作用がわかる名前を付ける
テスト(T1-T9)
- T1:壊れる可能性のあるものをすべてテストする
- T2:カバレッジツールを使う
- T3:些細なテストも省略しない
- T4:テストを無視する場合は、曖昧さがないか検討する
- T5:境界条件をテストする
- T6:バグの近辺を徹底的にテストする
- T7:失敗にパターンがないか確認する
- T8:デバッグ時にカバレッジを確認する
- T9:テストは高速にする(各テスト 100ms 未満)
クイックリファレンステーブル
| カテゴリー | ルール | 要約 |
|---|---|---|
| コメント | C1 | メタデータを書かない(Git を使う) |
| C3 | 冗長なコメントを書かない | |
| C5 | コメントアウトしたコードを残さない | |
| 関数 | F1 | 引数は最大 3 つ |
| F3 | フラグ引数を使わない | |
| F4 | 使われていない関数を削除する | |
| 全般 | G5 | DRY — 重複をなくす |
| G9 | 使われていないコードを削除する | |
| G16 | 意図を曖昧にしない | |
| G23 | if/else よりポリモーフィズム | |
| G25 | マジックナンバーではなく名前付き定数 | |
| G30 | 関数は 1 つのことだけを行う | |
| G36 | デメテルの法則(ドットは 1 つ) | |
| 名前 | N1 | 説明的な名前 |
| N5 | スコープに応じた長さの名前 | |
| テスト | T5 | 境界条件をテストする |
| T9 | テストは高速にする |
アンチパターン(やらない → やる)
| ❌ やらない | ✅ やる |
|---|---|
| すべての行にコメントを付ける | 明らかなコメントを削除する |
| 1 行の処理のためにヘルパーを作る | コードをインライン化する |
from x import * | 明示的にインポートする |
マジックナンバー 86400 | SECONDS_PER_DAY = 86400 |
process(data, True) | process_verbose(data) |
| 深いネスト | ガード節、早期リターン |
obj.a.b.c.value | obj.get_value() |
| 100 行を超える関数 | 責務ごとに分割する |
AI の動作
コードをレビューするときは、ルール番号を挙げて違反を指摘してください(例:「G5 違反:ロジックの重複」)。
コードを修正または編集するときは、修正内容を報告してください(例:「修正済み:マジックナンバーを SECONDS_PER_DAY に切り出しました(G25)」)。
コメント
Markdown 対応