Python Code Review
This command invokes the python-reviewer agent for comprehensive Python-specific code review.
What This Command Does
- Identify Python Changes: Find modified
.pyfiles viagit diff - Run Static Analysis: Execute
ruff,mypy,pylint,black --check - Security Scan: Check for SQL injection, command injection, unsafe deserialization
- Type Safety Review: Analyze type hints and mypy errors
- Pythonic Code Check: Verify code follows PEP 8 and Python best practices
- Generate Report: Categorize issues by severity
When to Use
Use /python-review when:
- After writing or modifying Python code
- Before committing Python changes
- Reviewing pull requests with Python code
- Onboarding to a new Python codebase
- Learning Pythonic patterns and idioms
Review Categories
CRITICAL (Must Fix)
- SQL/Command injection vulnerabilities
- Unsafe eval/exec usage
- Pickle unsafe deserialization
- Hardcoded credentials
- YAML unsafe load
- Bare except clauses hiding errors
HIGH (Should Fix)
- Missing type hints on public functions
- Mutable default arguments
- Swallowing exceptions silently
- Not using context managers for resources
- C-style looping instead of comprehensions
- Using type() instead of isinstance()
- Race conditions without locks
MEDIUM (Consider)
- PEP 8 formatting violations
- Missing docstrings on public functions
- Print statements instead of logging
- Inefficient string operations
- Magic numbers without named constants
- Not using f-strings for formatting
- Unnecessary list creation
Automated Checks Run
# Type checking
mypy .Linting and formatting
ruff check .
black --check .
isort --check-only .Security scanning
bandit -r .Dependency audit
pip-audit
safety checkTesting
pytest --cov=app --cov-report=term-missing
Example Usage
User: /python-reviewAgent:
Python Code Review Report
Files Reviewed
- app/routes/user.py (modified)
- app/services/auth.py (modified)
Static Analysis Results
✓ ruff: No issues
✓ mypy: No errors
WARNING: black: 2 files need reformatting
✓ bandit: No security issuesIssues Found
[CRITICAL] SQL Injection vulnerability
File: app/routes/user.py:42
Issue: User input directly interpolated into SQL query
python
query = f"SELECT * FROM users WHERE id = {user_id}" # Bad
Fix: Use parameterized query
python
query = "SELECT * FROM users WHERE id = %s" # Good
cursor.execute(query, (user_id,))
[HIGH] Mutable default argument
File: app/services/auth.py:18
Issue: Mutable default argument causes shared state
python
def process_items(items=[]): # Bad
items.append("new")
return items
Fix: Use None as default
python
def process_items(items=None): # Good
if items is None:
items = []
items.append("new")
return items
[MEDIUM] Missing type hints
File: app/services/auth.py:25
Issue: Public function without type annotations
python
def get_user(user_id): # Bad
return db.find(user_id)
Fix: Add type hints
python
def get_user(user_id: str) -> Optional[User]: # Good
return db.find(user_id)
[MEDIUM] Not using context manager
File: app/routes/user.py:55
Issue: File not closed on exception
python
f = open("config.json") # Bad
data = f.read()
f.close()
Fix: Use context manager
python
with open("config.json") as f: # Good
data = f.read()
Summary
- CRITICAL: 1
- HIGH: 1
- MEDIUM: 2
Recommendation: FAIL: Block merge until CRITICAL issue is fixedFormatting Required
Run: black app/routes/user.py app/services/auth.py
Approval Criteria
| Status | Condition | |--------|-----------| | PASS: Approve | No CRITICAL or HIGH issues | | WARNING: Warning | Only MEDIUM issues (merge with caution) | | FAIL: Block | CRITICAL or HIGH issues found |
Integration with Other Commands
- Use
/tddfirst to ensure tests pass - Use
/code-reviewfor non-Python specific concerns - Use
/python-reviewbefore committing - Use
/build-fixif static analysis tools fail
Framework-Specific Reviews
Django Projects
The reviewer checks for:- N+1 query issues (use
select_relatedandprefetch_related) - Missing migrations for model changes
- Raw SQL usage when ORM could work
- Missing
transaction.atomic()for multi-step operations
FastAPI Projects
The reviewer checks for:- CORS misconfiguration
- Pydantic models for request validation
- Response models correctness
- Proper async/await usage
- Dependency injection patterns
Flask Projects
The reviewer checks for:- Context management (app context, request context)
- Proper error handling
- Blueprint organization
- Configuration management
Related
- Agent:
agents/python-reviewer.md - Skills:
skills/python-patterns/,skills/python-testing/
Common Fixes
Add Type Hints
# Before
def calculate(x, y):
return x + yAfter
from typing import Uniondef calculate(x: Union[int, float], y: Union[int, float]) -> Union[int, float]:
return x + y
Use Context Managers
# Before
f = open("file.txt")
data = f.read()
f.close()After
with open("file.txt") as f:
data = f.read()
Use List Comprehensions
# Before
result = []
for item in items:
if item.active:
result.append(item.name)After
result = [item.name for item in items if item.active]
Fix Mutable Defaults
# Before
def append(value, items=[]):
items.append(value)
return itemsAfter
def append(value, items=None):
if items is None:
items = []
items.append(value)
return items
Use f-strings (Python 3.6+)
# Before
name = "Alice"
greeting = "Hello, " + name + "!"
greeting2 = "Hello, {}".format(name)After
greeting = f"Hello, {name}!"
Fix String Concatenation in Loops
# Before
result = ""
for item in items:
result += str(item)After
result = "".join(str(item) for item in items)
Python Version Compatibility
The reviewer notes when code uses features from newer Python versions:
| Feature | Minimum Python |
|---------|----------------|
| Type hints | 3.5+ |
| f-strings | 3.6+ |
| Walrus operator (:=) | 3.8+ |
| Position-only parameters | 3.8+ |
| Match statements | 3.10+ |
| Type unions (`x | None`) | 3.10+ |
Ensure your project's pyproject.toml or setup.py specifies the correct minimum Python version.