Vulture and deadcode - Dead Code Detection
Tools for finding unused Python code including functions, classes, variables, imports, and attributes.
When to Use This Skill
| Use this skill when... | Use another tool instead when... |
|------------------------|----------------------------------|
| Detecting unused functions, classes, variables | Finding unused imports only (use ruff --select F401) |
| Cleaning up dead code in a codebase | Checking type correctness (use basedpyright) |
| Enforcing code hygiene in CI | Formatting code (use ruff format) |
| Generating whitelists for false positives | Running general linting (use ruff check) |
Overview
Vulture (mature, confidence-based) and deadcode (newer, AST-based) both detect unused code but with different approaches:
| Feature | Vulture | deadcode | |---------|---------|----------| | Approach | Static analysis + confidence scores | AST-based detection | | Accuracy | Confidence scores (60-100%) | High accuracy, fewer false positives | | Speed | Fast | Very fast | | Configuration | Whitelist files | TOML configuration | | Maturity | Mature (2012) | Newer (2023+) | | Best For | Large codebases, gradual cleanup | New projects, strict enforcement |
Installation
# Install vulture
uv add --dev vulture
# Install deadcode (newer alternative)
uv add --dev deadcode
# Install both for comparison
uv add --dev vulture deadcode
Vulture - Confidence-Based Detection
Basic Usage
# Check entire project
vulture .
# Check specific files/directories
vulture src/ tests/
# Minimum confidence threshold (60-100%)
vulture --min-confidence 80 .
# Exclude patterns
vulture . --exclude "**/migrations/*,**/tests/*"
# Sort by confidence
vulture --sort-by-size .
# Generate whitelist of current issues
vulture . --make-whitelist > vulture_whitelist.py
Configuration (pyproject.toml)
[tool.vulture]
min_confidence = 80
paths = ["src", "tests"]
exclude = [
"**/migrations/*",
"**/__pycache__/*",
".venv/*"
]
ignore_decorators = [
"@app.route",
"@pytest.fixture",
"@property",
"@staticmethod",
"@classmethod"
]
ignore_names = [
"test_*",
"setUp*",
"tearDown*",
]
deadcode - AST-Based Detection
Basic Usage
# Check entire project
deadcode .
# Check specific files/directories
deadcode src/
# Verbose output
deadcode --verbose .
# Dry run (show what would be removed)
deadcode --dry-run .
# Show unreachable code
deadcode --show-unreachable .
# Generate configuration
deadcode --init
Configuration (pyproject.toml)
[tool.deadcode]
paths = ["src"]
exclude = [
"tests/*",
"**/__pycache__/*",
"**/migrations/*",
]
ignore_names = [
"test_*",
"setUp",
"tearDown",
"main",
]
ignore_decorators = [
"app.route",
"pytest.fixture",
"property",
"staticmethod",
"classmethod",
"abstractmethod"
]
show_unreachable = false
Choosing Between Tools
| Choose Vulture when... | Choose deadcode when... | |------------------------|------------------------| | Large, mature codebases | New projects | | Need confidence-based filtering | Want fewer false positives | | Need whitelist file approach | Prefer TOML configuration | | Dynamic code (getattr, exec) | Need unreachable code detection |
Hybrid Approach
# Run both for comprehensive detection
vulture --min-confidence 80 .
deadcode .
Agentic Optimizations
| Context | Command |
|---------|---------|
| Quick vulture check | vulture --min-confidence 90 . |
| Quick deadcode check | deadcode . |
| Generate whitelist | vulture . --make-whitelist > vulture_whitelist.py |
| CI enforcement | vulture --min-confidence 80 . vulture_whitelist.py |
| Unreachable code | deadcode --show-unreachable . |
| Combined check | vulture --min-confidence 80 . && deadcode . |
Quick Reference
Vulture Flags
| Flag | Description |
|------|-------------|
| --min-confidence N | Minimum confidence (60-100%) |
| --exclude PATTERN | Exclude glob patterns |
| --sort-by-size | Sort results by size |
| --make-whitelist | Generate whitelist file |
deadcode Flags
| Flag | Description |
|------|-------------|
| --verbose | Verbose output |
| --dry-run | Show without modifying |
| --show-unreachable | Detect unreachable code |
| --init | Generate configuration |
| --strict | Strict enforcement mode |
For detailed examples, advanced patterns, and best practices, see REFERENCE.md.