Menu
Coddy logo textTech

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: Teacher

Mischen 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: Reading

Leere **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 Argumenten

Ausgabe:

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: Engineer

Dictionaries 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 Dictionary

Ausgabe:

debug = True
verbose = False
timeout = 30

Wichtige Punkte:

  • **kwargs sammelt Keyword-Argumente in einem Dictionary – keine Konvertierung erforderlich, es ist bereits eines
  • Der Name kwargs ist 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
challenge icon

Aufgabe

Einfach

In 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 Dictionary

Greifen 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
quiz iconTeste dich selbst

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