Compreendendo Decorators Básicos
Nesta etapa, introduziremos o conceito de decorators e seu uso básico. Um decorator é uma função que aceita outra função como argumento, adiciona alguma funcionalidade e retorna outra função, tudo isso sem alterar o código-fonte da função original.
Primeiro, localize o arquivo decorator_basics.py no explorador de arquivos no lado esquerdo do WebIDE. Dê um duplo clique para abri-lo. Escreveremos nosso primeiro decorator neste arquivo.
Copie e cole o seguinte código em decorator_basics.py:
import datetime
def log_activity(func):
"""A simple decorator to log function calls."""
def wrapper(*args, **kwargs):
print(f"Calling function '{func.__name__}' at {datetime.datetime.now()}")
result = func(*args, **kwargs)
print(f"Function '{func.__name__}' finished.")
return result
return wrapper
@log_activity
def greet(name):
"""A simple function to greet someone."""
print(f"Hello, {name}!")
## Call the decorated function
greet("Alice")
## Let's inspect the function's metadata
print(f"\nFunction name: {greet.__name__}")
print(f"Function docstring: {greet.__doc__}")
Vamos analisar este código:
- Definimos uma função decorator
log_activity que aceita uma função func como seu argumento.
- Dentro de
log_activity, definimos uma função aninhada wrapper. Esta função conterá o novo comportamento. Ela imprime uma mensagem de log, chama a função original func e, em seguida, imprime outra mensagem de log.
- A função
log_activity retorna a função wrapper.
- A sintaxe
@log_activity acima da função greet é um atalho para greet = log_activity(greet). Ela aplica nosso decorator à função greet.
Agora, salve o arquivo (você pode usar Ctrl+S ou Cmd+S). Para executar o script, abra o terminal integrado na parte inferior do WebIDE e execute o seguinte comando:
python ~/project/decorator_basics.py
Você verá a seguinte saída. Observe que a data e hora variarão.
Calling function 'greet' at 2023-10-27 10:30:00.123456
Hello, Alice!
Function 'greet' finished.
Function name: wrapper
Function docstring: None
Note duas coisas na saída. Primeiro, nossa função greet agora está envolvida com as mensagens de log. Segundo, o nome e a docstring da função foram substituídos pelos da função wrapper. Isso pode ser problemático para depuração (debugging) e introspecção. Na próxima etapa, aprenderemos como corrigir isso.