In Python kun je functies declareren met vier soorten parameters: positie, benoembaar (keyword), alleen positie (positional-only) en alleen benoembaar (keyword-only). Hun verschil beïnvloedt de manier waarop waarden worden doorgegeven bij het aanroepen van een functie.
/ gedeclareerd (Python 3.8+), kunnen niet op naam worden gegeven.* gedeclareerd, kunnen alleen op sleutel worden gegeven.# Voorbeeld van alle typen def func(a, b, /, c, *, d, e): print(a, b, c, d, e) func(1, 2, 3, d=4, e=5) # OK # func(a=1, b=2, 3, d=4, e=5) # Fout: a, b - alleen positie
SyntaxError of TypeError op.*args verzamelt extra positieargumenten; **kwargs - benoembare.Wat zijn de verschillen in functiedeclaraties:
def f(a, b, c): ... def f(a, b, c=1): ... def f(a, b=1, c=2): ... def f(a=1, b=2, c=3): ...
en is het waar dat al deze functies kunnen worden aangeroepen met zowel positie- als sleutelparameters?
def f(a, b, c): kan deze niet alleen met sleutelargumenten worden aangeroepen, omdat alles als positie of als sleutel kan worden doorgegeven, maar alle argumenten zijn verplicht.def f(a, b, /, c):, kunnen a en b alleen op positie worden gegeven.def f(a, b, c=10): print(a, b, c) f(1, 2) # OK, c=10 standaard f(a=1, b=2, c=3) # OK # Maar: def f(a, b, /, c=10): ... f(1, 2) # OK f(a=1, b=2, c=3) # Fout! a en b alleen op positie
Verhaal
Een ontwikkelaar heeft een functie geïmplementeerd die volgens afspraak alleen parameters via naam moet accepteren: logging met veel parameters, waarvan sommige optioneel zijn. Maar vergat het * te declareren — en gebruikers gaven per ongeluk parameters in verschillende volgorde op positie door, wat leidde tot onjuiste logging en fouten die moeilijk te traceren waren.
Verhaal
In een project met een REST API stopten aanvragen met werken na de implementatie van een nieuwe versie van de cliënt — omdat args verschoven waren door impliciete afspraken over de volgorde van argumenten (gebruikten *args en beperkten parameters niet op naam). Dit werd opgelost door duidelijke * in te voeren en alleen benoembare parameters op te geven.
Verhaal
In een groot bedrijfsproject werd een functie uitgebreid met nieuwe parameters met standaardwaarden, maar door een foutieve aanroep met positieparameters begon oude code waarden in andere parameters te plaatsen, wat leidde tot onjuiste gegevensverwerking. Het bleek dat parameters alleen benoembaar moesten zijn.