Come utilizzare *args e **kwargs nelle funzioni Python

Padroneggia *args e **kwargs in Python. Scopri come scrivere funzioni flessibili con argomenti posizionali e parole chiave dinamici, decomprimere raccolte e creare funzioni wrapper.

Prova questa soluzione nell'editor

Panoramica

In Python, avrai spesso bisogno di progettare funzioni che possano accettare un numero variabile di argomenti. Ad esempio, una funzione che calcola la somma di un numero qualsiasi di numeri interi o una funzione che registra metadati con campi variabili. Invece di forzare gli utenti a passare un elenco o un dizionario, Python fornisce due simboli speciali: `*args` e `**kwargs`.

La sintassi `*args` consente a una funzione di accettare un numero qualsiasi di argomenti posizionali. Il singolo asterisco `*` funge da operatore di decompressione. Quando inserito in una definizione di funzione, raccoglie argomenti posizionali aggiuntivi in ​​una tupla denominata "args". Ciò ti consente di scorrere i valori di input, eseguire calcoli o passarli facilmente a un'altra funzione.

La sintassi `**kwargs`, d'altra parte, consente a una funzione di accettare un numero qualsiasi di argomenti con parole chiave (denominate). Il doppio asterisco `**` raccoglie questi argomenti in un dizionario chiamato `kwargs`. Ciò è incredibilmente utile per passare configurazioni opzionali, argomenti di stile o attributi di database. Ricorda, i nomi "args" e "kwargs" sono convenzioni; la funzionalità effettiva è guidata dagli asterischi singoli e doppi.

Codice e output di esecuzione

Questo codice dimostra l'utilizzo di *args per sommare i numeri variabili, **kwargs per stampare i profili utente e la combinazione di entrambi in un'unica funzione.

args_kwargs.py
Prova nell'editor
def sum_all(*args):
    print("args type:", type(args).__name__)
    return sum(args)

print("Sum (1, 2, 3):", sum_all(1, 2, 3))
print("Sum (10, 20):", sum_all(10, 20))

def print_profile(**kwargs):
    print("kwargs type:", type(kwargs).__name__)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_profile(name="Bob", role="developer", country="US")

def master_function(first, *args, **kwargs):
    print(f"First argument: {first}")
    print(f"Additional positional args: {args}")
    print(f"Keyword args: {kwargs}")

master_function("hello", 1, 2, 3, debug=True, user_id=42)
Uscita terminale
args type: tuple
Sum (1, 2, 3): 6
args type: tuple
Sum (10, 20): 30
kwargs type: dict
name: Bob
role: developer
country: US
First argument: hello
Additional positional args: (1, 2, 3)
Keyword args: {'debug': True, 'user_id': 42}

Implementazione passo dopo passo

  • Utilizza un singolo asterisco prima di un parametro (ad esempio, *args) per raccogliere argomenti posizionali in una tupla.
  • Utilizza un doppio asterisco prima di un parametro (ad esempio, **kwargs) per raccogliere argomenti di parole chiave in un dizionario.
  • Mantieni l'ordine corretto dei parametri: parametri standard, *args, parametri solo parole chiave, quindi **kwargs.
  • Utilizzare la sintassi di decompressione quando si chiamano funzioni passando *iterable o **dictionary.

Domande frequenti

Devo usare i nomi "args" e "kwargs"?

No, queste sono convenzioni comunitarie standard. Solo i prefissi * e ** sono sintatticamente richiesti. Potresti scrivere *values ​​e **options, ma attenersi a *args e **kwargs è altamente raccomandato per la leggibilità.

Qual è l'ordine corretto quando si definisce una funzione?

L'ordine corretto degli argomenti in una firma di funzione è: argomenti posizionali, *args, argomenti basati solo su parole chiave e infine **kwargs.

Argomenti correlati

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.