¿Qué significan *args y **kwargs? [duplicar]

Resuelto UberJumper asked hace 16 años • 5 respuestas

*args¿Qué significan y qué significan exactamente **kwargs?

Según la documentación de Python, por lo que parece, pasa una tupla de argumentos.

def foo(hello, *args):
    print(hello)

    for each in args:
        print(each)

if __name__ == '__main__':
    foo("LOVE", ["lol", "lololol"])

Esto imprime:

LOVE
['lol', 'lololol']

¿Cómo se utilizan eficazmente?

UberJumper avatar Nov 13 '08 21:11 UberJumper
Aceptado

Poner *argsy/o **kwargscomo los últimos elementos en la lista de argumentos de la definición de su función permite que esa función acepte una cantidad arbitraria de argumentos y/o argumentos de palabras clave.

Por ejemplo, si quisieras escribir una función que devuelva la suma de todos sus argumentos, sin importar cuántos proporciones, podrías escribirla así:

def my_sum(*args):
    return sum(args)

Probablemente se use más comúnmente en programación orientada a objetos, cuando se anula una función y se desea llamar a la función original con cualquier argumento que pase el usuario.

En realidad, no es necesario llamarlos argsy kwargseso es solo una convención. Son los *y los **que hacen la magia.

La documentación oficial de Python tiene una mirada más profunda .

Paul D. Waite avatar Nov 13 '2008 14:11 Paul D. Waite

Además, los utilizamos para gestionar la herencia.

class Super( object ):
   def __init__( self, this, that ):
       self.this = this
       self.that = that

class Sub( Super ):
   def __init__( self, myStuff, *args, **kw ):
       super( Sub, self ).__init__( *args, **kw )
       self.myStuff= myStuff

x= Super( 2.7, 3.1 )
y= Sub( "green", 7, 6 )

De esta manera, Sub realmente no sabe (ni le importa) cuál es la inicialización de la superclase. Si se da cuenta de que necesita cambiar la superclase, puede arreglar las cosas sin tener que preocuparse por los detalles de cada subclase.

S.Lott avatar Nov 13 '2008 15:11 S.Lott