Comment utiliser *args et **kwargs dans les fonctions Python

Maîtrisez *args et **kwargs en Python. Apprenez à écrire des fonctions flexibles avec des arguments de position et de mot-clé dynamiques, à décompresser des collections et à créer des fonctions wrapper.

Essayez cette solution dans l'éditeur

Aperçu

En Python, vous devrez souvent concevoir des fonctions pouvant accepter un nombre variable d’arguments. Par exemple, une fonction qui calcule la somme d'un nombre quelconque d'entiers ou une fonction qui enregistre des métadonnées avec des champs variables. Au lieu de forcer les utilisateurs à transmettre une liste ou un dictionnaire, Python fournit deux symboles spéciaux : `*args` et `**kwargs`.

La syntaxe `*args` permet à une fonction d'accepter n'importe quel nombre d'arguments de position. L'astérisque unique « * » agit comme un opérateur de décompression. Lorsqu'il est placé dans une définition de fonction, il collecte des arguments de position supplémentaires dans un tuple nommé « args ». Cela vous permet de parcourir les valeurs d'entrée, d'exécuter des calculs ou de les transmettre facilement à une autre fonction.

La syntaxe `**kwargs`, quant à elle, permet à une fonction d'accepter n'importe quel nombre d'arguments mot-clé (nommés). Le double astérisque `**` rassemble ces arguments dans un dictionnaire nommé `kwargs`. Ceci est incroyablement utile pour transmettre des configurations facultatives, des arguments de style ou des attributs de base de données. N'oubliez pas que les noms « args » et « kwargs » sont des conventions ; la fonctionnalité réelle est déterminée par les astérisques simples et doubles.

Sortie de code et d'exécution

Ce code montre l'utilisation de *args pour additionner les nombres variables, **kwargs pour imprimer les profils utilisateur et la combinaison des deux dans une seule fonction.

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)
Sortie 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}

Mise en œuvre étape par étape

  • Utilisez un seul astérisque avant un paramètre (par exemple, *args) pour rassembler les arguments de position dans un tuple.
  • Utilisez un double astérisque avant un paramètre (par exemple, **kwargs) pour rassembler les arguments de mots-clés dans un dictionnaire.
  • Conservez l'ordre correct des paramètres : paramètres standard, *args, paramètres de mots clés uniquement, puis **kwargs.
  • Utilisez la syntaxe de déballage lors de l'appel de fonctions en passant *iterable ou **dictionary.

Foire aux questions

Dois-je utiliser les noms « args » et « kwargs » ?

Non, ce sont des conventions communautaires standards. Seuls les préfixes * et ** sont syntaxiquement requis. Vous pouvez écrire *values ​​et **options, mais il est fortement recommandé de s'en tenir à *args et **kwargs pour des raisons de lisibilité.

Quel est l’ordre correct lors de la définition d’une fonction ?

L'ordre correct des arguments dans une signature de fonction est le suivant : arguments de position, *args, arguments de mots-clés uniquement et enfin **kwargs.

Sujets connexes

Ressources Python recommandées

Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.