Menu
Coddy logo textTech

Les **kwarg

Fait partie de la section Programmation orientée objet du Journey Python de Coddy. Leçon 43 sur 64.

**kwargs est l’abréviation de « keyword arguments ». Cela permet à une fonction d’accepter un nombre quelconque d’arguments nommés (comme des paires clé=valeur) sans avoir à tous les définir à l’avance.

Comment cela fonctionne :

  • *args → rassemble les arguments positionnels supplémentaires dans un tuple
  • **kwargs → rassemble les arguments nommés supplémentaires dans un dictionnaire

Exemple simple

Commençons par l’exemple le plus simple possible :

def greet(**kwargs):
    print(kwargs)

greet(name="Alice", age=25, country="Australia")

Sortie :

{'name': 'Alice', 'age': 25, 'country': 'Australia'}

Comme vous pouvez le voir, **kwargs collecte automatiquement tous les arguments nommés dans un dictionnaire.

Utiliser le dictionnaire

Comme kwargs est déjà un dictionnaire, tu peux parcourir directement ce dictionnaire :

def print_info(**kwargs):
    print("Information received:")
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Bob", age=30, job="Teacher")

Sortie :

Information received:
name: Bob
age: 30
job: Teacher

Mélanger des paramètres ordinaires avec **kwargs

Vous pouvez combiner des paramètres ordinaires avec **kwargs :

def create_profile(name, **details):
    print(f"Creating profile for: {name}")
    print("Additional details:")
    for key, value in details.items():
        print(f"  {key}: {value}")

create_profile("Sarah", age=28, city="London", hobby="Reading")

Sortie :

Creating profile for: Sarah
Additional details:
  age: 28
  city: London
  hobby: Reading

**kwargs vide

Si aucun argument nommé n’est transmis, kwargs sera un dictionnaire vide :

def show_data(**kwargs):
    if kwargs:
        print("Data:", kwargs)
    else:
        print("No data provided")

show_data()  # Aucun argument
show_data(item="apple")  # Avec arguments

Sortie :

No data provided
Data: {'item': 'apple'}

Exemple concret : classe avec **kwargs

Voici comment vous pourriez utiliser **kwargs dans une classe :

class Person:
    def __init__(self, name, **kwargs):
        self.name = name
        self.details = kwargs
    
    def show_info(self):
        print(f"Name: {self.name}")
        for key, value in self.details.items():
            print(f"{key}: {value}")

person = Person("Alice", age=25, city="New York", job="Engineer")
person.show_info()

Sortie :

Name: Alice
age: 25
city: New York
job: Engineer

Déballage des dictionnaires

Vous pouvez également décompresser des dictionnaires lors de l’appel de fonctions :

def display_settings(**kwargs):
    for setting, value in kwargs.items():
        print(f"{setting} = {value}")

settings = {"debug": True, "verbose": False, "timeout": 30}
display_settings(**settings)  # Dépaquette le dictionnaire

Sortie :

debug = True
verbose = False
timeout = 30

Points clés :

  • **kwargs rassemble les arguments nommés dans un dictionnaire : aucune conversion nécessaire, il s’agit déjà d’un dictionnaire
  • Le nom kwargs est conventionnel : vous pouvez utiliser n’importe quel nom après **
  • Utilisez-le lorsque vous souhaitez des signatures de fonction flexibles
  • Idéal pour gérer les paramètres facultatifs ou les options de configuration
challenge icon

Défi

Facile

Dans ce défi, vous allez implémenter un système de création de personnes avec une couverture de tests complète.

Vous devez modifier uniquement le fichier person_creator.py, en suivant les commentaires TODO qui vous guident dans votre implémentation. Le fichier contient une structure de classe permettant de créer et de gérer des objets personne avec diverses propriétés.

Essayez vous-même

from person_creator import create_person

# Gestionnaire complet de cas de test
test_case = input()

if test_case == "basic_test":
    create_person(name="John", age=25, occupation="Engineer")
    # Sortie :
    # Person created with properties:
    # name: John
    # age: 25
    # occupation: Engineer

elif test_case == "empty_test":
    create_person()
    # Sortie :
    # Person created with properties:
    # (aucune sortie supplémentaire puisqu'il n'y a pas de propriétés)

elif test_case == "many_properties":
    create_person(name="Alice", age=30, occupation="Doctor", city="New York", 
                 country="USA", hobby="Reading", email="alice@example.com")
    # Sortie :
    # Person created with properties:
    # name: Alice
    # age: 30
    # occupation: Doctor
    # city: New York
    # country: USA
    # hobby: Reading
    # email: alice@example.com

elif test_case == "special_characters":
    create_person(name="Bob", email="bob@example.com", phone="123-456-7890")
    # Sortie :
    # Person created with properties:
    # name: Bob
    # email: bob@example.com
    # phone: 123-456-7890

elif test_case == "numeric_keys":
    create_person(name="Charlie", age=35, height=175, weight=70)
    # Sortie :
    # Person created with properties:
    # name: Charlie
    # age: 35
    # height: 175
    # weight: 70

elif test_case == "boolean_values":
    create_person(name="David", is_student=True, is_employed=False)
    # Sortie :
    # Person created with properties:
    # name: David
    # is_student: True
    # is_employed: False

elif test_case == "nested_structures":
    create_person(name="Eve", hobbies=["Reading", "Swimming", "Coding"], 
                 address={"city": "Boston", "state": "MA", "zip": "02108"})
    # Sortie :
    # Person created with properties:
    # name: Eve
    # hobbies: ['Reading', 'Swimming', 'Coding']
    # address: {'city': 'Boston', 'state': 'MA', 'zip': '02108'}

elif test_case == "unicode_characters":
    create_person(name="José", city="São Paulo", country="Brasil")
    # Sortie :
    # Person created with properties:
    # name: José
    # city: São Paulo
    # country: Brasil
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Python en ligne