Stai passando un elenco di kwarg?


95

Posso passare un elenco di kwarg a un metodo per brevità? Questo è quello che sto cercando di fare:

def method(**kwargs):
    #do something

keywords = (keyword1 = 'foo', keyword2 = 'bar')
method(keywords)

2
Stavo cercando di passare kwarg da una funzione a kwarg di un'altra funzione. Ottima domanda!
Benj

Risposte:


160

Sì. Lo fai in questo modo:

def method(**kwargs):
  print kwargs

keywords = {'keyword1': 'foo', 'keyword2': 'bar'}
method(keyword1='foo', keyword2='bar')
method(**keywords)

L'esecuzione di questo in Python conferma che questi producono risultati identici:

{'keyword2': 'bar', 'keyword1': 'foo'}
{'keyword2': 'bar', 'keyword1': 'foo'}

10
Oppure: keywords = dict (keyword1 = 'foo', keyword2 = 'bar')
Ned Deily,

1
L' **operatore di decompressione può essere utilizzato per passare kwarg da una funzione a kwarg di un'altra funzione. Considera questo codice: (le nuove righe non sembrano essere consentite nei commenti) def a(**kw): print(kw)e def b(**kw): a(kw). Questo codice genererà un errore perché kwargs è effettivamente un dizionario e verrà interpretato come un normale argomento del dicttipo. Ecco perché il passaggio def b(**kw): a(kw)a def b(**kw): a(**kw)decomprimerà kwe risolverà gli errori.
Benj

10

Come altri hanno sottolineato, puoi fare quello che vuoi passando un dict. Esistono vari modi per costruire un dict. Uno che preserva lo keyword=valuestile che hai tentato è usare il dict integrato:

keywords = dict(keyword1 = 'foo', keyword2 = 'bar')

Notare la versatilità di dict; tutti questi producono lo stesso risultato:

>>> kw1 = dict(keyword1 = 'foo', keyword2 = 'bar')
>>> kw2 = dict({'keyword1':'foo', 'keyword2':'bar'})
>>> kw3 = dict([['keyword1', 'foo'], ['keyword2', 'bar']])
>>> kw4 = dict(zip(('keyword1', 'keyword2'), ('foo', 'bar')))
>>> assert kw1 == kw2 == kw3 == kw4
>>> 

4

Intendi un dict? Certo che puoi:

def method(**kwargs):
    #do something

keywords = {keyword1: 'foo', keyword2: 'bar'}
method(**keywords)

ah, non stavo prestando attenzione. Dovrebbe andare meglio adesso.
David Z,

3

Quindi, quando sono arrivato qui, stavo cercando un modo per passare diversi ** kwarg in una funzione, per un uso successivo in ulteriori funzioni. Perché questo, non così sorprendentemente, non funziona:

def func1(**f2_x, **f3_x):
     ...

Con un po 'di codice "sperimentale" sono arrivato al modo ovvio di come farlo:

def func3(f3_a, f3_b):
    print "--func3--"
    print f3_a
    print f3_b
def func2(f2_a, f2_b):
    print "--func2--"
    print f2_a
    print f2_b

def func1(f1_a, f1_b, f2_x={},f3_x={}):
    print "--func1--"
    print f1_a
    print f1_b
    func2(**f2_x)
    func3(**f3_x)

func1('aaaa', 'bbbb', {'f2_a':1, 'f2_b':2}, {'f3_a':37, 'f3_b':69})

Viene stampato come previsto:

--func1--
aaaa
bbbb
--func2--
1
2
--func3--
37
69

6
A partire dal python 3.5l' Foo(**arg1, **arg2)sia possibile
magu_
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.