Vous passez une liste de kwargs?

95

Puis-je passer une liste de kwargs à une méthode par souci de concision? Voici ce que j'essaye de faire:

def method(**kwargs):
    #do something

keywords = (keyword1 = 'foo', keyword2 = 'bar')
method(keywords)
jwanga
la source
2
J'essayais de passer des kwargs d'une fonction aux kwargs d'une autre fonction. Excellente question!
Benj

Réponses:

160

Oui. Vous le faites comme ceci:

def method(**kwargs):
  print kwargs

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

L'exécution de ceci en Python confirme que ceux-ci produisent des résultats identiques:

{'keyword2': 'bar', 'keyword1': 'foo'}
{'keyword2': 'bar', 'keyword1': 'foo'}
Peter
la source
10
Ou: keywords = dict (keyword1 = 'foo', keyword2 = 'bar')
Ned Deily
1
L' **opérateur de déballage peut être utilisé pour passer des kwargs d'une fonction aux kwargs d'une autre fonction. Considérez ce code: (les retours à la ligne ne semblent pas être autorisés dans les commentaires) def a(**kw): print(kw), et def b(**kw): a(kw). Ce code générera une erreur car kwargs est en fait un dictionnaire, et sera interprété comme un argument régulier du dicttype. C'est pourquoi changer def b(**kw): a(kw)en def b(**kw): a(**kw)décompressera kwet résoudra les erreurs.
Benj
10

Comme d'autres l'ont souligné, vous pouvez faire ce que vous voulez en passant un dict. Il existe différentes manières de construire un dict. Celui qui préserve le keyword=valuestyle que vous avez tenté est d'utiliser le dict intégré:

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

Notez la polyvalence de dict; tout cela produit le même résultat:

>>> 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
>>> 
Ned Deily
la source
4

Voulez-vous dire un dict? Sûr que vous pouvez:

def method(**kwargs):
    #do something

keywords = {keyword1: 'foo', keyword2: 'bar'}
method(**keywords)
David Z
la source
ah, je ne faisais pas attention. Ça devrait être mieux maintenant.
David Z
3

Donc, quand je suis venu ici, je cherchais un moyen de passer plusieurs ** kwargs dans une fonction - pour une utilisation ultérieure dans d'autres fonctions. Parce que cela, pas si surprenant que cela, ne fonctionne pas:

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

Avec un certain codage `` expérimental '', je suis venu à la manière évidente de le faire:

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})

Cela s'imprime comme prévu:

--func1--
aaaa
bbbb
--func2--
1
2
--func3--
37
69
Clemens
la source
6
Dès python 3.5le Foo(**arg1, **arg2)est possible
magu_