← Python/Denken in functies
Les 3 van 8
MODULE 03 · 03◷ 24 min

Maak afspraken over argumenten

Na deze les kun je
  • Defaultwaarden bewust gebruiken
  • Argumenten op naam doorgeven
  • Keyword-only en positional-only herkennen

Bijna elk statusbericht krijgt hetzelfde voorvoegsel. Af en toe wil je een andere tekst of hoofdletters gebruiken. Je kunt die gewone keuze in de functie vastleggen en bij een uitzondering alleen de gewenste optie aanpassen.

Een gewone waarde als uitgangspunt

Een defaultwaarde is een standaardwaarde die Python gebruikt als het bijbehorende argument ontbreekt. Met prefix="Status" in de definitie spreek je af wat de gewone keuze is. Een meegegeven argument vervangt die keuze voor de betreffende aanroep.

Ontbreken is iets anders dan een lege tekst meegeven. Als de aanroeper prefix="" schrijft, heeft hij wél een argument gegeven en gebruikt de functie die lege tekst. Defaults vullen dus geen waarden aan die Python toevallig ongewenst vindt.

Een keywordargument koppelt een waarde bij naam: upper=True vertelt direct welke optie verandert. Zo hoef je niet alle eerdere optionele parameters te herhalen. Het = hoort hier bij de koppeling in de aanroep; het is geen vergelijking met ==.

Lees de definitie als een afspraak

Soms wil je vastleggen hoe iemand een argument moet doorgeven. Keyword-only betekent uitsluitend op naam; een losse * in de definitie maakt de parameters erna keyword-only. Een optie als upper=True is dan ook buiten de functie goed leesbaar.

Positional-only betekent uitsluitend op positie. Een / in de definitie maakt de parameters ervoor positional-only. Daarmee kunnen aanroepers die parameternaam niet als keyword gebruiken; hun aanroep hangt alleen van de afgesproken plaats af.

In een functiedefinitie zijn deze losse / en * scheidingstekens. Ze delen en vermenigvuldigen niets. Het voorbeeld combineert de afspraken, zodat je hun plaatsen naast elkaar kunt vergelijken.

Een statuslabel met duidelijke opties
def format_status(text, /, prefix="Status", *, upper=False):
    if upper:
        text = text.upper()
    return f"{prefix}: {text}"

print(format_status("klaar"))
print(format_status("klaar", prefix="Taak", upper=True))
print(format_status("wacht", "Update", upper=True))
Verwachte uitvoer
Status: klaar
Taak: KLAAR
Update: WACHT

Druk op Voorbeeld uitvoeren en vergelijk de drie aanroepen. De eerste gebruikt beide defaults. De tweede vervangt beide opties op naam en de derde geeft het voorvoegsel op positie mee.

ParameterHoe doorgeven?Bij ontbreken
text, vóór /Alleen op positieVerplicht argument
prefix, tussen / en *Op positie of op naam"Status"
upper, na *Alleen op naamFalse

De methode .upper() zet tekst om naar hoofdletters, de tegenhanger van de eerder gebruikte .lower().

De if in het functieblok werkt zoals je al kent: alleen bij True wordt de tekst vervangen door hoofdletters. De return gebruikt vervolgens de gekozen tekst en het gekozen voorvoegsel. De afspraken bij de haakjes bepalen de invoer; het ingesprongen blok bepaalt de bewerking.

Veelgemaakte fout: een verboden naam gebruiken

Een parameternaam in de definitie betekent niet altijd dat je hem bij een aanroep als keyword mag schrijven. Deze zelfstandige variant roept de functie bewust verkeerd aan.

Een positieargument toch bij naam geven
def format_status(text, /, prefix="Status", *, upper=False):
    if upper:
        text = text.upper()
    return f"{prefix}: {text}"

print(format_status(text="klaar"))
Verwachte fout
TypeError

Python meldt TypeError, een fout die hier betekent dat de argumenten niet bij de toegestane aanroep passen. text staat vóór / en mag daarom niet als text="klaar" worden meegegeven. Met format_status("klaar") voldoet de aanroep wel aan de afspraak.

Voor een keyword-only optie geldt de omgekeerde controle: schrijf de naam erbij. Je hoeft zulke fouten in deze les niet op te vangen. De tests proberen ook ongeldige aanroepen en verwachten dat Python ze weigert.

Maak de afspraken in je eigen functies

Werk in de opdrachten van eenvoudige defaults naar expliciete aanroepafspraken. Kijk bij elke fout eerst naar de definitieregel, daarna naar de berekening in het blok. Een goede berekening alleen is niet genoeg als de functie ook een verboden aanroep accepteert.

AAN DE SLAG 0/4
1

Kies een goede default

Gebruik Hallo als standaardprefix in greet; een expliciet prefix moet blijven werken.

2

Vervang alleen wat genoemd wordt

Laat shipping base + weight * per_kg teruggeven met defaults 4 en 2.

3

Vereis een keyword

Maak upper keyword-only in format_tag en geef alleen bij True hoofdletters terug.

4

Vereis een positie

Maak value positional-only in scale en zet factor standaard op twee; factor mag op positie en op naam.

Wat je meeneemt

  • Een default wordt gebruikt wanneer het argument ontbreekt; een keyword vervangt een keuze op naam.
  • Vóór / staan parameters voor alleen positie, na * parameters voor alleen naam.
  • Python controleert de aanroepafspraken voordat het functieblok wordt uitgevoerd.

Hierna onderzoek je welke waarde een naam binnen en buiten een functie aanwijst.

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.