Pergunta de entrevista para Desenvolvedor Python

Por que um argumento padrão mutável é considerado um bug esperando para acontecer?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

Argumentos padrão são avaliados uma vez, quando a função é definida, não a cada chamada. Uma lista ou dict padrão é, portanto, um único objeto compartilhado que persiste entre todas as chamadas, então mutações se acumulam e vazam entre chamadores. A correção é usar None como padrão e criar um container novo dentro do corpo quando o argumento for None.

Por que os entrevistadores perguntam isso

É uma checagem rápida para ver se você entende que uma instrução def executa e liga objetos em tempo de definição. Os entrevistadores gostam porque a resposta errada é confiante e específica: as pessoas insistem que a lista é recriada a cada chamada. Também abre a porta para falar da diferença entre ligar um nome e copiar um valor, que está por trás de muitas surpresas do Python.

Como estruturar sua resposta

  • Diga que padrões são avaliados uma vez, em tempo de definição.
  • Explique a consequência do objeto compartilhado.
  • Dê a correção com o sentinela None.
  • Note que padrões imutáveis são seguros.

Exemplo de resposta

Exemplo falado, em primeira pessoa

Porque o objeto padrão é criado uma vez, quando o Python executa a instrução def, e depois toda chamada que omite o argumento recebe aquele mesmo objeto. Se for uma lista e a função der append nela, a terceira chamada enxerga o que a primeira e a segunda deixaram para trás. Peguei isso num helper de cache que recebia um dict vazio de opções por padrão. Num worker de vida longa o dict cresceu por dias e no fim um request herdou configurações de um tenant sem relação nenhuma, o que não é um bug divertido de explicar. A correção é sem graça: padrão None, e aí dentro do corpo você checa explicitamente por None e monta um dict novo, para que um dict vazio passado de propósito continue sendo respeitado. Padrões imutáveis como inteiros, strings ou None são tranquilos porque nada pode mutá-los. O Ruff sinaliza isso como B006 já de fábrica, então é um daqueles bugs que nunca deveriam chegar ao review num projeto com lint plugado no CI.

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 funciona

Perguntas de acompanhamento que você pode esperar

  • Por que usar or em vez de uma checagem explícita de None é arriscado?
  • Tuplas são seguras como padrão?
  • Onde mais a avaliação em tempo de definição surpreende as pessoas?

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

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot