Typannotationer och kodkvalitet
Kunna använda type hints, linters och formatterare för läsbar och säker kod.
Intuition
Python kör utan typer, men type hints låter verktyg hitta fel innan koden körs — och dokumenterar API:t på köpet.
def medel(varden: list[float], vikt: float | None = None) -> float: ...
Signaturen säger allt: en lista med tal in, eventuellt en vikt, ett tal ut.
Var typning ger mest värde:
- Publika funktioner som andra anropar.
- Datastrukturer som passerar mellan moduler (dataclass, Pydantic, TypedDict).
- Gränssnitt mot omvärlden: API-svar, konfiguration, filformat.
Var det ger minst: korta skript, notebooks, uppenbara lokala variabler.
Kod
from dataclasses import dataclass
from typing import Protocol, Literal
@dataclass(frozen=True)
class Resultat:
slug: str
score: float
metod: Literal["rule", "llm", "runner"]
class Rattare(Protocol): # strukturell typning: allt med rätt form duger
def ratta(self, svar: str) -> Resultat: ...
def sammanfatta(resultat: list[Resultat]) -> dict[str, float]:
if not resultat:
return {}
return {"medel": sum(r.score for r in resultat) / len(resultat),
"max": max(r.score for r in resultat)}
mypy src/ # typkontroll — hittar fel utan att köra koden
ruff check src/ # linter: oanvända importer, odefinierade namn, vanliga misstag
ruff format src/ # formatterare
Det typning faktiskt fångar: None där ett värde förväntas (den vanligaste körtidsbuggen i Python), fel argumentordning, fält som bytt namn efter en refaktorering, och returvärden som inte matchar. Kör mypy i CI, annars ruttnar annotationerna.
Var realistisk: börja med --ignore-missing-imports och typa de moduler som andra beror på. Full typtäckning i ett befintligt projekt är sällan värt det.
Behärskning innebär
- Använder type hints på funktioner och datastrukturer
- Kör mypy/ruff och tolkar felen
- Vet var typning ger mest värde
Förkunskaper
Logga in för att göra övningarna och bygga upp din behärskning.