Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when building Python 3.11+ applications requiring type safety, async programming, or robust error handling. Generates type-annotated Python code, configures mypy in strict mode, writes pytest test suites with fixtures and mocking, and validates code with black and ruff. Invoke for type hints, async/await patterns, dataclasses, dependency injection, logging configuration, and structured error handling.
.claude/skills/jeffallan-python-pro/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 153% | 0% |
| case-06 | ✓→✗ | ▼ Worse | 272% | 0% |
Modern Python 3.11+ specialist focused on type-safe, async-first, production-ready code.
mypy --strict, black, ruffLoad detailed guidance based on context:
| Topic | Reference | Load When | |-------|-----------|-----------| | Type System | references/type-system.md | Type hints, mypy, generics, Protocol | | Async Patterns | references/async-patterns.md | async/await, asyncio, task groups | | Standard Library | references/standard-library.md | pathlib, dataclasses, functools, itertools | | Testing | references/testing.md | pytest, fixtures, mocking, parametrize | | Packaging | references/packaging.md | poetry, pip, pyproject.toml, distribution |
X | None instead of Optional[X] (Python 3.10+)pythonfrom pathlib import Path def read_config(path: Path) -> dict[str, str]: """Read configuration from a file. Args: path: Path to the configuration file. Returns: Parsed key-value configuration entries. Raises: FileNotFoundError: If the config file does not exist. ValueError: If a line cannot be parsed. """ config: dict[str, str] = {} with path.open() as f: for line in f: key, _, value = line.partition("=") if not key.strip(): raise ValueError(f"Invalid config line: {line!r}") config[key.strip()] = value.strip() return config
pythonfrom dataclasses import dataclass, field @dataclass class AppConfig: host: str port: int debug: bool = False allowed_origins: list[str] = field(default_factory=list) def __post_init__(self) -> None: if not (1 <= self.port <= 65535): raise ValueError(f"Invalid port: {self.port}")
pythonimport asyncio import httpx async def fetch_all(urls: list[str]) -> list[bytes]: """Fetch multiple URLs concurrently.""" async with httpx.AsyncClient() as client: tasks = [client.get(url) for url in urls] responses = await asyncio.gather(*tasks) return [r.content for r in responses]
pythonimport pytest from pathlib import Path @pytest.fixture def config_file(tmp_path: Path) -> Path: cfg = tmp_path / "config.txt" cfg.write_text("host=localhost\nport=8080\n") return cfg @pytest.mark.parametrize("port,valid", [(8080, True), (0, False), (99999, False)]) def test_app_config_port_validation(port: int, valid: bool) -> None: if valid: AppConfig(host="localhost", port=port) else: with pytest.raises(ValueError): AppConfig(host="localhost", port=port)
toml[tool.mypy] python_version = "3.11" strict = true warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true
Clean mypy --strict output looks like:
Success: no issues found in 12 source filesAny reported error (e.g., error: Function is missing a return type annotation) must be resolved before the implementation is considered complete.
When implementing Python features, provide:
Python 3.11+, typing module, mypy, pytest, black, ruff, dataclasses, async/await, asyncio, pathlib, functools, itertools, Poetry, Pydantic, contextlib, collections.abc, Protocol
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 27,641 | 21,704 | -21% | 1 | 1 | 0% | 6,199 | 6,738 | +9% | 0 | 0 | — |
case-02 | fail→pass | 27,398 | 21,457 | -22% | 1 | 1 | 0% | 6,203 | 6,677 | +8% | 0 | 0 | — |
case-03 | fail→pass | 25,972 | 21,234 | -18% | 1 | 1 | 0% | 6,191 | 6,182 | -0% | 0 | 0 | — |
case-04 | pass→pass | 5,253 | 8,605 | +64% | 1 | 1 | 0% | 1,157 | 3,344 | +189% | 0 | 0 | — |
case-05 | pass→pass | 7,905 | 8,638 | +9% | 1 | 1 | 0% | 1,562 | 3,157 | +102% | 0 | 0 | — |
case-06 | pass→fail | 5,516 | 11,562 | +110% | 1 | 1 | 0% | 1,115 | 4,144 | +272% | 0 | 0 | — |
case-07 | pass→pass | 12,980 | 10,643 | -18% | 1 | 1 | 0% | 2,256 | 3,464 | +54% | 0 | 0 | — |
case-08 | pass→pass | 6,603 | 7,478 | +13% | 1 | 1 | 0% | 1,428 | 2,935 | +106% | 0 | 0 | — |
case-09 | pass→pass | 6,182 | 10,986 | +78% | 1 | 1 | 0% | 1,020 | 3,461 | +239% | 0 | 0 | — |
case-10 | fail→pass | 20,064 | 25,606 | +28% | 1 | 1 | 0% | 4,300 | 6,358 | +48% | 0 | 0 | — |
case-11 | pass→pass | 12,440 | 8,790 | -29% | 1 | 1 | 0% | 1,495 | 3,267 | +119% | 0 | 0 | — |
case-12 | pass→pass | 10,596 | 14,968 | +41% | 1 | 1 | 0% | 2,132 | 4,661 | +119% | 0 | 0 | — |
case-13 | pass→pass | 7,491 | 12,472 | +66% | 1 | 1 | 0% | 1,516 | 3,991 | +163% | 0 | 0 | — |
case-14 | pass→fail | 7,424 | 13,884 | +87% | 1 | 1 | 0% | 1,611 | 4,378 | +172% | 0 | 0 | — |
case-15 | pass→pass | 11,143 | 13,026 | +17% | 1 | 1 | 0% | 2,182 | 4,385 | +101% | 0 | 0 | — |
case-16 | pass→pass | 14,913 | 13,721 | -8% | 1 | 1 | 0% | 2,864 | 4,478 | +56% | 0 | 0 | — |
case-17 | pass→pass | 12,551 | 11,082 | -12% | 1 | 1 | 0% | 2,670 | 3,548 | +33% | 0 | 0 | — |
case-18 | pass→pass | 5,745 | 4,612 | -20% | 1 | 1 | 0% | 1,221 | 2,285 | +87% | 0 | 0 | — |
case-19 | pass→pass | 5,150 | 9,315 | +81% | 1 | 1 | 0% | 1,038 | 3,517 | +239% | 0 | 0 | — |
case-20 | pass→pass | 13,792 | 22,146 | +61% | 1 | 1 | 0% | 2,798 | 6,756 | +141% | 0 | 0 | — |
case-21 | pass→pass | 7,597 | 7,237 | -5% | 1 | 1 | 0% | 1,476 | 2,928 | +98% | 0 | 0 | — |
case-22 | fail→pass | 7,273 | 10,664 | +47% | 1 | 1 | 0% | 1,475 | 3,738 | +153% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.