Loading...
Loading...
Idiomatic Python 3.14+ development. Use when writing Python code, CLI tools, scripts, or services. Emphasizes stdlib, type hints, uv/ruff toolchain, and minimal dependencies.
npx skill4agent add alexei-led/claude-code-config writing-pythonfrom typing import Protocol
# Protocol at consumer (like Go interfaces)
class UserStore(Protocol):
def get(self, id: str) -> User | None: ...
def save(self, user: User) -> None: ...
class UserService:
def __init__(self, store: UserStore):
self.store = store # accepts any matching impl# GOOD: guard clauses, early returns
def process(user: User | None) -> Result:
if user is None:
raise ValueError("user required")
if not user.email:
raise ValueError("email required")
if not is_valid_email(user.email):
raise ValueError("invalid email")
return do_work(user) # happy path at end
# BAD: nested conditions
def process(user: User | None) -> Result:
if user is not None:
if user.email:
if is_valid_email(user.email):
return do_work(user)
raise ValueError("invalid")# Flatten complex conditionals with match
match event:
case {"type": "click", "x": x, "y": y}:
handle_click(x, y)
case {"type": "key", "code": code}:
handle_key(code)
case _:
raise ValueError(f"Unknown event: {event}")# GOOD: concrete types
def process_users(users: list[User], limit: int | None = None) -> list[Result]:
...
# GOOD: generics when needed
from typing import TypeVar
T = TypeVar("T")
def first(items: list[T]) -> T | None:
return items[0] if items else None
# BAD: unnecessary Any
def process(data: Any) -> Any: # Don't do this
...# except without parens (3.14)
except ValueError | TypeError:
handle_error()
# Custom exceptions
class NotFoundError(AppError):
def __init__(self, resource: str, id: str):
self.resource = resource
self.id = id
super().__init__(f"{resource} not found: {id}")from __future__ import annotationst"Hello {name}"except ValueError | TypeError:uv sync # Install deps
ruff check --fix . # Lint and autofix
ruff format . # Format
pytest -v # Test
mypy . # Type check