Python Best Practices
Code Style
| Rule | Guideline | |------|-----------| | Formatter | ruff format or black | | Linter | ruff check with strict rules | | Type hints | Always for public APIs | | Docstrings | Google or NumPy style |
Type Hints
def process(items: list[str], max_count: int = 10) -> dict[str, int]: ...
def find_user(user_id: int) -> User | None: ...
Error Handling
| Rule | Guideline | |------|-----------| | Specific exceptions | Never bare except: | | Context managers | Use with for resources | | Early return | Validate inputs, fail fast |
# Good
try:
result = process(data)
except ValidationError as e:
logger.warning(f"Validation failed: {e}")
return default
Project Structure
src/package_name/
├── __init__.py
├── core/
└── py.typed
tests/
├── conftest.py
└── test_*.py
pyproject.toml
Common Patterns
| Pattern | Usage | |---------|-------| | @dataclass | Data containers | | @property | Computed attributes | | Generators | Memory-efficient iteration | | functools.cache | Memoization |
Anti-Patterns
| Avoid | Use Instead | |-------|-------------| | Mutable default args | None default, create inside | | import * | Explicit imports | | Global state | Dependency injection |
# Bad: def add(item, items=[]): ...
# Good:
def add(item, items=None):
items = items or []
items.append(item)
return items
Tools
| Tool | Purpose | |------|---------| | pytest | Testing | | ruff | Linting + formatting | | mypy | Type checking | | uv | Dependencies |