Introductie van functools.wraps
Veeg om het menu te tonen
Wanneer je je eigen decorators schrijft, verlies je vaak belangrijke informatie over de oorspronkelijke functie, zoals de naam, docstring en module. Dit gebeurt omdat de decorator de oorspronkelijke functie vervangt door een nieuwe wrapperfunctie. Om dit te voorkomen, gebruik je de functools.wraps decorator uit de standaardbibliotheek van Python.
Door functools.wraps toe te passen op je wrapperfunctie, behoud je de metadata van de oorspronkelijke functie. Dit betekent:
- Het
__name__attribuut van de functie blijft hetzelfde als het origineel; - De
__doc__string van de functie blijft behouden; - Het
__module__attribuut en andere metadata blijven behouden.
Het behouden van metadata is belangrijk voor debugging, documentatiegeneratie en tools die afhankelijk zijn van functie-introspectie. Zonder functools.wraps kunnen stacktraces en hulpprogramma's verwarrende of onjuiste informatie tonen, waardoor je code moeilijker te onderhouden en te debuggen is.
1234567891011121314151617181920212223from functools import wraps # Define a decorator that will wrap another function def my_decorator(func): # Use @wraps to preserve metadata from the original function @wraps(func) def wrapper(*args, **kwargs): # This code runs before the original function print("Running the decorated function...") return func(*args, **kwargs) # Call the original function return wrapper # Return the wrapper as the new decorated function # Apply the decorator to a function def say_hello(): """Prints a hello message.""" print("Hello!") say_hello = my_decorator(say_hello) say_hello() # Print out the preserved metadata print(f"Function name: {say_hello.__name__}") # Name is preserved print(f"Docstring: {say_hello.__doc__}") # Docstring is preserved
Je ziet hier hoe je functools.wraps gebruikt om de metadata van de oorspronkelijke functie te behouden bij het maken van een decorator. Door functools.wraps toe te passen op je wrapper, zorg je ervoor dat attributen zoals de functienaam en docstring niet verloren gaan na decoratie.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.