Come faccio a creare una funzione Python con argomenti opzionali?


223

Ho una funzione Python che accetta diversi argomenti. Alcuni di questi argomenti potrebbero essere omessi in alcuni scenari.

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

Gli argomenti dattraverso hsono stringhe che hanno ognuna significati diversi. È importante poter scegliere quali parametri opzionali passare in qualsiasi combinazione. Ad esempio,, (a, b, C, d, e)oppure (a, b, C, g, h), oppure (a, b, C, d, e, foppure tutti (queste sono le mie scelte).

Sarebbe bello se potessi sovraccaricare la funzione, ma ho letto che Python non supporta il sovraccarico. Ho provato a inserire alcuni degli argomenti int richiesti nell'elenco e ho riscontrato un errore di mancata corrispondenza dell'argomento.

In questo momento sto inviando stringhe vuote al posto dei primi pochi argomenti mancanti come segnaposto. Vorrei poter chiamare una funzione usando solo i valori reali.

C'è un modo per fare questo? Posso passare un elenco anziché l'elenco degli argomenti?

In questo momento il prototipo che utilizza i tipi è simile a:

_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]

Risposte:


198

Prova a chiamare piace: obj.some_function( '1', 2, '3', g="foo", h="bar" ). Dopo gli argomenti posizionali richiesti, è possibile specificare argomenti opzionali specifici per nome.


246

Usa semplicemente il *argsparametro, che ti consente di passare tutti gli argomenti che vuoi dopo il tuo a,b,c. Dovresti aggiungere un po 'di logica per mappare args-> c,d,e,fma è un "modo" di sovraccarico.

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

E stamperà i valori di c,d,e,f


Allo stesso modo potresti usare l' kwargsargomento e poi puoi nominare i tuoi parametri.

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

E poi kwargsavrebbe un dizionario di tutti i parametri che vengono valutati dopo la chiavea,b


Grazie. Anche se non posso usare questa flessibilità nel mio codice e non risolve il mio problema di chiamare con vari buchi vuoti nella mia lista, è un ottimo strumento da utilizzare in un progetto diverso. e Russel Borogove mi ha dato la risposta esatta di cui avevo bisogno per il mio problema, sono felice.
Thalia


@Nix, mi piace molto la tua risposta. Tuttavia, potresti chiarire a cosa c = kwargs.get('c', None)serve la dichiarazione ? È richiesto in tutte le funzioni che hanno argomenti opzionali? Nel tuo codice c'erano solo 2 argomenti opzionali. Che cosa succede se l'utente vuole un altro argomento arg e? Come posso modificare il vostro codice di esempio per qualsiasi numero imprecisato di argomenti opzionali, per es: def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)? Devo includere c = kwargs.get('c', None) etcprima di fare il obj.add(c, d, ...)?
Nemo,

Se sei preoccupato per la complessità del tempo. Questo sarebbe un problema
NduJay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.