Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Syntax | Decorators
Fortgeschrittene Python-Techniken

bookSyntax

Decorator funktioniert, indem er eine Funktion als Argument nimmt und sie dann innerhalb einer Wrapper-Funktion ausführt.

Um einen Decorator anzuwenden, kann man das @-Symbol gefolgt vom Namen der Decorator-Funktion verwenden, direkt über der Funktion, die modifiziert werden soll. Hier ist ein Beispiel:

def decorator(func):
    ...

# First method
@decorator
add(a,b):
    print(f"Function add: {a} + {b}")

add(2, 3)

# Second method
add(a,b):
    print(f"Function add: {a} + {b}")

inner = decorator(add)

inner(2, 3)

In diesem Beispiel erzielen beide Methoden dasselbe Ergebnis. Die erste Methode, die das @-Symbol verwendet, ist eine lesbarere und prägnantere Art, decorators anzuwenden, oft als "syntactic sugar" bezeichnet.

Es ist typisch, innerhalb von Decorators eine verschachtelte Funktion namens wrapper zu verwenden.

Flexible Dekoratoren: Anpassung an unterschiedliche Funktionsargumente

Funktionen erfordern oft eine unterschiedliche Anzahl von Argumenten. Um einen Dekorator zu entwickeln, der auf Funktionen mit unterschiedlichen Argumentanzahlen angewendet werden kann, ist es effektiv, *args und **kwargs in der wrapper()-Funktion zu verwenden.

1234567891011121314151617181920212223242526272829303132333435
def indicate(func): def wrapper(*args, **kwargs): print("=" * 15) print("Taken arguments:", *args, kwargs) result = func(*args, **kwargs) print("=" * 15) return result return wrapper @indicate def avg_two(a, b): """Calculate the average of two numbers""" return round((a + b) / 2, 1) @indicate def avg_three(a, b, c): """Calculate the average of three numbers""" return round((a + b + c) / 3, 1) @indicate def avg_many_kwargs(**kwargs): """Calculate the average of multiple numbers in a dictionary""" keys = 0 total = 0 for value in kwargs.values(): keys += 1 total += value return round(total / keys, 1) print("Returned:", avg_two(14, 21), "\n") print("Returned:", avg_three(225, 12, 11), "\n") print("Returned:", avg_many_kwargs(first=51, second=11, third=47, fourth=93))
copy

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 2

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

Can you explain how *args and **kwargs work in decorators?

What is the output of this code?

Can you show how to write a decorator that logs the execution time of a function?

Awesome!

Completion rate improved to 3.7

bookSyntax

Swipe um das Menü anzuzeigen

Decorator funktioniert, indem er eine Funktion als Argument nimmt und sie dann innerhalb einer Wrapper-Funktion ausführt.

Um einen Decorator anzuwenden, kann man das @-Symbol gefolgt vom Namen der Decorator-Funktion verwenden, direkt über der Funktion, die modifiziert werden soll. Hier ist ein Beispiel:

def decorator(func):
    ...

# First method
@decorator
add(a,b):
    print(f"Function add: {a} + {b}")

add(2, 3)

# Second method
add(a,b):
    print(f"Function add: {a} + {b}")

inner = decorator(add)

inner(2, 3)

In diesem Beispiel erzielen beide Methoden dasselbe Ergebnis. Die erste Methode, die das @-Symbol verwendet, ist eine lesbarere und prägnantere Art, decorators anzuwenden, oft als "syntactic sugar" bezeichnet.

Es ist typisch, innerhalb von Decorators eine verschachtelte Funktion namens wrapper zu verwenden.

Flexible Dekoratoren: Anpassung an unterschiedliche Funktionsargumente

Funktionen erfordern oft eine unterschiedliche Anzahl von Argumenten. Um einen Dekorator zu entwickeln, der auf Funktionen mit unterschiedlichen Argumentanzahlen angewendet werden kann, ist es effektiv, *args und **kwargs in der wrapper()-Funktion zu verwenden.

1234567891011121314151617181920212223242526272829303132333435
def indicate(func): def wrapper(*args, **kwargs): print("=" * 15) print("Taken arguments:", *args, kwargs) result = func(*args, **kwargs) print("=" * 15) return result return wrapper @indicate def avg_two(a, b): """Calculate the average of two numbers""" return round((a + b) / 2, 1) @indicate def avg_three(a, b, c): """Calculate the average of three numbers""" return round((a + b + c) / 3, 1) @indicate def avg_many_kwargs(**kwargs): """Calculate the average of multiple numbers in a dictionary""" keys = 0 total = 0 for value in kwargs.values(): keys += 1 total += value return round(total / keys, 1) print("Returned:", avg_two(14, 21), "\n") print("Returned:", avg_three(225, 12, 11), "\n") print("Returned:", avg_many_kwargs(first=51, second=11, third=47, fourth=93))
copy

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 2
some-alt