Przejdź do treści
Biblioteka skilli
Programowanie · Budowanie i kod

lang-python

/lang-python

Pisze, przegląda, testuje i konfiguruje backend w Pythonie w przebiegu loops: narzędzia, układ, pokrycie i pułapki języka.

Repozytorium
ai-loops ↗
Licencja
MIT
Ostatnia zmiana repozytorium
13.11.2026

Ocena i bezpieczeństwo

100/ 100Klasa: dobry
Format25 / 25
Frontmatter z nazwą i opisem, poprawna nazwa, opis do 1024 znaków, nazwa zgodna z folderem.
Odkrywalność25 / 25
Opis mówi, kiedy użyć skilla, ma sensowną długość i jest w 3. osobie.
Treść35 / 35
Co najmniej 150 słów i do 500 linii, nagłówki, listy kroków, przykłady albo kod.
Higiena15 / 15
Bez zaślepek typu TODO, bez ścieżek Windows, z licencją.
Ryzykobrak sygnałów w skanie
Pliki w paczce
9
Skrypty
0
Komentarze HTML
0
Adresy URL w SKILL.md
0
Przestarzałość

Brak sygnałów. Repozytorium zmienione 13.11.2026, bez odwołań do wycofanych modeli i API.

Licencja

MIT, otwarta: można używać i zmieniać, z zachowaniem informacji o autorze.

Co robi i kiedy

Pisze, przegląda, testuje i konfiguruje backend w Pythonie w przebiegu loops: narzędzia, układ, pokrycie i pułapki języka.

Oryginalny opis (EN)

Use when writing, reviewing, testing or setting up Python backend code in a loops run (the python language pack) - toolchain, layout, race policy, coverage, idioms and footguns.

Jak działa

  1. 1. When it applies
  2. 2. Project rules first
  3. 3. The toolchain the gate runs
  4. 4. Race policy: none plus the substitute
  5. 5. Coverage recipe
  6. 6. Layer map
  7. 7. Footguns
  8. 8. Load on demand
Sekcje z nagłówków SKILL.md, w oryginale · 92 linii, 908 słów
Podgląd SKILL.md
---
name: lang-python
description: Use when writing, reviewing, testing or setting up Python backend code in a loops run (the python language pack) - toolchain, layout, race policy, coverage, idioms and footguns.
---

# Python language pack

Rules: `specs/languages/python/RULES.md` (IDs `PY-<SEC>-NN`). Pack data: `specs/languages/python/pack.json` (`loops lang show python`). Layers, ports, errors and consistency are language-neutral: `specs/ARCHITECTURE.md`, `skills/hexagonal`, `skills/consistency`. Gate, roles and the race rule: `specs/WORKFLOW.md §6`.

## 1. When it applies

`loops lang detect` reports `python` for a root (`pyproject.toml`, `uv.lock` or `requirements.txt`). Several packs can apply to one repo: gate each root with its own pack.

## 2. Project rules first

The repository's own configuration wins over the pack defaults: `pyproject.toml` (`[tool.ruff]`, `[tool.mypy]`, `[tool.pytest.ini_options]`, `[tool.coverage]`, `[tool.importlinter]`), `ruff.toml`, `mypy.ini`, `pyrightconfig.json`, `tox.ini`, `.pre-commit-config.yaml`, framework conventions (Django apps, Flask blueprints). Read them before writing code (`config_files` in the pack). Poetry, pip-tools, black, flake8, unittest or a flat layout are legitimate project choices: follow them and log each deviation with `loops run override --rule "<loops rule>" --project "<project rule, file:line>" --note "<what you did>"`.

## 3. The toolchain the gate runs

`loops gate` runs these in order (agents may run the single commands while iterating; QA scopes with `--only`/`--pkgs`; `{pkgs}` = `src`, `{pkg_dirs}` = `.`):

| Check | Command | Required |
|---|---|---|
| `sync` (deps) | `uv sync --locked` when `uv.lock` exists, else `python -m pip install -e . --group dev` | no |
| `ruff-format` | `ruff format --check .` | only when ruff config is committed (D14) |
| `ruff` | `ruff check --output-format=concise .` | yes |
| `mypy` / `pyright` | `mypy --strict src` / `pyright` (the one the project configures; each skips if not installed) | no |
| `import-linter` (arch) | `lint-imports`, when `.importlinter` exists | no |
| `test` | `pytest -p randomly -n 2 -W error --cov --cov-branch --cov-report=xml:{coverage}` with `PYTHONDEVMODE=1` | yes |
| `coverage` | new-code coverage >= 70% from the Cobertura file (loops computes it) | yes |
| `bandit` | `bandit -r src -ll -q` | no |
| `pip-audit` | `pip-audit --locked .`, only with `--vuln` | off by default |

A missing optional tool skips with its install hint (D12); missing pytest, pytest-cov, pytest-randomly or pytest-xdist fails the required `test` check. Tools must resolve on PATH: activate `.venv`, or run the gate as `uv run loops gate`. After a file edit the post-edit hook runs `ruff format <file>` and `ruff check <dir>`. See `PY-TOOL-03..10`, `PY-REPO-04/05`.

Run `uv sync --locked` (never plain `uv sync`) so a stale lock breaks the build (`PY-REPO-05`).

## 4. Race policy: `none` plus the substitute

CPython has no data-race detector, so the required `test` check is the substitute (`PY-CONC-05/06`, WORKFLOW §6): random order (`-p randomly`, printed seed), two xdist workers (`-n 2`), warnings as errors (`-W error`), dev mode (`PYTHONDEVMODE=1`: asyncio debug, `ResourceWarning`). To satisfy it:
- never pass `-p no:randomly`, a fixed order, a retry plugin or `-n 0` to the gate run;
- reproduce a failure with `--randomly-seed=<seed from the output>`; fix the shared state, never the flag;
- for changed test files, also run them under two other `--randomly-seed` values;
- threaded code on a free-threaded interpreter (3.14t/3.15t): add `PYTHON_GIL=0 pytest --parallel-threads=4 --iterations=10` (`concurrency.md`);
- if the host cannot run the substitute (plugin missing, no pytest-xdist), the gate fails with a preflight message; install it, do not skip.

## 5. Coverage recipe

Cobertura XML at `{coverage}`, branch coverage on. Project prerequisites the architect or `python-engineer` adds in wave 0 (D13, logged as an override if the project differs):
- `[dependency-groups]` with `test = [pytest, pytest-cov, pytest-randomly, pytest-xdist]` and `lint = [mypy, import-linter, bandit]`; `uv.lock` committed;
- `[tool.coverage.run] source = ["src"]`, `branch = true`; `[tool.coverage.report] exclude_also = ["if TYPE_CHECKING:", "raise NotImplementedError", "\\.\\.\\."]`;
- `[tool.pytest.ini_options]`: `testpaths = ["tests"]`, `addopts = ["--import-mode=importlib", "--strict-markers", "--strict-config"]`, `filterwarnings = ["error"]`;
- `[tool.ruff]` with explicit rule selection (`PY-TOOL-04`), `[tool.mypy] strict = true`, `.importlinter`, `.python-version`, `.gitignore` entries (`PY-REPO-13`).

Excluded from the gate's coverage: tests, `conftest.py`, `*.pyi`, migrations, `compose.py`, `main.py`, `__main__.py`, generated files. Do not add `omit` entries to hit a number (`PY-TEST-09`).

## 6. Layer map

```
src/<pkg>/
  domain/        pure: frozen dataclasses, enums, errors; no I/O, no clock, no os/requests/sqlalchemy/pydantic
  application/   use cases + ports (typing.Protocol, owned by the consumer)
  adapters/
    inbound/     http (FastAPI/Flask routers), cli, worker
    outbound/    db (SQLAlchemy, Alembic), clock, http clients
  compose.py     composition root: build_app(settings)
  main.py        create_app() only
tests/unit  tests/integration  conftest.py
```

`loops arch` does not parse Python (`arch.parser: none`): `import-linter` enforces direction, forbidden imports and cycles. Purity, clock and RNG injection stay review items (`PY-ARCH-07`). Django keeps its app layout (`frameworks.md`).

## 7. Footguns

1. Mutable default arguments: `None` plus create inside, or `default_factory`.
2. Blocking calls in `async def`: `httpx.AsyncClient` or `asyncio.to_thread`.
3. Bare `except`, swallowed `CancelledError`: narrow the type, re-raise cancellation.
4. `asyncio.create_task` without keeping a reference: `TaskGroup`.
5. `pickle`/`yaml.load` on untrusted data: JSON, `safe_load`, Pydantic.
6. Naive or `utcnow()` datetimes: `datetime.now(UTC)` via an injected clock.
7. `assert` for validation: raise a real exception.
8. Import-time side effects and cycles: wire in `compose.py`, enforce with import-linter.
9. Float money, mutable hash keys: `Decimal`, frozen dataclasses.
10. "The GIL makes it thread-safe": it does not; use a `Lock` or a queue.

## 8. Load on demand

- `repo.md`: layout, pyproject, uv, lockfile, CI order, hygiene (`PY-REPO`, `PY-TOOL`).
- `architecture.md`: hexagon in Python, Protocol ports, import-linter contracts (`PY-ARCH`).
- `idioms.md`: errors, typing, dataclasses, datetimes, money, imports (`PY-IDIOM`, `PY-PERF`).
- `testing.md`: pytest layout, fixtures, fakes, randomly/xdist, coverage (`PY-TEST`).
- `concurrency.md`: asyncio, threads, free-threading, the substitute check (`PY-CONC`).
- `security.md`: injection, deserialisation, SSRF, secrets, supply chain (`PY-SEC`).
- `data-api.md`: SQLAlchemy, migrations, HTTP, logging, metrics, config, packaging (`PY-DATA`, `PY-API`, `PY-OBS`, `PY-OPS`).
- `frameworks.md`: FastAPI, Django, Flask conventions (`PY-FW`, `PY-DOC`).
Pliki w paczce (9)
  • SKILL.md 7 KB
  • architecture.md 3 KB
  • concurrency.md 3 KB
  • data-api.md 4 KB
  • frameworks.md 2 KB
  • idioms.md 3 KB
  • repo.md 3 KB
  • security.md 2 KB
  • testing.md 3 KB

Wersje

W bazie nie ma innych skilli o nazwie lang-python.

Migawka bazy z 13.11.2026 · wersja paczki aeae4f8d04af (skrót SHA-256 całej paczki)

Pobrania w ostatnich 30 dniach: 0 · ranking

Zgłoś problem z tym skillem: szkodliwa treść, błędny opis albo prośba autora o usunięcie.

Podobne skille

  • 100lang-go
    Pisze, przegląda, testuje i konfiguruje backend w Go w przebiegu loops: narzędzia, układ, pokrycie i pułapki języka.
  • 100lang-cpp
    Pisze, przegląda, testuje i konfiguruje backend w C++ w przebiegu loops: narzędzia, układ, pokrycie i pułapki języka.
  • 100python
    Stosuje konwencje języka Python, nowoczesne idiomy i narzędzia przy pisaniu, przeglądzie, refaktoryzacji i debugowaniu projektów w Pythonie.
  • 90testing-python
    Wyznacza strategię testów dla Pythona 3.14+, gdy pisze się testy, ocenia pokrycie lub konfiguruje testy.
  • 100create-lang-dev-skill
    Tworzy skill programistyczny dla konkretnego języka (rust-dev, go-dev, python-dev) na podstawie przeglądów PR, konwencji kodu, systemu budowania i dokumentacji zespołu.
  • 100python-testing
    Pomaga pisać testy w Pythonie z pytest: jednostkowe i integracyjne, fixtury, mockowanie oraz pokrycie kodu.

Uwagi i zgłoszenia

Wiadomość trafi do Bartosza Sokolińskiego. Adres e-mail jest potrzebny tylko do odpowiedzi. Szczegóły w polityce prywatności.