Styl: PEP 8, black, ruff (formatowanie i lint)

Spójny styl kodu to nie kwestia gustu — to redukcja kosztu czytania. W ZEUS-ie backend (FastAPI + SQLAlchemy + ARQ) pisze kilka osób, więc styl egzekwujemy automatycznie, a nie w komentarzach do PR-a. Dwa narzędzia załatwiają 95% pracy: black (formatowanie) i ruff (lint, w dużej części też zamiennik isort).

PEP 8 w pigułce

PEP 8 to oficjalny przewodnik stylu Pythona. Najważniejsze, czego pilnujemy:

  • 4 spacje wcięcia, nigdy taby.
  • snake_case dla funkcji i zmiennych, PascalCase dla klas, UPPER_CASE dla stałych.
  • Długość linii: w ProfessNet 88 znaków (domyślne dla black), nie 79.
  • Importy: stdlib → third-party → lokalne, oddzielone pustą linią.

black — koniec dyskusji o formatowaniu

black jest „nieprzejednany": nie konfiguruje się stylu, tylko go akceptuje.

# źle — ręczne, niespójne formatowanie
d = {'host':probe.host,'forest':probe.forest ,  'ts': now()}

# dobrze — po `black .`
d = {"host": probe.host, "forest": probe.forest, "ts": now()}

ruff — szybki linter

ruff (napisany w Rust) łączy w sobie flake8, isort, pyupgrade i dziesiątki innych reguł. Łapie martwe importy, nieużywane zmienne, złe wzorce.

# ruff: F401 'os' imported but unused  → usuń import
import os
from app.probes import run_inventory


async def collect(forest: str) -> list[dict]:
    return await run_inventory(forest)

Standard ProfessNet — pyproject.toml

Konfigurację trzymamy w jednym pliku pyproject.toml w katalogu serwisu:

[tool.black]
line-length = 88
target-version = ["py312"]

[tool.ruff]
line-length = 88
target-version = "py312"

[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B"]  # styl, błędy, importy, upgrade, bugbear
ignore = ["E501"]                     # długość linii pilnuje black

Standard ProfessNet: select = ["E", "F", "I", "UP", "B"] to nasze minimum. I zastępuje isort — nie instalujemy isort osobno.

Uruchamianie

ruff check --fix .   # napraw, co się da automatycznie
black .              # sformatuj
ruff check .         # sprawdź, czy zostało coś do ręcznej poprawy

Te same komendy odpalamy w pre-commit i w CI. PR, który nie przechodzi ruff check lub zmienia coś po black --check, nie wchodzi do main.

Wskazówka: w VS Code ustaw black jako formatter i włącz „format on save" oraz ruff jako extension — wtedy lokalnie nie zobaczysz czerwonego CI.


Zasada jest prosta: o formatowaniu nie dyskutujemy, bo robi to za nas maszyna. Energię z code review przenosimy na logikę, bezpieczeństwo i nazwy — tym zajmiemy się w kolejnych lekcjach.