Improves Python library code quality through ruff linting, mypy type checking, Pythonic idioms, and refactoring. Use when reviewing code for quality issues, adding type hints, configuring static analysis tools, or refactoring Python library code.
View on GitHubwdm0006/python-skills
python-library-quality
skills/code-quality/SKILL.md
January 20, 2026
Select agents to install to:
npx add-skill https://github.com/wdm0006/python-skills/blob/main/skills/code-quality/SKILL.md -a claude-code --skill improving-python-code-qualityInstallation paths:
.claude/skills/improving-python-code-quality/# Python Code Quality
## Quick Reference
| Tool | Purpose | Command |
|------|---------|---------|
| ruff | Lint + format | `ruff check src && ruff format src` |
| mypy | Type check | `mypy src` |
## Ruff Configuration
Minimal config in pyproject.toml:
```toml
[tool.ruff]
line-length = 88
target-version = "py310"
[tool.ruff.lint]
select = ["E", "W", "F", "I", "B", "C4", "UP"]
```
For full configuration options, see **[RUFF_CONFIG.md](RUFF_CONFIG.md)**.
## MyPy Configuration
```toml
[tool.mypy]
python_version = "3.10"
disallow_untyped_defs = true
warn_return_any = true
```
For strict settings and overrides, see **[MYPY_CONFIG.md](MYPY_CONFIG.md)**.
## Type Hints Patterns
```python
# Basic
def process(items: list[str]) -> dict[str, int]: ...
# Optional
def fetch(url: str, timeout: int | None = None) -> bytes: ...
# Callable
def apply(func: Callable[[int], str], value: int) -> str: ...
# Generic
T = TypeVar("T")
def first(items: Sequence[T]) -> T | None: ...
```
For protocols and advanced patterns, see **[TYPE_PATTERNS.md](TYPE_PATTERNS.md)**.
## Common Anti-Patterns
```python
# Bad: Mutable default
def process(items: list = []): # Bug!
...
# Good: None default
def process(items: list | None = None):
items = items or []
...
```
```python
# Bad: Bare except
try:
...
except:
pass
# Good: Specific exception
try:
...
except ValueError as e:
logger.error(e)
```
## Pythonic Idioms
```python
# Iteration
for item in items: # Not: for i in range(len(items))
for i, item in enumerate(items): # When index needed
# Dictionary access
value = d.get(key, default) # Not: if key in d: value = d[key]
# Context managers
with open(path) as f: # Not: f = open(path); try: finally: f.close()
# Comprehensions (simple only)
squares = [x**2 for x in numbers]
```
## Module Organization
```
src/my_library/
├── __init__.py # Public API exports
├── _internal.py # Private (underscore prefix)
├── exceptions.py # CuIssues Found: