2012-07-03 17 views
25

Duplicar posible:
Understanding kwargs in Python¿Qué significan * y ** antes de un nombre de variable en una firma de función?

He leído un fragmento de código Python, y no sé lo que hace * y ** significa en este código:

def functionA(self, *a, **kw): 
    // code here 

Solo conozco un uso de *: extraer todos los atributos que tiene al parámetro de método o constructor.

Si esto es cierto para la función anterior, entonces ¿qué hace el resto: **?

+4

http: // docs.python.org/tutorial/controlflow.html#keyword-arguments –

+1

>. hqt

+2

Sabemos que es difícil buscar la sintaxis en google. Su pregunta no se cerró porque la gente piensa que fue estúpida: se cerró porque no queremos demasiada información duplicada en SO. –

Respuesta

78

Dentro de una cabecera de la función :

* recoge todos los argumentos posicionales en una tuple

** recoge todos los argumentos de palabras clave i diccionario na

>>> def functionA(*a, **kw): 
     print(a) 
     print(kw) 


>>> functionA(1, 2, 3, 4, 5, 6, a=2, b=3, c=5) 
(1, 2, 3, 4, 5, 6) 
{'a': 2, 'c': 5, 'b': 3} 

En una llamada función:

* desempaqueta una lista o tupla en argumentos de posición

** descomprime un diccionario de palabras clave en argumentos

>>> lis=[1, 2, 3, 4] 
>>> dic={'a': 10, 'b':20} 
>>> functionA(*lis, **dic) #it is similar to functionA(1, 2, 3, 4, a=10, b=20) 
(1, 2, 3, 4) 
{'a': 10, 'b': 20} 
+0

No hay necesidad de "auto" - esto no está dentro de una definición de clase ... –

+0

@AndrewJaffe ¡gracias! solución editada. –

+0

+1 gran explicación – Levon

5

** toma los nombres de los argumentos especificados y los coloca en un diccionario. Por lo tanto:

def func(**stuff): 
    print(stuff) 

func(one = 1, two = 2) 

imprimiría:

{'one': 1, 'two': 2} 
1

** medios mencionados argumentos de las funciones.

$ cat 2.py 
def k(**argv): 
    print argv 

k(a=10, b = 20) 

$ python 2.py 
{'a': 10, 'b': 20} 

argv es un diccionario que contiene todos los argumentos con nombre de la función.

Y también puede revertirlo. Se puede utilizar un diccionario como un conjunto de aruments para una función:

def k(a=10, b=20): 
    print a 
    print b 

d={'a':30,'b':40} 
k(**d) 

imprimiría

30 
40 
Cuestiones relacionadas