*args e **kwargs in Python: cosa sono e come usarli

  

In Python, le funzioni sono estremamente flessibili. A volte però non sappiamo in anticipo quanti argomenti verranno passati a una funzione. È qui che entrano in gioco *args e **kwargs.

Vediamoli uno alla volta, con esempi semplici e concreti.

🔗 Ti piace Techelopment? Dai un'occhiata al sito per tutti i dettagli!

Cos’è *args

*args permette a una funzione di accettare un numero variabile di argomenti posizionali.

Esempio base

def somma(*args):
    totale = 0
    for numero in args:
        totale += numero
    return totale

print(somma(1, 2, 3))
print(somma(5, 10, 15, 20))

📌 Output:

6
50

In questo caso:

  • args è una tupla
  • contiene tutti gli argomenti passati alla funzione

👉 Il nome args è solo una convenzione: potresti chiamarlo anche *numeri, ma usare args rende il codice più leggibile per chi lo legge.


Usare *args con altri parametri

*args può convivere con parametri “normali”, ma deve venire dopo di loro.

def saluta(messaggio, *nomi):
    for nome in nomi:
        print(f"{messaggio}, {nome}!")

saluta("Ciao", "Luca", "Anna", "Marco")

Cos’è **kwargs

**kwargs permette di passare a una funzione un numero variabile di argomenti con nome (keyword arguments).

Esempio base

def stampa_info(**kwargs):
    for chiave, valore in kwargs.items():
        print(f"{chiave}: {valore}")

stampa_info(nome="Mario", età=30, città="Roma")

In questo caso:

  • kwargs è un dizionario
  • contiene coppie chiave: valore

📌 Anche qui, kwargs è una convenzione che sta per keyword arguments.


*args e **kwargs insieme

Si possono usare entrambi nella stessa funzione. L’ordine corretto è:

  1. parametri normali
  2. *args
  3. **kwargs
def esempio(a, b, *args, **kwargs):
    print("a:", a)
    print("b:", b)
    print("args:", args)
    print("kwargs:", kwargs)

esempio(1, 2, 3, 4, x=10, y=20)

📌 Output:

a: 1
b: 2
args: (3, 4)
kwargs: {'x': 10, 'y': 20}

Quando usare *args e **kwargs

Sono particolarmente utili quando:

  • stai scrivendo funzioni generiche
  • crei decorator
  • lavori con API, librerie o framework
  • vuoi rendere il codice più flessibile e riutilizzabile

Un esempio tipico è il forwarding degli argomenti:

def wrapper(*args, **kwargs):
    return funzione_originale(*args, **kwargs)

Schema riepilogativo

Elemento Tipo di argomenti Struttura dati Quando usarlo Esempio
*args Posizionali Tupla Quando il numero di argomenti non è noto in anticipo def f(*args):
**kwargs Con nome (keyword) Dizionario Quando vuoi passare coppie chiave-valore opzionali def f(**kwargs):
*args + **kwargs Posizionali e con nome Tupla + Dizionario Per funzioni flessibili o wrapper/decorator def f(*args, **kwargs):

Attenzione a non abusarne ⚠️

Anche se sono potenti, usarli ovunque può rendere il codice:

  • meno leggibile
  • più difficile da debuggare

👉 Usali solo quando servono davvero.


Conclusione

  • *args raccoglie argomenti posizionali in una tupla
  • **kwargs raccoglie argomenti con nome in un dizionario
  • Insieme rendono le funzioni Python estremamente flessibili

Se stai imparando Python, capirli bene è un passo fondamentale per scrivere codice più elegante e professionale 🐍✨



Follow me #techelopment

Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment