7.1 Zugriff auf alle Funktionsargumente
In Python gibt es einige sehr praktische Möglichkeiten, um innerhalb einer Funktion die Liste aller an sie übergebenen Parameter zu erhalten. Lass uns diese durchgehen.
Verwendung von *args
*args ermöglicht es, eine variable Anzahl von positionsbasierte (gewöhnliche) Argumente an eine Funktion zu übergeben. Diese Argumente werden in einem Tupel verpackt und können innerhalb der Funktion bearbeitet werden.
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
Erklärung
Die Funktion print_numbers nimmt eine beliebige Anzahl von positionsbasierten Argumenten entgegen, die in einem Tupel args verpackt sind. Wir können die Argumente innerhalb der Funktion mit einer for-Schleife durchlaufen.
Vorteile
- Flexibilität: Ermöglicht es, eine beliebige Anzahl von Argumenten an eine Funktion zu übergeben.
- Vielseitigkeit: Kann für Funktionen mit einer unbestimmten Anzahl von Parametern verwendet werden.
Verwendung von **kwargs
**kwargs ermöglicht es, eine variable Anzahl von benannten Argumenten an eine Funktion zu übergeben. Diese Argumente werden in einem Dictionary verpackt und können innerhalb der Funktion bearbeitet werden.
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
Erklärung
Die Funktion print_person_info nimmt eine beliebige Anzahl von benannten Argumenten entgegen, die in einem Dictionary kwargs verpackt sind. Wir können die Argumente innerhalb der Funktion mit der Dictionary-Methode items() durchlaufen.
Vorteile
- Flexibilität: Ermöglicht es, eine beliebige Anzahl von benannten Argumenten an eine Funktion zu übergeben.
- Lesbarkeit: Benannte Argumente machen Funktionsaufrufe lesbarer.
7.2 Festlegen des Argumenttyps
Nur positionsbasierte Argumente
In Python 3.8 und höher kann man Funktionen mit positionsbasierten Argumenten definieren, die nur positionsbasiert übergeben werden können. Dies wird mit dem Symbol / in der Funktionsdefinition durchgeführt.
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Ausgabe: Hello, Alice!
greet("Alice", greeting="Hi") # Ausgabe: Hi, Alice!
# greet(name="Alice") # Fehler: TypeError
Erklärung
Die Funktion greet nimmt ein Argument name entgegen, das nur positionsbasiert übergeben werden kann. Argumente vor dem / können nur positionsbasiert übergeben werden.
Dieser Ansatz erlaubt es, die Art und Weise der Argumentübergabe einzuschränken, was die Lesbarkeit verbessert und Fehler vermeidet.
Nur benannte Argumente (Keyword-Only Arguments)
Ebenso kann man Funktionsparameter definieren, die nur benannt übergeben werden können. Dies wird mit dem Symbol * in der Funktionsdefinition durchgeführt.
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # Ausgabe: Hello, Alice!
greet(name="Alice", greeting="Hi") # Ausgabe: Hi, Alice!
# greet("Alice") # Fehler: TypeError
Die Funktion greet nimmt ein Argument name entgegen, das nur benannt übergeben werden kann. Argumente nach dem * können nur benannt übergeben werden.
Dieser Ansatz zwingt dazu, die Argumentnamen explizit anzugeben, was die Lesbarkeit des Codes verbessert.
Kombination von positionsbasierten und benannten Argumenten
Man kann auch positionsbasierte und benannte Argumente kombinieren, um maximale Flexibilität zu erreichen.
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Ausgabe: Hello, Alice!
greet("Alice", greeting="Hi") # Ausgabe: Hi, Alice!
# greet(name="Alice") # Fehler: TypeError
Die Funktion greet nimmt ein Argument name entgegen, das nur positionsbasiert übergeben werden kann, und ein benanntes Argument greeting, das zwingend benannt übergeben werden muss. Die Verwendung von sowohl / als auch * ermöglicht die Kombination von positionsbasierten und benannten Argumenten.
Volles Beispiel für alle drei Szenarien:
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# Funktionsaufruf mit verschiedenen Argumenten
full_example(1, 2, 3, 4, e=5, f=6) # Alle Argumente korrekt übergeben
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # Fehler: TypeError
Erläuterung
- Nur positionsbasierte Argumente:
aundbmüssen nur positionsbasiert übergeben werden. - Gewöhnliche positionsbasierte oder benannte Argumente:
cunddkönnen sowohl positionsbasiert als auch benannt übergeben werden. - Nur benannte Argumente:
eundfmüssen nur benannt übergeben werden.
GO TO FULL VERSION