Files
skill-python-style-preferences/python-anyio-async/SKILL.md
T

70 lines
2.4 KiB
Markdown

---
name: python-anyio-async
description: Use when working on Python async code in repositories that already use or are explicitly standardizing on anyio. Apply task-group, cancellation, timeout, and async-boundary patterns without migrating established asyncio, trio, or synchronous code unless requested.
---
# Python AnyIO Async
Use this skill for `anyio`-based async implementation work. It is not a general license to rewrite a repository's async model.
## Priority Order
1. Explicit user instructions
2. Existing repository async conventions and verification workflow
3. This skill
Only apply this skill when the repository already uses `anyio` or the user explicitly asks to standardize on it.
## Before Applying This Skill
Check the local project first:
- existing async imports and helpers
- current task runner and verification commands
- whether the code is `anyio`, `asyncio`, `trio`, or sync-only
- whether the CLI entrypoint is already established
If the repository is built around `asyncio`, `trio`, or synchronous code, keep that model unless the user asks for a migration.
## Defaults
- Prefer `anyio.create_task_group()` over manual task orchestration.
- Prefer `anyio.fail_after()` or cancellation scopes for time-bounded work.
- Use `anyio` streams and synchronization primitives instead of mixing in raw `asyncio` APIs.
- For async CLIs that already use `anyio`, keep a synchronous entrypoint that calls `anyio.run(...)`.
- When an `asyncio` boundary is unavoidable, isolate it and leave a short note.
```python
from pathlib import Path
import anyio
import click
@click.command()
@click.argument("config_path", type=click.Path(path_type=Path))
def main(config_path: Path) -> None:
anyio.run(run, config_path)
async def run(config_path: Path) -> None:
async with await anyio.open_file(config_path) as fh:
_ = await fh.read()
```
## Verification
Use the repository's existing verification workflow first.
If no local workflow exists and the repository is already aligned with this stack:
1. run the configured type checker
2. run the async test suite or `pytest`
3. run a CLI or module smoke test that exercises the async boundary when relevant
## Anti-Goals
- Do not replace an established `asyncio` or `trio` codebase with `anyio` unless asked.
- Do not mix manual event-loop management into `anyio` code without a forced integration boundary.
- Do not use this skill for synchronous code just because it contains a small async helper.