Python 代码审查¶
此命令会调用 python-reviewer 代理,用于执行针对 Python 的全面代码审查。
此命令的功能¶
- 识别 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 风格循环而非列表推导式
- 使用 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}" # 悪い
[HIGH] 可変デフォルト引数 ファイル: app/services/auth.py:18 問題: 可変デフォルト引数が共有状態を引き起こす
修正: デフォルトにNoneを使用[MEDIUM] 型ヒントの欠落 ファイル: app/services/auth.py:25 問題: 型アノテーションのない公開関数
修正: 型ヒントを追加[MEDIUM] コンテキストマネージャーを使用していない ファイル: app/routes/user.py:55 問題: 例外時にファイルがクローズされない
修正: コンテキストマネージャーを使用サマリー¶
- 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