ProgrammatieBackend ontwikkelaar

Hoe werkt het mechanisme voor het omgaan met positie- en sleutelargumenten in Python? Wat zijn de nuances van de volgorde van argumenten bij het definiëren van een functie en het aanroepen ervan, en waarvoor zijn alleen positie- en alleen benoembare parameters nodig?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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.

Soorten parameters

  1. Positie (gaan meestal eerst): waarden worden doorgegeven in de volgorde van opgave.
  2. Benoembaar: worden expliciet aangeduid met een naam.
  3. Alleen positie: worden vóór het teken / gedeclareerd (Python 3.8+), kunnen niet op naam worden gegeven.
  4. Alleen benoembaar: worden na * 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

Nuances

  • Volgorde van parameters: (only-positional) / (positional-or-keyword) * (only-keyword)
  • Bij een foute volgorde van argumenten treedt er een SyntaxError of TypeError op.
  • *args verzamelt extra positieargumenten; **kwargs - benoembare.

Vraag met een valstrik.

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?

Antwoord:

  • Voor de functie 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.
  • Je kunt parameters op naam opgeven als ze niet zijn gedefinieerd als alleen positie.
  • Als de functie is gedeclareerd als def f(a, b, /, c):, kunnen a en b alleen op positie worden gegeven.

Voorbeeld:

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

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp


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.