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: TeacherMé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 argumentsSortie :
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: EngineerDé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 dictionnaireSortie :
debug = True
verbose = False
timeout = 30Points clés :
**kwargscollecte les arguments nommés dans un dictionnaire — aucune conversion n'est nécessaire, c'en est déjà un- Le nom
kwargsest 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
Défi
FacileDans 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 dictionaryAccé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
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
1Les fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe paramètre selfMéthodesAttributsMéthode constructeur (__init__)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLa fonction super()Redéfinition de méthodeHéritage multipleOrdre de résolution des méthodesRécapitulatif - Hiérarchie des employés7Méthodes spéciales
Introduction aux méthodes magiquesSurcharge d'opérateursMéthodes magiques de conteneurRécapitulatif - Liste personnalisée10Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy2Décorateurs
Introduction aux décorateursDécorateur de propriétéDécorateur de méthode statiqueDécorateur de méthode de classe5Polymorphisme
Retour sur la redéfinition de méthodeDuck TypingClasses et méthodes abstraitesConception d'interfacesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageMixinsMéthodes statiques et de classeDécorateurs de classeGestionnaires de contexte11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Propriétés de classe
Variables d'instance vs variables de classeDécorateurs de propriétéAttributs privésRécapitulatif - Gestionnaire de compte bancaire