¿Qué significan *args y **kwargs? [duplicar]
*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?
Poner *args
y/o **kwargs
como 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 args
y kwargs
eso 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 .
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.