Menu
Coddy logo textTech

Les **kwarg

Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 43 sur 64.

**kwargs est l'abréviation de « keyword arguments » (arguments nommés). Il permet à une fonction d'accepter n'importe quel nombre d'arguments nommés (comme des paires key=value) sans avoir à tous les définir à l'avance.

Comment ça fonctionne :

  • *args → collecte les arguments positionnels supplémentaires dans un tuple
  • **kwargs → collecte 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.

Utilisation du dictionnaire

Puisque kwargs est déjà un dictionnaire, vous pouvez boucler directement dessus :

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 réguliers avec **kwargs

Vous pouvez combiner des paramètres classiques 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 vides

Si aucun argument nommé n'est passé, 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 des 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()

Résultat :

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

Déballage de dictionnaires

Vous pouvez également déballer 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éballe le dictionnaire

Sortie :

debug = True
verbose = False
timeout = 30

Points clés :

  • **kwargs collecte les arguments nommés dans un dictionnaire — aucune conversion n'est nécessaire, c'en est déjà un
  • Le nom kwargs est conventionnel - vous pourriez utiliser n'importe quel nom après **
  • Utilisez-le lorsque vous voulez des signatures de fonction flexibles
  • Idéal pour gérer des paramètres optionnels ou des paramètres de configuration
challenge icon

Défi

Facile

Dans ce défi, vous implémenterez 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 guident votre implémentation. Le fichier contient une structure de classe pour créer et gérer des objets de type personne avec diverses propriétés.

Aide-mémoire

Le paramètre **kwargs permet à une méthode d'accepter n'importe quel nombre d'arguments nommés, en les collectant dans un dictionnaire :

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")

Combinez des paramètres réguliers, *args et **kwargs :

class Logger:
    def log(self, level, *messages, **options):
        timestamp = options.get('timestamp', False)
        color = options.get('color', 'default')
        
        if timestamp:
            print("[2024-01-01 12:00:00]", end=" ")
        print(f"[{level}]", end=" ")
        for message in messages:
            print(message, end=" ")

logger = Logger()
logger.log("INFO", "User", "logged", "in", timestamp=True, color="green")

Décompressez des dictionnaires lors de l'appel de méthodes en utilisant ** :

settings = {"debug": True, "verbose": False, "log_level": "INFO"}
config = Config(**settings)  # Unpacks the dictionary

Accédez aux valeurs de **kwargs en utilisant les méthodes de dictionnaire :

def get_setting(self, key, default=None):
    return self.settings.get(key, default)

# Iterate through all kwargs
for key, value in self.settings.items():
    print(f"{key} = {value}")

Essayez vous-même

from person_creator import create_person

# Gestionnaire de cas de test complet
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 car 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 Object Oriented Programming