Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Vanaf Python 3.5 kan je type hints toevoegen aan je code: annotaties die aangeven wat het verwachte type is van variabelen, parameters en returnwaarden. Ze zijn optioneel โ€” Python controleert ze niet bij het uitvoeren โ€” maar ze maken code aanzienlijk leesbaarder en zijn intussen standaardpraktijk in professionele Python-projecten.

Zonder type hintsMet type hints
BedoelingAfgeleid uit namen en docstringsExpliciet in de signatuur
IDE-ondersteuningBeperkte autocompleteVolledige autocomplete + waarschuwingen
Bugs opsporenPas bij uitvoer (runtime)Al tijdens het schrijven (mypy)
DocumentatieAparte docstringIngebouwd in de signatuur

In ML-bibliotheken zoals NumPy, Pandas en scikit-learn zijn type hints overal aanwezig. Je zult ze ook terugvinden in het cursusmateriaal en de ondersteunende broncode.

Variabelen annoterenยถ

Je kan een variabele annoteren met : type. Dit is puur informatief โ€” Python negeert de annotatie, maar bibliotheken zoals mypy gaan hiermee checks uitvoeren.

twenty-four

Functies annoterenยถ

Het meest gebruikte patroon: annoteer de parameters van een functie en de returnwaarde (na ->).

7.5
Hi, Alice!
Good day, Dr. Smith.
[INFO] Training complete
[WARNING] NaN detected in input
0.5

Collectietypesยถ

Vanaf Python 3.9 kan je de ingebouwde collectietypes rechtstreeks gebruiken als type hint โ€” geen import nodig.

[8.5, 7.0, 9.2] {'cat': 120, 'dog': 95} (3.0, 4.0)
[9.0, 8.1, 5.5]

Optional en Unionยถ

Soms kan een waarde None zijn โ€” bv. een parameter die niet verplicht is of een functie die niets teruggeeft als er geen resultaat is. Gebruik de |-operator (Python 3.10+) om meerdere toegestane types te combineren.

bird
None
9.0
6.25
Alice
None

Tip: gebruik de moderne str | None-syntax in nieuwe code. Je zult Optional[str] nog veel tegenkomen in bestaande bibliotheken.

ML-types: NumPy en Pandasยถ

In ML-code werk je voortdurend met NumPy-arrays en Pandas-structuren. Je kan die rechtstreeks als type hint gebruiken.

[2. 5.]
<class 'pandas.core.series.Series'> 4207.057057057057

Type hints in klassenยถ

In klassen annoteer je instantievariabelen in de __init__-methode. Je kan ook klassevariabelen apart declareren bovenaan de klasse.

Dataset(name='exam scores', n=4)
mean: 80.75

Any โ€” het ontsnappingsluikยถ

Soms ken je het type niet op voorhand, of wil je een annotatie vermijden voor dynamische data. Daarvoor bestaat Any: het is compatibel met elk type.

debug: 42 (type: int)
debug: 'hello' (type: str)
debug: [1, 2, 3] (type: list)

Gebruik Any spaarzaam โ€” het schakelt de typechecker uit voor die waarde. Prefereer een specifiek type waar mogelijk.

Statische controle met mypyยถ

Type hints worden niet afgedwongen door Python zelf, maar een statische typechecker zoals mypy analyseert je code zonder hem uit te voeren en rapporteert type-fouten.

mypy script.py

Voorbeeld van wat mypy opspoort:

def add(x: float, y: float) -> float:
    return x + y

add("hello", 3.0)  # mypy error: Argument 1 has type "str"; expected "float"

Dit project gebruikt mypy als onderdeel van de kwaliteitscontrole. IDEโ€™s zoals VS Code en PyCharm tonen mypy-fouten ook inline terwijl je typt.


Oefeningenยถ

Oefening 1 โ€” Voeg type hints toe aan de volgende functie (parameters รฉn returntype). Welk type geeft calculate_bmi terug?

def calculate_bmi(weight_kg, height_m):
    return weight_kg / height_m ** 2

Oefening 2 โ€” De volgende functie heeft een fout in het returntype. Identificeer de bug en herstel de annotatie.

def split_words(sentence: str) -> str:
    return sentence.split()

Oefening 3 โ€” Schrijf een functie column_summary die een pd.DataFrame en een kolomnaam (str) accepteert en een dictionary teruggeeft met de sleutels "mean", "std", "min" en "max" (allen float). Annoteer alle types.

Oefening 4 โ€” Voeg type hints toe aan deze klasse: annoteer de instantievariabelen en alle methoden.

class BoundingBox:
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def contains(self, px, py):
        return self.x <= px <= self.x + self.width and self.y <= py <= self.y + self.height

Oefening 5 โ€” Schrijf een functie parse_int die een string probeert om te zetten naar een int. Als de conversie lukt, geef de integer terug; anders geef None terug. Annoteer het returntype correct met |.