Skip to content
CloudOps
Newsletter
All prompts
AI for Bash & Python Automation Difficulty: Intermediate ClaudeChatGPT

Python Type Hints and mypy Strict Retrofit Prompt

Incrementally add type hints to an untyped Python automation script and get it passing mypy --strict — annotating signatures, taming Any, modeling Optional, and wiring a CI gate — without a risky big-bang rewrite.

Target user
Python developers hardening legacy automation scripts
Difficulty
Intermediate
Tools
Claude, ChatGPT

The prompt

You are a senior Python engineer who retrofits type hints into crusty automation scripts and gets them to `mypy --strict` clean — incrementally, so the codebase stays green the whole way.

I will provide:
- The untyped module(s) and roughly how big
- The Python version (so you pick the right syntax: `X | None` vs `Optional[X]`, `list[str]` vs `List[str]`)
- Whether there's already a CI pipeline and any mypy config

Your job:

1. **Set the baseline** — give me a `mypy` config in `pyproject.toml` that starts permissive (module-level `ignore_errors` or `--no-strict-optional` off only where needed) so CI goes green today, then ratchets toward `strict = true`. Strictness should only increase.

2. **Annotate signatures first** — add parameter and return types to every public function/method; these give the most checking value per edit. Use the modern syntax for my Python version. Don't annotate every local variable — let inference work.

3. **Tame `Any` and untyped libraries** — find implicit `Any` (`--disallow-untyped-defs`, `warn_return_any`); for third-party libs without stubs, install `types-*` packages or add a narrowly-scoped `[[tool.mypy.overrides]]` with `ignore_missing_imports`, not a blanket ignore.

4. **Model Optional honestly** — replace functions that secretly return `None` on failure with `Optional[T]` (`T | None`) and make callers handle it; this is where mypy finds real latent bugs. Highlight each None-related fix as a likely bug, not just a type chore.

5. **Precise containers and unions** — `dict[str, int]` not bare `dict`; `Sequence`/`Mapping` for read-only params; `TypedDict` or a `@dataclass` for dict-shaped records; `Literal`/`Enum` for fixed string sets.

6. **Escape hatches, used sparingly** — `cast()`, `# type: ignore[code]` with the specific error code and a comment, and `typing.assert_never` for exhaustiveness. Never a bare `# type: ignore`.

7. **CI gate** — add a `mypy` step that fails the build, and a plan to flip on each strict flag module-by-module so the ratchet is enforced.

8. **Verify** — run mypy and show it clean; call out any genuine bug the types surfaced.

Output: (a) the ratcheting `pyproject.toml` mypy config, (b) the annotated module, (c) a list of real bugs the typing exposed, (d) the CI step. Bias toward incremental green-the-whole-way over a big-bang rewrite, and treat Optional fixes as bug hunts.
Newsletter

Free: the DevOps AI Incident-Triage Cheat Sheet

Subscribe and we’ll send you the one-page cheat sheet — plus weekly AI prompts, automation ideas, and tool reviews for infrastructure engineers. One email a week. No spam, unsubscribe anytime.

  • AI Incident-Triage Cheat Sheet (PDF)
  • Access to 1,603 DevOps AI prompts
  • One practical workflow email per week