Das **kwarg
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 43 von 64.
**kwargs ist die Abkürzung für „keyword arguments“. Es ermöglicht einer Funktion, eine beliebige Anzahl von benannten Argumenten (wie key=value-Paare) zu akzeptieren, ohne sie alle im Voraus definieren zu müssen.
Funktionsweise:
*args→ sammelt zusätzliche Positionsargumente in einem Tuple**kwargs→ sammelt zusätzliche Schlüsselwortargumente in einem Dictionary
Einfaches Beispiel
Beginnen wir mit dem einfachstmöglichen Beispiel:
def greet(**kwargs):
print(kwargs)
greet(name="Alice", age=25, country="Australia")Ausgabe:
{'name': 'Alice', 'age': 25, 'country': 'Australia'}Wie Sie sehen können, sammelt **kwargs automatisch alle Keyword-Argumente in einem Dictionary.
Verwendung des Dictionarys
Da kwargs bereits ein Dictionary ist, können Sie es direkt durchlaufen:
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")Ausgabe:
Information received:
name: Bob
age: 30
job: TeacherMischen von regulären Parametern mit **kwargs
Sie können reguläre Parameter mit **kwargs kombinieren:
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")Ausgabe:
Creating profile for: Sarah
Additional details:
age: 28
city: London
hobby: ReadingLeere **kwargs
Wenn keine Keyword-Argumente übergeben werden, ist kwargs ein leeres Dictionary:
def show_data(**kwargs):
if kwargs:
print("Data:", kwargs)
else:
print("No data provided")
show_data() # Keine Argumente
show_data(item="apple") # Mit ArgumentenAusgabe:
No data provided
Data: {'item': 'apple'}Praxisbeispiel: Klasse mit **kwargs
Hier sehen Sie, wie Sie **kwargs in einer Klasse verwenden können:
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()Ausgabe:
Name: Alice
age: 25
city: New York
job: EngineerDictionaries entpacken
Sie können Dictionaries auch beim Aufrufen von Funktionen entpacken:
def display_settings(**kwargs):
for setting, value in kwargs.items():
print(f"{setting} = {value}")
settings = {"debug": True, "verbose": False, "timeout": 30}
display_settings(**settings) # Entpackt das DictionaryAusgabe:
debug = True
verbose = False
timeout = 30Wichtige Punkte:
**kwargssammelt Keyword-Argumente in einem Dictionary – keine Konvertierung erforderlich, es ist bereits eines- Der Name
kwargsist konventionell – Sie könnten jeden beliebigen Namen nach**verwenden - Verwenden Sie es, wenn Sie flexible Funktionssignaturen wünschen
- Hervorragend geeignet für den Umgang mit optionalen Parametern oder Konfigurationseinstellungen
Aufgabe
EinfachIn dieser Challenge implementieren Sie ein System zur Personenerstellung mit umfassender Testabdeckung.
Sie müssen nur die Datei person_creator.py bearbeiten und dabei den TODO-Kommentaren folgen, die Sie durch die Implementierung führen. Die Datei enthält eine Klassenstruktur zum Erstellen und Verwalten von Personenobjekten mit verschiedenen Eigenschaften.
Spickzettel
Der Parameter **kwargs ermöglicht es einer Methode, eine beliebige Anzahl von Schlüsselwort-Argumenten zu akzeptieren und diese in einem Dictionary zu sammeln:
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")Kombinieren Sie reguläre Parameter, *args und **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")Entpacken Sie Dictionaries beim Aufrufen von Methoden mit **:
settings = {"debug": True, "verbose": False, "log_level": "INFO"}
config = Config(**settings) # Entpackt das DictionaryGreifen Sie auf **kwargs-Werte mithilfe von Dictionary-Methoden zu:
def get_setting(self, key, default=None):
return self.settings.get(key, default)
# Iteriere durch alle kwargs
for key, value in self.settings.items():
print(f"{key} = {value}")Probier es selbst
from person_creator import create_person
# Umfassender Testfall-Handler
test_case = input()
if test_case == "basic_test":
create_person(name="John", age=25, occupation="Engineer")
# Ausgabe:
# Person erstellt mit Eigenschaften:
# name: John
# age: 25
# occupation: Engineer
elif test_case == "empty_test":
create_person()
# Ausgabe:
# Person erstellt mit Eigenschaften:
# (keine zusätzliche Ausgabe, da keine Eigenschaften vorhanden sind)
elif test_case == "many_properties":
create_person(name="Alice", age=30, occupation="Doctor", city="New York",
country="USA", hobby="Reading", email="alice@example.com")
# Ausgabe:
# Person erstellt mit Eigenschaften:
# 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")
# Ausgabe:
# Person erstellt mit Eigenschaften:
# 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)
# Ausgabe:
# Person erstellt mit Eigenschaften:
# name: Charlie
# age: 35
# height: 175
# weight: 70
elif test_case == "boolean_values":
create_person(name="David", is_student=True, is_employed=False)
# Ausgabe:
# Person erstellt mit Eigenschaften:
# 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"})
# Ausgabe:
# Person erstellt mit Eigenschaften:
# 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")
# Ausgabe:
# Person erstellt mit Eigenschaften:
# name: José
# city: São Paulo
# country: Brasil
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen