2008-12-02 38 views

Respuesta

357

pensé que fuera para mí en el final. Es simple, sólo estaba perdiendo el operador ** para desempaquetar el diccionario

Así que mi ejemplo se convierte en:

d = dict(p1=1, p2=2) 
def f2(p1,p2): 
    print p1, p2 
f2(**d) 
+29

si desea que esto ayude a otros, debe reformular su pregunta: el problema no era pasar un diccionario, lo que quería era convertir un dict en parámetros de palabra clave – Javier

+9

Vale la pena señalar que también puede descomprimir listas en argumentos posicionales: f2 (* [1,2]) –

+8

"desreferencia": el término habitual, en este contexto de Python, es "desempaquetar". :) – mipadi

3

Aquí ya go - funciona igual cualquier otro iterable:

d = {'param' : 'test'} 

def f(dictionary): 
    for key in dictionary: 
     print key 

f(d) 
+0

parece que la gente se downvoting esto, ya que responde a la pregunta original, no la cuestión reformulada. Sugiero simplemente eliminar esta publicación ahora. – dotancohen

+0

@dotancohen no, nunca fue correcto, falla el segundo bloque de código que siempre estuvo con la pregunta. Lo tomó demasiado literalmente, la impresión fue un ejemplo. –

+0

Responde la pregunta sin embargo, simplemente no lo hace a través del desembalaje del diccionario. Su enfoque es perfectamente válido en función de la pregunta publicada. – Natecat

25

en Python, esto se llama "desempaquetar", y se puede encontrar un poco sobre él en el tutorial. La documentación es desagradable, estoy de acuerdo, especialmente por cuán fantásticamente útil es.

+12

Es mejor copiar el contenido relevante del enlace en su respuesta, en lugar de confiar en que el enlace sobreviva hasta el final de los tiempos. – Richard

+3

@Richard esa es una opinión filosófica profunda sobre la web, con la que no podría estar más en desacuerdo. Por desgracia, me falta espacio en este margen para compartir mi maravillosa prueba ... – llimllib

+0

@llimllib, ¡entonces tendré que preguntarle al Dr. Wiles! – Richard

14

Algunos detalles adicionales que pueden ser útiles para saber (preguntas que tenía después de leer esto y fue y probado):

  1. La función puede tener parámetros que se no incluidos en el diccionario
  2. Puede no anular un parámetro que ya está en el diccionario
  3. El diccionario puede no tener parámetros que no están en la función.

Ejemplos de cada uno:

In[3]: def test(a=4, b=2): 
    ...:  print a, b 
    ...:  

Número 1: La función puede tener parámetros que no están incluidos en el diccionario

In[6]: mydict = {'a': 100} 
In[7]: test(**mydict) 
100 2 

Número 2: No se puede anula un parámetro que ya está en el diccionario

In[8]: mydict = {'a': 100, 'b': 200} 
In[9]: test(a=3, **mydict) 

TypeError: test() got multiple values for keyword argument 'a' 

Número 3: El diccionario no puede tener parámetros que no están en la función.

In[10]: mydict = {'a': 100, 'b': 200, 'c': 300} 
In[11]: test(**mydict) 

TypeError: test() got an unexpected keyword argument 'c' 
+1

¡Esto es asombroso! ¡Shoulda recibió más votos, gente! –

+2

Usar desempacar con print.format es particularmente útil. por ejemplo: ''hola {saludo} {nombre}'. formato (** {'nombre': 'Andrew', 'saludo': 'Mr'})' – Martlark

Cuestiones relacionadas