跳转至

Python 代码审查

此命令会调用 python-reviewer 代理,用于执行针对 Python 的全面代码审查。

此命令的功能

  1. 识别 Python 变更:使用 git diff 检测已修改的 .py 文件
  2. 运行静态分析:执行 ruff、mypy、pylint、black --check
  3. 安全扫描:检查 SQL 注入、命令注入和不安全的反序列化
  4. 类型安全审查:分析类型提示和 mypy 错误
  5. Pythonic 代码检查:确认代码遵循 PEP 8 和 Python 最佳实践
  6. 生成报告:按严重程度对问题进行分类

使用时机

在以下情况下使用 /python-review: - 创建或修改 Python 代码后 - 提交 Python 变更之前 - 审查包含 Python 代码的拉取请求时 - 熟悉新的 Python 代码库时 - 学习 Pythonic 模式和惯用法时

审查类别

CRITICAL(必须修复)

  • SQL/命令注入漏洞
  • 不安全的 eval/exec 使用
  • Pickle 的不安全反序列化
  • 硬编码的凭据
  • YAML 的不安全加载
  • 隐藏错误的裸 except 语句
  • 公开函数缺少类型提示
  • 可变默认参数
  • 静默吞掉异常
  • 资源未使用上下文管理器
  • 使用 C 风格循环而非列表推导式
  • 使用 type() 而非 isinstance()
  • 无锁的竞态条件

MEDIUM(可考虑)

  • PEP 8 格式违规
  • 公开函数缺少 docstring
  • 使用 print 语句而非 logging
  • 低效的字符串操作
  • 没有命名常量的魔术数字
  • 格式化时未使用 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: エラーなし
WARNING: black: 2ファイルが再フォーマット必要
✓ bandit: セキュリティ問題なし

## 発見された問題

[CRITICAL] SQLインジェクション脆弱性
ファイル: app/routes/user.py:42
問題: ユーザー入力が直接SQLクエリに挿入されている
```python
query = f"SELECT * FROM users WHERE id = {user_id}"  # 悪い
修正: パラメータ化クエリを使用
query = "SELECT * FROM users WHERE id = %s"  # 良い
cursor.execute(query, (user_id,))

[HIGH] 可変デフォルト引数 ファイル: app/services/auth.py:18 問題: 可変デフォルト引数が共有状態を引き起こす

def process_items(items=[]):  # 悪い
    items.append("new")
    return items
修正: デフォルトにNoneを使用
def process_items(items=None):  # 良い
    if items is None:
        items = []
    items.append("new")
    return items

[MEDIUM] 型ヒントの欠落 ファイル: app/services/auth.py:25 問題: 型アノテーションのない公開関数

def get_user(user_id):  # 悪い
    return db.find(user_id)
修正: 型ヒントを追加
def get_user(user_id: str) -> Optional[User]:  # 良い
    return db.find(user_id)

[MEDIUM] コンテキストマネージャーを使用していない ファイル: app/routes/user.py:55 問題: 例外時にファイルがクローズされない

f = open("config.json")  # 悪い
data = f.read()
f.close()
修正: コンテキストマネージャーを使用
with open("config.json") as f:  # 良い
    data = f.read()

サマリー

  • CRITICAL: 1
  • HIGH: 1
  • MEDIUM: 2

推奨: FAIL: CRITICAL問題が修正されるまでマージをブロック

フォーマット必要

実行: black app/routes/user.py app/services/auth.py

## 批准标准 {#approval-criteria}

| 状态 | 条件 |
|--------|-----------|
| PASS: 批准 | 没有 CRITICAL 或 HIGH 问题 |
| WARNING: 警告 | 仅有 MEDIUM 问题(谨慎合并) |
| FAIL: 阻止 | 发现 CRITICAL 或 HIGH 问题 |

## 与其他命令的集成 {#integration-with-other-commands}

- 首先使用 `/python-test` 确认测试通过
- 使用 `/code-review` 处理非 Python 特有问题
- 在提交前使用 `/python-review`
- 当静态分析工具失败时使用 `/build-fix`

## 框架特定审查 {#framework-specific-reviews}

### Django 项目 {#django-projects}
审查者会检查以下内容:
- N+1 查询问题(使用 `select_related` 和 `prefetch_related`)
- 模型变更缺少迁移
- 在 ORM 可以处理时使用原生 SQL
- 多步操作缺少 `transaction.atomic()`

### FastAPI 项目 {#fastapi-projects}
审查者会检查以下内容:
- CORS 配置错误
- 用于请求验证的 Pydantic 模型
- 响应模型的准确性
- 正确使用 async/await
- 依赖注入模式

### Flask 项目 {#flask-projects}
审查者会检查以下内容:
- 上下文管理(app 上下文、request 上下文)
- 适当的错误处理
- Blueprint 配置
- 配置管理

## 相关 {#related}

- 代理:`agents/python-reviewer.md`
- 技能:`skills/python-patterns/`, `skills/python-testing/`

## 常见修复 {#common-fixes}

### 添加类型提示 {#adding-type-hints}
```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 版本。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC