Você adiciona uma terceira camada. A função externa recebe os argumentos do decorator e devolve o decorator de verdade, que recebe a função e devolve um wrapper que a chama. Aplique functools.wraps no wrapper para que nome, docstring e metadados de assinatura sobrevivam. Por exemplo, um decorator de retry recebe a contagem de tentativas na camada externa e o wrapper implementa o loop.
Por que os entrevistadores perguntam isso
Decorators testam se você está confortável em tratar funções como valores e em fechar sobre estado. A versão parametrizada aumenta a dificuldade porque você precisa manter três níveis na cabeça enquanto explica em voz alta. Os entrevistadores também escutam por functools.wraps, já que esquecer isso quebra introspecção, saída do help e qualquer coisa que dependa do nome da função, o que é um problema real em frameworks que registram rotas ou tasks.
Como estruturar sua resposta
- Descreva as três camadas aninhadas em ordem.
- Diga o que cada camada recebe e devolve.
- Mencione functools.wraps e por que importa.
- Ancore num decorator que você realmente escreveu.
Exemplo de resposta
Três camadas, e eu digo em voz alta na ordem para não me perder. A função mais externa recebe a configuração, digamos o número de retries. Ela devolve o decorator, que recebe a função alvo. Esse devolve o wrapper, que recebe star args e star star kwargs, faz o trabalho em volta da chamada e devolve o resultado. Eu sempre coloco functools.wraps no wrapper, senão a função decorada se reporta como wrapper em todo lugar, e o Flask ou o Celery vão registrar alegremente duas rotas com o mesmo nome e falhar de um jeito confuso. O que eu mais escrevi foi um retry com backoff exponencial para chamadas instáveis de upstream: três tentativas, dormindo um intervalo que dobra, relançando na última. Um refinamento útil é aceitar também a função direto, para funcionar com e sem parênteses, embora sinceramente eu costume exigir os parênteses porque a lógica de ramificação custa mais clareza do que economiza.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Como você faria esse decorator funcionar com funções async?
- O que o functools.wraps copia de fato?
- Quando um decorator baseado em classe seria melhor?
Mais perguntas para Desenvolvedor Python
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas