¿Pasando una lista de kwargs?

95

¿Puedo pasar una lista de kwargs a un método por brevedad? Esto es lo que intento hacer:

def method(**kwargs):
    #do something

keywords = (keyword1 = 'foo', keyword2 = 'bar')
method(keywords)
jwanga
fuente
2
Estaba intentando pasar kwargs de una función a los kwargs de otra función. ¡Gran pregunta!
Benj

Respuestas:

160

Si. Lo haces así:

def method(**kwargs):
  print kwargs

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

Ejecutar esto en Python confirma que estos producen resultados idénticos:

{'keyword2': 'bar', 'keyword1': 'foo'}
{'keyword2': 'bar', 'keyword1': 'foo'}
Pedro
fuente
10
O bien: keywords = dict (keyword1 = 'foo', keyword2 = 'bar')
Ned Deily
1
El **operador de desembalaje se puede utilizar para pasar kwargs de una función a los kwargs de otra función. Considere este código: (las líneas nuevas no parecen estar permitidas en los comentarios) def a(**kw): print(kw)y def b(**kw): a(kw). Este código generará un error porque kwargs es en realidad un diccionario y se interpretará como un argumento normal del dicttipo. Es por eso que cambiar def b(**kw): a(kw)a def b(**kw): a(**kw)descomprimirá kwy resolverá los errores.
Benj
10

Como han señalado otros, puede hacer lo que quiera pasando un dictado. Hay varias formas de construir un dictamen. Uno que conserva el keyword=valueestilo que intentó es usar el dict incorporado:

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

Tenga en cuenta la versatilidad de dict; todos estos producen el mismo resultado:

>>> 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
fuente
4

¿Te refieres a un dict? Seguro que puede:

def method(**kwargs):
    #do something

keywords = {keyword1: 'foo', keyword2: 'bar'}
method(**keywords)
David Z
fuente
ah, no estaba prestando atención. Debería estar mejor ahora.
David Z
3

Entonces, cuando vine aquí, estaba buscando una manera de pasar varios ** kwargs en una función, para usarlos más tarde en otras funciones. Porque esto, no es tan sorprendente, no funciona:

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

Con algo de codificación 'experimental' propia llegué a la forma obvia de cómo hacerlo:

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

Esto se imprime como se esperaba:

--func1--
aaaa
bbbb
--func2--
1
2
--func3--
37
69
Clemens
fuente
6
A partir de python 3.5la Foo(**arg1, **arg2)es posible
magu_