python-best-practices
0xbigboss/claude-code
Type-first Python patterns: immutable models, discriminated unions, and structured error handling.
What is python-best-practices?
Enforces Python best practices for type safety, error handling, and logging when reading or writing Python files. Use this skill to apply domain-driven design patterns, prevent invalid states at type-check time, and maintain consistent error chains and logging across your codebase.
- Use frozen dataclasses and NewType to make illegal states unrepresentable
- Apply discriminated unions with Literal and pattern matching for type-safe state handling
- Leverage Protocol for structural typing without inheritance
- Chain exceptions with `from err` to preserve tracebacks
- Implement structured logging with deferred string interpolation using %s formatting
- Optionally integrate ty (Rust-based type checker) for faster CI validation
How to install python-best-practices
npx skills add https://github.com/0xbigboss/claude-code --skill python-best-practicesHow to use python-best-practices
- 1.When creating domain models, use frozen dataclasses with explicit type annotations
- 2.Replace simple union types with discriminated unions using Literal and match statements
- 3.Use NewType to wrap primitive types for domain-specific identifiers
- 4.Chain exceptions with `from err` when re-raising to preserve stack traces
- 5.Configure module-level loggers and use %s formatting for deferred interpolation
- 6.Optionally add [tool.ty] to pyproject.toml and run `uvx ty check` in CI
Use cases
- Building domain models that prevent invalid state combinations through the type system
- Handling request/response states with discriminated unions and exhaustive pattern matching
- Creating type-safe wrappers around primitive types (UserId, OrderId) to prevent accidental mixing
- Debugging production issues by preserving full exception chains in error logs
- Setting up structured logging in modules for consistent, queryable output
- Python developers building type-safe applications
- Teams adopting domain-driven design patterns
- Projects requiring strict error handling and traceability
- Codebases where type safety prevents runtime bugs
python-best-practices FAQ
Use frozen dataclasses for immutable domain models that should never change after creation. This prevents accidental mutations and makes the intent clear. Regular classes are fine for mutable objects like configuration or state that intentionally changes.
NewType creates a distinct type at type-check time, preventing accidental mixing (e.g., UserId and OrderId). Type aliases like `UserId = str` are just names for the same type. Use NewType for domain primitives to catch bugs early.
Logging with %s defers string interpolation until the log level is actually enabled. If debug logging is off, the string is never built, saving CPU. F-strings always interpolate immediately, wasting resources on logs that won't be shown.
Use ty for fastest CI checks on large codebases (Rust-based, early stage). Use pyright for best type inference and VS Code integration. Use mypy if you need mature, stable tooling with extensive plugins. All three are valid; choose based on speed vs maturity tradeoff.
Chain exceptions with `from err` at each level to preserve the full traceback. This lets you see the original error cause even after re-raising with a higher-level message, making debugging much easier.
Full instructions (SKILL.md)
Source of truth, from 0xbigboss/claude-code.
name: python-best-practices description: Use when reading or writing Python files (.py, pyproject.toml, requirements.txt).
Python Best Practices
Follows type-first, functional, and error handling patterns from CLAUDE.md. This skill covers language-specific idioms only.
Make Illegal States Unrepresentable
Use Python's type system to prevent invalid states at type-check time.
Frozen dataclasses for immutable domain models:
from dataclasses import dataclass
from datetime import datetime
@dataclass(frozen=True)
class User:
id: str
email: str
name: str
created_at: datetime
# Frozen dataclasses are immutable — no accidental mutation
Discriminated unions with Literal:
from dataclasses import dataclass
from typing import Literal
@dataclass
class Success:
status: Literal["success"] = "success"
data: str
@dataclass
class Failure:
status: Literal["error"] = "error"
error: Exception
RequestState = Success | Failure
def handle_state(state: RequestState) -> None:
match state:
case Success(data=data):
render(data)
case Failure(error=err):
show_error(err)
NewType for domain primitives:
from typing import NewType
UserId = NewType("UserId", str)
OrderId = NewType("OrderId", str)
def get_user(user_id: UserId) -> User:
# Type checker prevents passing OrderId here
...
Protocol for structural typing:
from typing import Protocol
class Readable(Protocol):
def read(self, n: int = -1) -> bytes: ...
def process_input(source: Readable) -> bytes:
# Accepts any object with a read() method — no inheritance required
return source.read()
Python-Specific Error Handling
Chain exceptions with from err to preserve the original traceback:
try:
data = json.loads(raw)
except json.JSONDecodeError as err:
raise ValueError(f"invalid JSON payload: {err}") from err
Structured Logging
Use a module-level logger with %s formatting (deferred string interpolation):
import logging
logger = logging.getLogger("myapp.widgets")
def create_widget(name: str) -> Widget:
logger.debug("creating widget: %s", name)
widget = Widget(name=name)
logger.debug("created widget id=%s", widget.id)
return widget
Optional: ty
For fast type checking, consider ty from Astral (creators of ruff and uv). Written in Rust, significantly faster than mypy or pyright.
uvx ty check # run directly, no install needed
uvx ty check src/ # check specific path
# pyproject.toml
[tool.ty]
python-version = "3.12"
When to choose:
ty— fastest, good for CI and large codebases (early stage, rapidly evolving)pyright— most complete type inference, VS Code integrationmypy— mature, extensive plugin ecosystem
Related skills
More from 0xbigboss/claude-code and the wider catalog.

react-best-practices
Use Effects as escape hatches, prefer event handlers and render-time calculations for React component logic.

typescript-best-practices
Enforce type safety and prevent invalid states in TypeScript and JavaScript code.

web-fetch
Fetches web content as clean markdown by preferring markdown-native responses and falling back to selector-based HTML extraction. Use for documentation, articles, and reference pages at http/https URLs.

design-lab
Conduct design interviews, generate five distinct UI variations in a temporary design lab, collect feedback, and produce implementation plans. Use when the user wants to explore UI design options, redesign existing components, or create new UI with multiple approaches to compare.

risk-management
Data-driven risk rules from 8500 trading samples to optimize position sizing and trade frequency.

trading-wisdom
Core trading insights learned from Agent Arena competition. Use when making any trading decision to apply institutional knowledge.