Advertisement
  1. Code
  2. Python

Entendiendo Args y Kwargs en Python

Scroll to top
Read Time: 7 min

Spanish (Español) translation by Ruben Solis (you can also view the original English article)

En este tutorial, me centraré en argumentos (*args) y argumentos de palabra clave (*kwargs) en Python.

Te enseñaré qué son args y kwargs y, lo que es más importante, cómo usarlos — es decir, cómo incorporar un número ilimitado de argumentos y argumentos de palabra clave en funciones.

¿Qué son los Args?

*args se utilizan para pasar argumentos que no son  de palabra clave. Algunos ejemplos de argumentos que no son de palabra clave son fun(3,4), fun("foo", "bar").

*args se utilizan normalmente como medida para evitar que el programa falle si no sabemos cuántos argumentos se pasarán a la función. Esto se usa en C++ así como en otros lenguajes de programación.

¿Qué son los Kwargs?

**kwargs es un diccionario de argumentos de palabra clave. ** nos permite pasar cualquier número de argumentos de palabra clave. Un argumento de palabra clave es básicamente un diccionario.

Un ejemplo de un argumento de palabra clave es fun(foo=2, bar=7).

**kwargs son como *args excepto que declaras las variables y la cantidad dentro de los argumentos de la función.

Dónde usar Args y Kwargs

Args y kwargs son útiles cuando quieres:

  • Reducir la reescritura de código.
  • Hacer que tu código sea legible.
  • Reutilizar tu código

Uso de Args y Kwargs en funciones

Veamos cómo se usan kwargs y args en las funciones.

Args

La siguiente función tiene tres argumentos. Los tres argumentos se han definido explícitamente, por lo que más o menos provocará un error en el programa.

1
def add(a, b,c):
2
    print(a+b+c)
3
    
4
 print add(2,3,4)
5
    

Ejecutemos la función. La función agregará los tres números, dando el siguiente resultado:

1
Output
2
3
9

¿Qué pasaría si tuviéramos que pasar cuatro argumentos en la función en lugar de los tres requeridos? Recibiremos un error como se muestra a continuación.

Esto se debe a que solo se definieron tres parámetros en la función, pero hemos pasado cuatro argumentos posicionales al llamar a la función.

1
def add(a, b,c):
2
    print(a+b+c)
3
    
4
print add(2,3,4,5)
5
6
7
8
    
1
Output
2
TypeError: add() takes 3 positional arguments but 4 were given
3
   

En el segundo ejemplo a continuación, el * es para argumentos que no son de palabra clave y se pasa a la función. En lugar de tener argumentos definidos, reemplazamos a, b y c con un solo parámetro (*args).

Observa cómo el uso de *args facilita el uso de cualquier número de argumentos sin tener que cambiar tu código. *args proporcionan más flexibilidad a tu código ya que puede tener tantos argumentos como desees en el futuro.

1
def add(*args):
2
    total = 0
3
    for arg in args:
4
        total+=arg
5
    print total
6
    
1
Scenario 1
2
print add(1,2,5)
3
4
Output
5
8
6
1
Scenario 2
2
print add(1,2,5,6)
3
4
output
5
14
6
1
Scenario 3
2
print add(1,2,5,8)
3
4
Output
5
16

Más ejemplos

Crea una función simple como se muestra:

1
def func(*args):
2
    # *args means for however many arguments you take in, it will catch them all

3
4
    for arg in args:
5
        print arg
6
    

Prueba la función usando una combinación de números enteros y cadenas:

1
def func(*args):
2
    # *args means for however many arguments you take in, it will catch them all

3
4
    for arg in args:
5
        print arg
6
    
7
print func(11,3,4,5,"tuts")
1
Output
2
3
11
4
3
5
4
6
5
7
tuts

¿Y si tuviéramos que pasar una lista como argumento? Prueba la función con una lista reemplazando los argumentos anteriores con una lista, l = [11,3,4,5, "tuts"].

1
def func(*args):
2
    # *args means for however many arguments you take in, it will catch them all

3
4
    for arg in args:
5
        print arg
6
    
7
8
l = [11,3,4,5,"tuts"]
9
10
print func(l)
1
This prints the list as a whole,  
2
This is because its interpreting the list as one item.
3
4
Output
5
6
[11,3,4,5,"tuts]

En el ejemplo anterior, también puedes usar *args para desempaquetar argumentos que ya están en una lista o una tupla para que todos los elementos de la lista se pasen como parámetros diferentes.

Usando la misma función:

1
def func(*args):
2
    # *args means for however many arguments you take in, it will catch them all

3
4
    for arg in args:
5
        print(arg)
6
        
7
l = [11,3,4,5,"tuts"]
8
9
print(func(*l))
1
The * will unpack the list and output each individual list item.
2
3
4
Output 
5
11
6
3
7
4
8
5
9
tuts

Kwargs

kwargs te permiten pasar argumentos de palabra clave a una función. Se utilizan cuando no estás seguro del número de argumentos de palabra clave que se pasarán en la función.

Escribe una función my_func y pasa (x= 10, y =20) como argumentos de palabra clave como se muestra a continuación:

1
def my_func(x=10,y=20):
2
    print x,y
1
This prints out the values of x and y
2
3
Output 
4
5
10,20

Kwargs se puede utilizar para desempaquetar pares de diccionario clave, valor. Esto se hace usando la notación de doble asterisco (**). Es importante tener en cuenta que cada clave debe coincidir con un valor.

Este es un ejemplo típico de cómo se hace. La siguiente función toma países como claves y sus capitales como valores. Luego imprime una sentencia que itera sobre los kwargs e indica a cada palabra clave el valor que se le asigna.

1
def capital_cities(**kwargs): 
2
    # initialize an empty list to store the result

3
    result = []
4
    for key, value in kwargs.items():
5
        result.append("The capital city of {} is {} .format (key,value)

6


7
    return result

Puedes llamar a la función con los argumentos que quieras.

1
def capital_cities(**kwargs): 
2
    # initialize an empty list to store the result

3
    result = []
4
    for key, value in kwargs.items():
5
        result.append("The capital city of {} is {} .format (key,value)

6


7
    return result

8
print capital_city(China = "Beijing",Cairo = "Egypt",Rome = "Italy"))
1
output
2
3
['The capital city of China is Beijing', 'The capital city of Cairo is Egypt','The capital city of Rome is Italy']
4

Para un ejemplo más complejo, supón que tenemos un modelo para un cliente que se parece a esto:

1
class Customer( models.Model ):
2
    first_name = models.CharField(max_length = 100, null = True)
3
    last_name = models.CharField(max_length = 100)
4
    username =models.Charfield(max_length =100)
5
    email = models.EmailField(max_length = 100)
6
    password = models.CharField(max_length =100)

Puedes utilizar kwargs para realizar tanto entradas de datos como consultas de datos desde objetos de modelo. Escribamos una vista de función para crear un nuevo cliente.

1
kwargs = {"first_name":"John","last_name":"Doe",
2
          "username': "johndoe","email"johndoe@gmail.com",
3
          "password":"1234"}
4
5
new_user =  User(**kwargs)
6
new_user.save()

A continuación se explica cómo realizar una consulta del cliente que acabamos de crear utilizando kwargs.

1
filter_customer = {
2
'email':johndoe@gmail.com,
3
'username': johndoe,
4
}
5
6
Customer.objects.filter(**filter_customer)

Usando Args y Kwargs en una función

Cuando se utilizan args y kwargs en la misma definición de función, *args debe aparecer antes de **kwargs.

1
class MyFunction(Foo):
2
3
    def __init__(self, *args, **kwargs):
4
5
        
6
        print 'my function'
7
8
        super(MyFunction, self).__init__(*args, **kwargs)

Ejemplo:

1
def Func(*args,**kwargs):
2
    
3
    for arg in args:
4
        print arg
5
    for item in kwargs.items():
6
        print item

Recuerda que args debe ir antes que  kwargs.

1
def Func(*args,**kwargs):
2
    
3
    for arg in args:
4
        print arg
5
    for item in kwargs.items():
6
        print item
7
        
8
print Func(1,x=7,u=8)
1
Output
2
3
1
4
('x', 7)
5
('u', 8)

Conclusión

Espero que este tutorial te haya ayudado a comprender args y kwargs.

A continuación se muestran algunos consejos para recordar al usar args y kwargs:

  • *args y **kwargs son sintaxis especiales que se utilizan en funciones para pasar un número variable de argumentos a una función.
  • *args ocurre antes que **kwargs en una definición de función.
  • *args y **kwargs se utilizan mejor en situaciones en las que el número de entradas seguirá siendo relativamente pequeño.
  • Puedes utilizar el nombre que quieras; args y kwargs son solo por convención y no un requisito. Por ejemplo, puedes usar *foo en lugar de *args o **foo en lugar de **kwargs.

La documentación oficial de Python ofrece mucha información para mayor estudio. Además, no dudes en ver lo que tenemos disponible para la venta y para estudiar en el marketplace, y no dudes en hacer cualquier pregunta y brindar tu valiosa retroalimentación utilizando los comentarios abajo.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.