Hoe maak ik een Python-functie met optionele argumenten?

Ik heb een Python-functie waarvoor verschillende argumenten nodig zijn. Sommige van deze argumenten kunnen in sommige scenario’s worden weggelaten.

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

De argumenten dtot en met hzijn strings die elk een andere betekenis hebben. Het is belangrijk dat ik kan kiezen welke optionele parameters ik in elke combinatie door moet geven. Bijvoorbeeld (a, b, C, d, e), of (a, b, C, g, h), of (a, b, C, d, e, f, of allemaal (dit zijn mijn keuzes).

Het zou geweldig zijn als ik de functie zou kunnen overbelasten, maar ik heb gelezen dat Python overbelasting niet ondersteunt. Ik heb geprobeerd enkele van de vereiste int-argumenten in de lijst in te voegen – en kreeg een foutmelding dat het argument niet overeenkomt.

Op dit moment stuur ik lege strings in plaats van de eerste paar ontbrekende argumenten als tijdelijke aanduidingen. Ik zou graag een functie willen aanroepen met alleen de werkelijke waarden.

Is er een manier om dit te doen? Kan ik een lijst doorgeven in plaats van de lijst met argumenten?

Op dit moment ziet het prototype dat ctypes gebruikt er ongeveer zo uit:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]

Antwoord 1, autoriteit 100%

Probeer het aan te roepen als: obj.some_function( '1', 2, '3', g="foo", h="bar" ). Na de vereiste positionele argumenten kunt u specifieke optionele argumenten op naam specificeren.


Antwoord 2, autoriteit 93%

Gebruik gewoon de parameter *args, waarmee u zoveel argumenten kunt doorgeven als u wilt na uw a,b,c. Je zou wat logica moeten toevoegen om args->c,d,e,fin kaart te brengen, maar het is een “manier” van overbelasting.

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

En het zal waarden afdrukken van c,d,e,f


Op dezelfde manier zou je het argument kwargskunnen gebruiken en dan zou je je parameters een naam kunnen geven.

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

En dan zou kwargseen woordenboek hebben van alle parameters die een sleutelwaarde hebben na a,b


Antwoord 3, autoriteit 5%

Het is heel eenvoudig om dit gewoon te doen

def foo(a = None):
       print(a)

In plaats van Geen kun je alles typen wat op zijn plaats zou moeten zijn als er geen argument was, bijvoorbeeld als je de waarde van de parameter niet zoals deze foo()schrijft, dan zal het Geen afdrukken omdat nee argument wordt gegeven en als u het een argument GEEFT zoals foo("hello world"), dan zal het hello world

afdrukken

Other episodes