mcpField
W
writing-python

writing-python

github.com/julianobarbosaDevelopment14132 installsUpdated 2d ago
Repository

About writing-python

writing-python is an agent skill for Python development, aimed at developers writing and maintaining Python projects. It sets out practices such as type hints and standard-library-first choices, with a toolchain centered on uv, ruff, pytest, and mypy.

Key features

  1. 01Promote standard-library-first and explicit error handling
  2. 02Require type hints for functions and parameters
  3. 03Provide dataclass and pattern-matching examples
  4. 04Recommend uv, ruff, pytest, and mypy
  5. 05Cover style and type-safety references

Use cases

  1. 01Add type hints to Python functions
  2. 02Set up project linting and type checking
  3. 03Write pytest tests and run checks
  4. 04Review guidance on async dependencies and annotations

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/julianobarbosa/claude-code-skills --skill writing-python

After installing, type/writing-pythonin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

CLI.md
PATTERNS.md
TESTING.md
References/
code-style.md
type-safety.md

Details

From the project README

Python Development (3.14+)

Core Principles

  • Stdlib first: External deps only when justified
  • Type hints everywhere: All functions, all parameters
  • Explicit over implicit: Clear is better than clever
  • Fail fast: Raise early with informative errors

Toolchain

uv           # Package management (not pip/poetry)
ruff         # Lint + format (not flake8/black)
pytest       # Testing
mypy         # Type checking

Quick Patterns

Type Hints
def process_users(users: list[User], limit: int | None = None) -> list[Result]:
    ...

async def fetch_data(url: str, timeout: float = 30.0) -> dict[str, Any]:
    ...
Dataclasses
from dataclasses import dataclass, field

@dataclass
class Config:
    host: str
    port: int = 8080
    tags: list[str] = field(default_factory=list)
Pattern Matching
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}")

Python 3.14 Features

  • Deferred annotations: No more from __future__ import annotations
  • Template strings (t""): t"Hello {name}" returns Template object
  • except without parens: except ValueError, TypeError:
  • concurrent.interpreters: True parallelism via subinterpreters
  • compression.zstd: Zstandard in stdlib
  • Free-threaded build: No GIL (opt-in)

References

Tooling

uv sync                    # Install deps
ruff check --fix .         # Lint and autofix
ruff format .              # Format
pytest -v                  # Test
mypy .                     # Type check

Absorbed sub-skills (post-consolidation)

This skill now subsumes the former python-code-style and python-type-safety skills. Their original SKILL.md content is preserved as deep reference:

SubjectPath
ruff, mypy, naming, imports, docstrings (Google style)References/code-style.md
Type annotations, generics, protocols, strict checking patternsReferences/type-safety.md

For system-reliability concerns (background jobs, retries, observability), see the sibling python-infrastructure skill. For dependency management and project scaffolding, see uv.


Gotchas

  • from __future__ import annotations makes ALL annotations strings — runtime introspection (typing.get_type_hints) needs the actual types available; forward refs to local-scope classes fail.
  • f-string debug syntax (f"{var=}") is 3.8+ — quietly fails (treats = as literal) in 3.7 and earlier.
  • dataclass(slots=True) is 3.10+ — silently does nothing in 3.9. Use __slots__ manually for portability.
  • PEP 604 union syntax (int | None) is 3.10+ at runtime — works as a string annotation in 3.9 with from __future__ import annotations, fails at runtime introspection.
  • async def vs def for FastAPI dependencies: async deps run in the event loop; sync deps run in a thread pool. Mixing without thought causes either blocking or extra context-switch overhead.

Comments

Markdown supported