Ich denke, ein funktionierendes, realweltliches Beispiel mit Anwendungsbeispielen des allgemeinsten Anwendungsfalls kann hier wertvoll sein.
Im Folgenden befindet sich ein Decorator für Funktionen, der beim Betreten und Verlassen der Funktion ein Log erstellt.
Parameter steuern, ob Eingabe- und Ausgabewerte gedruckt werden sollen, das Log-Level usw.
import logging
from functools import wraps
def log_in_out(logger=logging.get_logger(), is_print_input=True, is_print_output=True, is_method=True, log_level=logging.DEBUG):
"""
@param logger-
@param is_print_input- Schaltet das Drucken der Eingabeargumente ein oder aus
@param is_print_output- Schaltet das Drucken der Ausgabewerte ein oder aus
@param is_method- True für Methoden, False für Funktionen. Verhindert, dass "self" gedruckt wird, falls is_print_input==True
@param log_level-
@returns- ein Decorator, der zu logger loggt, wenn die dekorierte Funktion betreten oder verlassen wird.
Verschandele deinen Code nicht!
"""
def decor(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
if is_print_input:
logger.log(
msg=f"Eingetreten in {fn.__name__} mit args={args[1:] if is_method else args}, kwargs={kwargs}",
level=log_level
)
else:
logger.log(
msg=f"Eingetreten in {fn.__name__}",
level=log_level
)
result = fn(*args, **kwargs)
if is_print_output and result is not None:
logger.log(
msg=f"Verlassen {fn.__name__} mit Ergebnis {result}",
level=log_level,
)
else:
logger.log(
msg=f"Verlassen {fn.__name__}",
level=log_level
)
return result
return wrapper
return decor
Anwendung:
@log_in_out(is_method=False, is_print_input=False)
def foo(a, b=5):
return 3, a
foo(2)
--> druckt
Eingetreten in foo
Verlassen foo mit Ergebnis (3, 2)
class A():
@log_in_out(is_print_output=False)
def bar(self, c, m, y):
return c, 6
a = A()
a.bar(1, 2, y=3)
--> druckt
Eingetreten in bar mit args=(1, 2), kwargs={y:3}
Verlassen bar
5 Stimmen
Dein Beispiel ist nicht syntaktisch korrekt.
execute_complete_reservation
erwartet zwei Parameter, aber du übergibst ihm nur einen. Dekorateure sind nur syntaktischer Zucker, um Funktionen in andere Funktionen einzuschließen. Siehe docs.python.org/reference/compound_stmts.html#function für die vollständige Dokumentation.