Was macht functools.wraps?

functools.wraps ist ein Dekorator, der verwendet werden kann, um eine Funktion oder Methode durch Aktualisierung ihrer Metadaten zu modifizieren. Es wird in der Regel in Kombination mit anderen Dekoratoren verwendet, um die Metadaten der dekorierten Funktion zu erhalten. Hier ist ein Beispiel dafür, wie man functools.wraps verwendet, um eine Funktion zu dekorieren:

import functools

def my_decorator(f):
    @functools.wraps(f)
    def wrapper(*args, **kwds):
        print("Calling decorated function")
        return f(*args, **kwds)
    return wrapper

@my_decorator
def example():
    """Docstring"""
    print("Called example function")

print(example.__name__) #example
print(example.__doc__) #Docstring

Hier nimmt functools.wraps die Funktion f als Eingabe und kopiert deren Attribute wie __name__, __doc__ auf die Wrapper-Funktion. Dies ist nützlich, da in dem Beispiel die dekorierte Funktion example in der wrapper-Funktion eingeschlossen wird und die Wrapper-Funktion die Attribute der ursprünglichen Funktion haben wird.