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)
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)
Réponses:
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'}
**
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 dict
type. C'est pourquoi changer def b(**kw): a(kw)
en def b(**kw): a(**kw)
décompressera kw
et résoudra les erreurs.
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=value
style 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
>>>
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
python 3.5
le Foo(**arg1, **arg2)
est possible