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.
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.
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.
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
code
src/my_library/ ├── __init__.py # Public API exports ├── _internal.py # Private (underscore prefix) ├── exceptions.py # Custom exceptions ├── types.py # Type definitions └── py.typed # Type hint marker
Checklist
code
Code Quality: - [ ] ruff check passes - [ ] mypy passes (strict mode) - [ ] Public API has type hints - [ ] Public API has docstrings - [ ] No mutable default arguments - [ ] Specific exception handling - [ ] py.typed marker present