Kies een goede default
Gebruik Hallo als standaardprefix in greet; een expliciet prefix moet blijven werken.
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 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 ==.
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.
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))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.
| Parameter | Hoe doorgeven? | Bij ontbreken |
|---|---|---|
text, vóór / | Alleen op positie | Verplicht argument |
prefix, tussen / en * | Op positie of op naam | "Status" |
upper, na * | Alleen op naam | False |
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.
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.
def format_status(text, /, prefix="Status", *, upper=False):
if upper:
text = text.upper()
return f"{prefix}: {text}"
print(format_status(text="klaar"))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.
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.
Gebruik Hallo als standaardprefix in greet; een expliciet prefix moet blijven werken.
Laat shipping base + weight * per_kg teruggeven met defaults 4 en 2.
Maak upper keyword-only in format_tag en geef alleen bij True hoofdletters terug.
Maak value positional-only in scale en zet factor standaard op twee; factor mag op positie en op naam.
/ staan parameters voor alleen positie, na * parameters voor alleen naam.Hierna onderzoek je welke waarde een naam binnen en buiten een functie aanwijst.
Voer je code uit en ontdek
wat je hebt gemaakt.
Je hoeft het niet in één keer goed te doen. Na het uitvoeren zie je hier welke stappen al kloppen.