0:008:46

Recursos

Resumen

¿Alguna vez necesitaste pasar un número variable de argumentos a una función sin saber de antemano cuántos serían? Los *args en Python resuelven justo eso: te permiten recibir una cantidad flexible de parámetros usando un asterisco. Esta lección es ideal para quienes programan en Python y quieren escribir funciones más dinámicas y reutilizables.

El punto de partida es claro. Hasta ahora definimos argumentos con nombre y se los pasamos a las funciones según lo que necesitemos. Pero, ¿qué pasa cuando no sabes si vas a enviar uno, dos o diez argumentos? Ahí entran en juego los argumentos dinámicos [0:17].

¿Por qué necesitas argumentos dinámicos en una función?

Imagina que construyes una aplicación que obtiene noticias desde una API. En el archivo main.py definimos una función llamada news_api_client que recibe varios parámetros: el api_key, la query, el timeout con valor por defecto de 30, y los retries en 3, que son los reintentos si la aplicación llega a fallar [0:44].

Pero aquí viene lo interesante. Queremos que la aplicación no dependa de una sola API. Por eso simulamos una segunda función, guardian_client, que usa la API de The Guardian y requiere parámetros distintos: api_key, section, from_date, timeout en 30 y el número de intentos [1:40].

Dos APIs, dos conjuntos de parámetros diferentes. Una pide query, la otra pide section y from_date. Si tratáramos de resolver esto solo con condicionales, el código se complicaría rápido. Python ofrece una salida más limpia: definir estas variables como dinámicas [2:30].

¿Qué son los *args en Python? Son una forma de recibir un número variable de argumentos en una función usando un asterisco antes del nombre. Python los agrupa en una tupla, sin importar cuántos valores le pases.

¿Cómo funcionan los *args y por qué son una tupla?

Para entenderlo a fondo, creamos una función de ejemplo llamada ejemplo_args. La idea es imprimir todos los argumentos que lleguen. ¿Cómo recibe esa lista dinámica? Le pones un asterisco y el nombre: *args [3:10].

Por convención, en casi todo el código base se usa la palabra args para referirse a la lista dinámica de todos los parámetros que llegan a una función. No es obligatorio ese nombre, pero sí es un estándar que todos reconocen.

Al ejecutar la función pasando tres valores (uno, dos y tres), el print muestra esos datos agrupados. Y aquí está el detalle clave: cuando imprimes el type de args, Python te dice que es una tupla [4:10].

¿Por qué una tupla y no una lista? Porque estos campos no pueden estar nombrados, así que Python los guarda como una secuencia ordenada e inmutable. No la puedes modificar, pero sí la puedes recorrer y usar cuando la necesites.

¿Cuál es la diferencia entre una tupla y una lista en *args? Los *args siempre llegan como tupla, que es inmutable. Una lista sí se puede modificar; la tupla de *args no, aunque puedes leer todos sus valores.

Lo mejor de esto es que puedes llamar a la función con tres argumentos, con dos como "Hola mundo", o incluso sin ningún argumento, y el código seguirá funcionando sin errores.

¿Cómo combinar argumentos obligatorios con *args?

Al trabajar con parámetros dinámicos, muchas veces necesitas validaciones. En nuestro caso, el api_key es obligatorio para ambas APIs. La solución es colocarlo al inicio de la función, antes de *args [5:50].

Y aquí el orden importa muchísimo. Observa qué pasa paso a paso:

  • Si pones api_key después de *args, Python no sabe dónde terminan los argumentos dinámicos y toma un valor equivocado.
  • Al ejecutar sin pasar el api_key, Python lo toma como el primer valor de la secuencia, por ejemplo el "hola".
  • La solución correcta es declarar api_key como primer parámetro posicional, antes del asterisco.

Cuando colocas api_key de primero, ese valor se asigna correctamente al primer dato que envías al llamar la función [7:20]. Son parámetros posicionales, y por eso su ubicación define cómo Python los interpreta.

¿Y qué pasa si llamas la función sin ese valor obligatorio? Obtienes un error claro: Python te dice que la función requiere un argumento posicional llamado api_key. Si no lo envías, el código falla [8:10].

Esta combinación es poderosa: defines lo que es obligatorio de forma explícita y dejas abierta la puerta para recibir cualquier argumento extra que las distintas APIs necesiten. Así, tanto news_api_client como guardian_client pueden recibir solo lo que requieren sin romper el diseño.

Como práctica, crea una función capaz de sumar la cantidad de números que le pases como argumentos usando *args. Publica tu resultado en los comentarios y cuéntame cómo lo resolviste.

Argumentos dinámicos con *args en Python