Ich versuche, einen einfachen Dekorator zu schreiben, der eine bestimmte Anweisung protokolliert, bevor er die dekorierte Funktion aufruft. Die protokollierten Anweisungen sollten beide von der gleichen Funktion zu kommen scheinen, was ich dachte, war der Zweck von functools.wraps().
Warum funktioniert der folgende Code:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(funcName)20s - %(message)s')
from functools import wraps
def log_and_call(statement):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
logging.info(statement)
return func(*args, **kwargs)
return wrapper
return decorator
@log_and_call("This should be logged by 'decorated_function'")
def decorated_function():
logging.info('I ran')
decorated_function()
führen zu Protokollerklärungen wie:
wrapper - This should be logged by 'decorated_function'
decorated_function - I ran
Ich dachte, der Aufruf von wraps würde wrapper mit dem Namen von decorated_function umbenennen.
Ich verwende Python 2.7.1.