Menu
Coddy logo textTech

Das **kwarg

Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 43 von 64.

**kwargs ist die Kurzform von „keyword arguments“. Damit kann eine Funktion eine beliebige Anzahl benannter Argumente (wie Schlüssel-Wert-Paare) akzeptieren, ohne sie alle im Voraus definieren zu müssen.

So funktioniert es:

  • *args → sammelt zusätzliche Positionsargumente in einem Tupel
  • **kwargs → sammelt zusätzliche Schlüsselwortargumente in einem Wörterbuch

Einfaches Beispiel

Beginnen wir mit dem einfachsten möglichen Beispiel:

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

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

Ausgabe:

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

Wie du sehen kannst, sammelt **kwargs automatisch alle Schlüsselwortargumente in einem Wörterbuch.

Verwenden des Wörterbuchs

Da kwargs bereits ein Wörterbuch ist, kannst du direkt darüber iterieren:

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

Reguläre Parameter mit **kwargs kombinieren

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

Output:

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

Leeres **kwargs

Wenn keine Schlüsselwortargumente übergeben werden, ist kwargs ein leeres Wörterbuch:

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

show_data()  # Keine Argumente
show_data(item="apple")  # Mit Argumenten

Output:

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

Praxisbeispiel: Klasse mit **kwargs

So könntest du **kwargs in einer Klasse verwenden:

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

Wörterbücher entpacken

Du kannst Wörterbücher 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 Schlüsselwortargumente in einem dictionary: keine Konvertierung erforderlich, es ist bereits eines
  • Der Name kwargs ist konventionell – nach ** könntest du jeden beliebigen Namen verwenden
  • Verwende es, wenn du flexible Funktionssignaturen möchtest
  • Ideal für den Umgang mit optionalen Parametern oder Konfigurationseinstellungen
challenge icon

Aufgabe

Einfach

In dieser Herausforderung implementierst du ein System zur Erstellung von Personen mit umfassender Testabdeckung.

Du musst nur die Datei person_creator.py bearbeiten und dabei den TODO-Kommentaren folgen, die dich durch deine Implementierung führen. Die Datei enthält eine Klassenstruktur zum Erstellen und Verwalten von Personenobjekten mit verschiedenen Eigenschaften.

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 created with properties:
    # name: John
    # age: 25
    # occupation: Engineer

elif test_case == "empty_test":
    create_person()
    # Ausgabe:
    # Person created with properties:
    # (keine zusätzliche Ausgabe, da es keine Eigenschaften gibt)

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 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")
    # Ausgabe:
    # 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)
    # Ausgabe:
    # 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)
    # Ausgabe:
    # 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"})
    # Ausgabe:
    # 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")
    # Ausgabe:
    # Person created with properties:
    # 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 Objektorientierte Programmierung

Übe selbstständig: Online-Python-Compiler