mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-02-18 04:03:09 +08:00
7.8 KiB
7.8 KiB
description
| description |
|---|
| PEP 8準拠、型ヒント、セキュリティ、Pythonic慣用句についての包括的なPythonコードレビュー。python-reviewerエージェントを呼び出します。 |
Python Code Review
このコマンドは、Python固有の包括的なコードレビューのためにpython-reviewerエージェントを呼び出します。
このコマンドの機能
- Python変更の特定:
git diffで変更された.pyファイルを検出 - 静的解析の実行:
ruff、mypy、pylint、black --checkを実行 - セキュリティスキャン: SQLインジェクション、コマンドインジェクション、安全でないデシリアライゼーションをチェック
- 型安全性のレビュー: 型ヒントとmypyエラーを分析
- Pythonicコードチェック: コードがPEP 8とPythonベストプラクティスに従っていることを確認
- レポート生成: 問題を重要度別に分類
使用するタイミング
以下の場合に/python-reviewを使用します:
- Pythonコードを作成または変更した後
- Python変更をコミットする前
- Pythonコードを含むプルリクエストのレビュー時
- 新しいPythonコードベースへのオンボーディング時
- Pythonicパターンと慣用句の学習時
レビューカテゴリ
CRITICAL(必須修正)
- SQL/コマンドインジェクションの脆弱性
- 安全でないeval/execの使用
- Pickleの安全でないデシリアライゼーション
- ハードコードされた資格情報
- YAMLの安全でないロード
- エラーを隠す素のexcept句
HIGH(修正推奨)
- 公開関数での型ヒントの欠落
- 可変デフォルト引数
- 例外を静かに飲み込む
- リソースにコンテキストマネージャーを使用していない
- 内包表記の代わりにCスタイルループ
- isinstance()の代わりにtype()を使用
- ロックなしの競合状態
MEDIUM(検討)
- PEP 8フォーマット違反
- 公開関数でのdocstringの欠落
- loggingの代わりにprint文
- 非効率的な文字列操作
- 名前付き定数のないマジックナンバー
- フォーマットにf-stringsを使用していない
- 不要なリスト作成
実行される自動チェック
# 型チェック
mypy .
# リンティングとフォーマット
ruff check .
black --check .
isort --check-only .
# セキュリティスキャン
bandit -r .
# 依存関係監査
pip-audit
safety check
# テスト
pytest --cov=app --cov-report=term-missing
使用例
User: /python-review
Agent:
# Pythonコードレビューレポート
## レビューされたファイル
- app/routes/user.py (変更)
- app/services/auth.py (変更)
## 静的解析結果
✓ ruff: 問題なし
✓ mypy: エラーなし
⚠️ black: 2ファイルが再フォーマット必要
✓ bandit: セキュリティ問題なし
## 発見された問題
[CRITICAL] SQLインジェクション脆弱性
File: app/routes/user.py:42
Issue: ユーザー入力が直接SQLクエリに挿入されている
```python
query = f"SELECT * FROM users WHERE id = {user_id}" # 悪い
Fix: パラメータ化クエリを使用
query = "SELECT * FROM users WHERE id = %s" # 良い
cursor.execute(query, (user_id,))
[HIGH] 可変デフォルト引数 File: app/services/auth.py:18 Issue: 可変デフォルト引数が共有状態を引き起こす
def process_items(items=[]): # 悪い
items.append("new")
return items
Fix: デフォルトにNoneを使用
def process_items(items=None): # 良い
if items is None:
items = []
items.append("new")
return items
[MEDIUM] 型ヒントの欠落 File: app/services/auth.py:25 Issue: 型アノテーションのない公開関数
def get_user(user_id): # 悪い
return db.find(user_id)
Fix: 型ヒントを追加
def get_user(user_id: str) -> Optional[User]: # 良い
return db.find(user_id)
[MEDIUM] コンテキストマネージャーを使用していない File: app/routes/user.py:55 Issue: 例外時にファイルがクローズされない
f = open("config.json") # 悪い
data = f.read()
f.close()
Fix: コンテキストマネージャーを使用
with open("config.json") as f: # 良い
data = f.read()
サマリー
- CRITICAL: 1
- HIGH: 1
- MEDIUM: 2
推奨: ❌ CRITICAL問題が修正されるまでマージをブロック
フォーマット必要
実行: black app/routes/user.py app/services/auth.py
## 承認基準
| ステータス | 条件 |
|--------|-----------|
| ✅ 承認 | CRITICALまたはHIGH問題なし |
| ⚠️ 警告 | MEDIUM問題のみ(注意してマージ) |
| ❌ ブロック | CRITICALまたはHIGH問題が発見された |
## 他のコマンドとの統合
- まず`/python-test`を使用してテストが合格することを確認
- `/code-review`をPython固有でない問題に使用
- `/python-review`をコミット前に使用
- `/build-fix`を静的解析ツールが失敗した場合に使用
## フレームワーク固有のレビュー
### Djangoプロジェクト
レビューアは以下をチェックします:
- N+1クエリ問題(`select_related`と`prefetch_related`を使用)
- モデル変更のマイグレーション欠落
- ORMで可能な場合の生SQLの使用
- 複数ステップ操作での`transaction.atomic()`の欠落
### FastAPIプロジェクト
レビューアは以下をチェックします:
- CORSの誤設定
- リクエスト検証のためのPydanticモデル
- レスポンスモデルの正確性
- 適切なasync/awaitの使用
- 依存性注入パターン
### Flaskプロジェクト
レビューアは以下をチェックします:
- コンテキスト管理(appコンテキスト、requestコンテキスト)
- 適切なエラーハンドリング
- Blueprintの構成
- 設定管理
## 関連
- Agent: `agents/python-reviewer.md`
- Skills: `skills/python-patterns/`, `skills/python-testing/`
## 一般的な修正
### 型ヒントの追加
```python
# 変更前
def calculate(x, y):
return x + y
# 変更後
from typing import Union
def calculate(x: Union[int, float], y: Union[int, float]) -> Union[int, float]:
return x + y
コンテキストマネージャーの使用
# 変更前
f = open("file.txt")
data = f.read()
f.close()
# 変更後
with open("file.txt") as f:
data = f.read()
リスト内包表記の使用
# 変更前
result = []
for item in items:
if item.active:
result.append(item.name)
# 変更後
result = [item.name for item in items if item.active]
可変デフォルトの修正
# 変更前
def append(value, items=[]):
items.append(value)
return items
# 変更後
def append(value, items=None):
if items is None:
items = []
items.append(value)
return items
f-stringsの使用(Python 3.6+)
# 変更前
name = "Alice"
greeting = "Hello, " + name + "!"
greeting2 = "Hello, {}".format(name)
# 変更後
greeting = f"Hello, {name}!"
ループ内の文字列連結の修正
# 変更前
result = ""
for item in items:
result += str(item)
# 変更後
result = "".join(str(item) for item in items)
Pythonバージョン互換性
レビューアは、コードが新しいPythonバージョンの機能を使用する場合に通知します:
| 機能 | 最小Python |
|---|---|
| 型ヒント | 3.5+ |
| f-strings | 3.6+ |
セイウチ演算子(:=) |
3.8+ |
| 位置専用パラメータ | 3.8+ |
| Match文 | 3.10+ |
| 型ユニオン(`x | None`) | 3.10+ |
プロジェクトのpyproject.tomlまたはsetup.pyが正しい最小Pythonバージョンを指定していることを確認してください。