← Python/Interfaces en typing
Les 3 van 8
MODULE 08 · 03◷ 27 min

Ontbrekende waarden met None beschrijven

Na deze les kun je
  • Een mogelijk ontbrekend resultaat met een union annoteren.
  • None onderscheiden van nul, False en lege tekst.
  • Een ontbrekende waarde gericht vervangen of afwijzen.

Een prijs van nul euro is een gevonden prijs. Een ontbrekende prijs betekent iets anders: je weet nog niet welk bedrag erbij hoort. Met None kun je dat ontbreken apart beschrijven, zodat een geldige nul niet per ongeluk verdwijnt.

Meer dan één toegestaan type

Een union beschrijft dat een waarde bij meer dan één type mag horen. Met int | None bedoel je een geheel getal of de waarde None. De verticale streep verbindt de alternatieven in de annotatie.

None betekent in deze les dat er geen resultaat aanwezig is. Het is een eigen waarde, geen tekst met de letters "None". Een functie die soms niets vindt, kan bijvoorbeeld str | None als retourannotatie krijgen.

Het eerste voorbeeld bewaart dit onderscheid bij het tonen van een prijs. Een aanwezige nul wordt gewoon getoond. Alleen de ontbrekende waarde krijgt de tekst "nog onbekend".

Alleen None betekent dat de prijs ontbreekt
def price_label(price: int | None) -> str:
    if price is None:
        return "nog onbekend"
    return str(price) + " euro"

for price in [None, 0, 12]:
    print(price_label(price))
Verwachte uitvoer
nog onbekend
0 euro
12 euro

Een annotatie voert ook hier geen invoercontrole uit. De functiebody bepaalt wat er bij de verschillende gevallen gebeurt. De union beschrijft voor de lezer welke uitkomsten bij de afspraak horen.

Aanwezigheid is geen waarheidstest

Je kent if value: uit de module over beslissingen. Die test behandelt onder meer nul, False, lege tekst en None als onwaar. Dat is handig wanneer die hele groep dezelfde betekenis heeft, maar niet wanneer alleen None een ontbrekende waarde markeert.

Gebruik daarom value is None voor deze afspraak. Je vergelijkt dan met de ene speciale ontbrekendewaarde. Met value is not None vraag je juist of er een aanwezige waarde is.

In use_default mag de invoer een geheel getal, tekst of None zijn. Een aanwezige nul en lege tekst blijven behouden. Ook False blijft dezelfde aanwezige waarde; bool is in Python een subklasse van int, en deze functie voert geen extra typevalidatie uit.

Een zoekfunctie mag niets vinden

first_or_none geeft het eerste element van een lijst terug. Is de lijst leeg, dan geeft zij None. Een lijst met één lege string is niet leeg en levert dus die lege string op.

Let op welk object je onderzoekt: eerst de lijst om te weten of er een eerste element is, daarna het element zelf. Je hoeft het element niet op waarheid te testen. De volgorde van de lijst blijft eveneens intact.

Ontbrekende sleutel of opgeslagen nul

Een dictionary maakt hetzelfde onderscheid bruikbaar bij een opzoeking. mapping.get(key) geeft hier None wanneer de sleutel ontbreekt, terwijl een gevonden nul gewoon nul blijft. In deze oefening bevat de dictionary uitsluitend gehele getallen als opgeslagen waarden.

Een opgeslagen nul verschilt van een ontbrekende sleutel
stock = {"pennen": 0, "mappen": 4}

for name in ["pennen", "mappen", "papier"]:
    count = stock.get(name)
    if count is None:
        print(name + ": onbekend")
    else:
        print(name + ": " + str(count))
Verwachte uitvoer
pennen: 0
mappen: 4
papier: onbekend

De aanroeper kan vervolgens zelf besluiten wat ontbreken betekent. De ene pagina toont "onbekend", terwijl een andere bewerking zonder die waarde niet verder kan. Door niet te vroeg nul te verzinnen, blijft die keuze beschikbaar.

Veelgemaakte fout: or als vervanging voor ontbrekend

value or fallback kiest de terugvalwaarde ook bij nul of lege tekst. Voor de opdracht use_default zou dat geldige invoer veranderen. Schrijf een expliciete keuze op basis van is None.

Soms is ontbreken wel echt een fout. require_title geeft een aanwezige tekst ongewijzigd terug en werpt alleen bij None een ValueError met de afgesproken melding. Een lege tekst telt volgens dit contract als aanwezig; strengere titelvalidatie zou een afzonderlijke afspraak zijn.

AAN DE SLAG 0/4
1

Een mogelijk ontbrekend eerste element teruggeven

Maak first_or_none(values: list[str]) -> str | None. Geef het eerste element van een niet-lege lijst ongewijzigd terug, ook als dat lege tekst is. Geef uitsluitend bij een lege lijst None en verander de lijst niet.

2

Alleen None door een terugvalwaarde vervangen

Maak use_default(value: int | str | None, fallback: int | str) -> int | str. Geef fallback alleen terug wanneer value None is. Bewaar andere ontvangen waarden precies, inclusief nul, False, lege tekst en spaties; voeg geen runtimeconversie toe.

3

Een dictionaryopzoeking als optioneel resultaat beschrijven

Maak read_optional(values: dict[str, int], key: str) -> int | None. Geef de opgeslagen waarde van key terug, inclusief nul of een negatief getal; geef bij een ontbrekende sleutel None. Verander de dictionary niet en pas de sleutel niet aan.

4

Ontbreken gericht als fout melden

Maak require_title(value: str | None) -> str. Geef iedere aanwezige tekst ongewijzigd terug, ook lege tekst of spaties. Werp alleen bij None ValueError("titel ontbreekt"); een lege tekst is volgens dit contract aanwezig.

Onthoud dit

  • Een union benoemt de alternatieve typen in een contract.
  • None verschilt van aanwezige waarden zoals nul en lege tekst.
  • De aanroeper kan een ontbrekend resultaat vervangen, tonen of afwijzen.

Hierna beschrijf je een typeverband dat voor veel verschillende soorten waarden hetzelfde blijft.

main.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.