2013-02-25 12 views
16

in Python possiamo fare questo:Python: Passaggio di parametri per nome insieme a kwargs

def myFun1(one = '1', two = '2'): 
    ... 

Poi possiamo chiamare la funzione e passare gli argomenti con il loro nome:

myFun1(two = 'two', one = 'one')

anche siamo in grado di fare questo:

def myFun2(**kwargs): 
    print kwargs.get('one', 'nothing here') 

myFun2(one='one')

quindi mi chiedevo se è possibile combinare entrambi i metodi come:

def myFun3(name, lname, **other_info): 
    ... 

myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')

In generale quali combinazioni che possiamo fare?

Grazie e scusa per la mia stupida domanda

+1

correlati: http://stackoverflow.com/questions/9872824/calling -a-python-function-with-args-kwargs-and-optional-default-arguments – mgilson

risposta

19

L'idea generale è:

def func(arg1, arg2, ..., kwarg1=default, kwarg2=default, ..., *args, **kwargs): 
    ... 

È possibile utilizzare come molti di quelli come si desidera. Lo * e lo ** "assorbono" tutti i valori rimanenti non altrimenti considerati.

Gli argomenti posizionali (forniti senza valori predefiniti) non possono essere forniti dalla parola chiave e gli argomenti non predefiniti non possono seguire gli argomenti predefiniti.

Nota Python 3 aggiunge anche la possibilità di specificare parole chiave unici argomenti facendoli dopo *:

def func(arg1, arg2, *args, kwonlyarg=default): 
    ... 

È inoltre possibile utilizzare solo * (def func(a1, a2, *, kw=d):) il che significa che non ha argomenti vengono catturati, ma nulla dopo è solo per parole chiave.

Quindi, se siete in 3.x, si potrebbe produrre il comportamento che si desidera con:

def myFun3(*, name, lname, **other_info): 
    ... 

che consentirebbe di chiamare con name e lname come parola chiave-only.

Nota questa è un'interfaccia insolita, che può essere fastidiosa per l'utente - la userei solo in casi d'uso molto specifici.

In 2.x, è necessario eseguire manualmente questa operazione analizzando **kwargs.

+0

Attento. Non penso che tu possa avere argomenti di default dopo * args (almeno non su python2.x). – mgilson

+0

@mgilson I dimenticando sempre le carenze 2.x, corrette –

+0

in python 2.7 'def test (var, kwarg1 = 1, * args, ** kwargs): ...' non funziona per me. si lamenta di avere più valori per un argomento parola chiave – Raufio

0

È possibile almeno per Python 2.7. argomenti chiave vengono assegnati ai parametri posizionali per nome, in modo da poter fare

In [34]: def func(name, lname, **kwargs): 
    print 'name='+name, 'lname='+lname 
    print kwargs 
    ....:  

In [35]: func(lname='lname_val', name='name_val', city='cityName', otherInfo='blah') 
name=name_val lname=lname_val 
{'city': 'cityName', 'otherInfo': 'blah'} 

documenti ufficiali affermano in questo modo:. "Se gli argomenti chiave sono presenti, essi vengono prima convertiti in argomenti posizionali, come segue In primo luogo, un l'elenco degli slot non riempiti viene creato per i parametri formali.Se ci sono N argomenti posizionali, questi vengono posizionati nei primi N slot.Successivamente, per ogni argomento di parole chiave, l'identificatore viene utilizzato per determinare lo slot corrispondente (se l'identificatore è uguale al primo nome di parametro formale, viene utilizzato il primo slot e così via). Se lo slot è già pieno, viene sollevata un'eccezione TypeError. Altrimenti, il valore dell'argomento viene inserito nello slot, riempiendolo (anche se l'espressione è None, riempie lo slot). " https://docs.python.org/2/reference/expressions.html#calls

Problemi correlati