Help us improve
Share bugs, ideas, or general feedback.
From python-dev-framework
This skill should be used when the user asks about "Python code style", "type hints", "structlog logging", "how to log", "code organization", "testing patterns", "error handling", or needs guidance on Python development best practices, project conventions, or coding standards for this project.
npx claudepluginhub worldcentralkitchen/python-dev-frameworkHow this skill is triggered — by the user, by Claude, or both
Slash command
/python-dev-framework:python-standardsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill provides Python development standards enforced by the python-dev-framework plugin. Use these patterns when writing Python code in this project.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
This skill provides Python development standards enforced by the python-dev-framework plugin. Use these patterns when writing Python code in this project.
| Topic | Standard |
|---|---|
| Type hints | Required on all functions |
| Future imports | from __future__ import annotations required |
| Generics | Use list[str] not typing.List[str] |
| Logging | Use structlog, no print() in src/ |
| Testing | 75% coverage minimum, pytest |
| Layout | src/ layout with types/, models/, _internal/ |
Require type hints on all function parameters and return types:
from __future__ import annotations
def process_items(items: list[str], limit: int | None = None) -> dict[str, int]:
"""Process items and return counts."""
...
Key rules:
from __future__ import annotations at top of every modulelist, dict, set) not typing module equivalentsX | None instead of Optional[X]collections.abc not typingUse structlog for all logging. The print() function is banned in src/ (Ruff T201).
Basic usage:
import structlog
log = structlog.get_logger()
log.info("user_created", user_id=123, email="user@example.com")
log.error("payment_failed", order_id=456, reason="insufficient_funds")
For configuration and advanced patterns, see references/logging-patterns.md.
src/
├── package_name/
│ ├── __init__.py
│ ├── types/ # Type definitions
│ │ ├── __init__.py
│ │ └── _internal.py # Private types
│ ├── models/ # Data models
│ │ ├── __init__.py
│ │ └── api.py # Pydantic models (API boundaries only)
│ └── _internal/ # Private utilities (never import externally)
│ └── utils.py
Use Pydantic models only at API boundaries for validation:
from pydantic import BaseModel
class CreateUserRequest(BaseModel):
email: str
name: str
Use dataclasses for internal domain models.
Exceptionclass PaymentError(Exception):
"""Domain error for payment failures."""
def __init__(self, order_id: int, reason: str) -> None:
self.order_id = order_id
self.reason = reason
super().__init__(f"Payment failed for order {order_id}: {reason}")
Follow these testing standards:
@pytest.mark.parametrize for multiple test casesimport pytest
@pytest.mark.parametrize("input,expected", [
("hello", 5),
("", 0),
])
def test_string_length(input: str, expected: int) -> None:
# Arrange - done via parametrize
# Act
result = len(input)
# Assert
assert result == expected
Prefer immutable patterns to avoid subtle bugs:
| Prefer | Over | Why |
|---|---|---|
tuple(items) | list.append() loop | Immutable result |
@dataclass(frozen=True) | @dataclass | Immutable objects |
= None with or [] | = [] default | Mutable default bug |
field(default_factory=list) | = [] in dataclass | Mutable default bug |
For detailed patterns and configuration examples:
references/logging-patterns.md - Complete structlog configuration and advanced logging patternsCLAUDE.md - Complete project standards and enforcement rulesdocs/adr/ - Architecture Decision Recordsdocs/tdd/ - Technical Design Documents