Introdução ao functools.wraps
Deslize para mostrar o menu
Ao criar seus próprios decoradores, muitas vezes você perde informações importantes sobre a função original, como seu nome, docstring e módulo. Isso ocorre porque o decorador substitui a função original por uma nova função wrapper. Para resolver esse problema, utilize o decorador functools.wraps da biblioteca padrão do Python.
Ao aplicar functools.wraps à sua função wrapper, você preserva os metadados da função original. Isso significa:
- O atributo
__name__da função permanece igual ao da original; - A string
__doc__da função é mantida intacta; - O atributo
__module__e outros metadados são preservados.
Preservar metadados é importante para depuração, geração de documentação e ferramentas que dependem de introspecção de funções. Sem o functools.wraps, rastreamentos de pilha e utilitários de ajuda podem exibir informações confusas ou incorretas, tornando o código mais difícil de manter e depurar.
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
É possível observar como utilizar o functools.wraps para preservar os metadados da função original ao criar um decorador. Ao aplicar functools.wraps ao wrapper, garante-se que atributos como o nome e a docstring da função não sejam perdidos após a decoração.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo