Pregunta de entrevista para Desarrollador Python

¿Por qué un argumento por defecto mutable se considera un bug esperando a pasar?

Qué evalúa el entrevistador, cómo estructurar tu respuesta y un ejemplo hablado que puedes adaptar.

Respuesta rápida

Los argumentos por defecto se evalúan una sola vez, cuando se define la función, no en cada llamada. Una lista o un diccionario por defecto son, por tanto, un único objeto compartido que persiste entre todas las llamadas, así que las mutaciones se acumulan y se filtran entre quienes la llaman. La solución es poner None por defecto y crear un contenedor nuevo dentro del cuerpo cuando el argumento es None.

Por qué lo preguntan los entrevistadores

Es una comprobación rápida de si entiendes que una sentencia def se ejecuta y asocia objetos en tiempo de definición. A los entrevistadores les gusta porque la respuesta equivocada es segura y concreta: hay quien insiste en que la lista se recrea en cada llamada. También abre la puerta a hablar de la diferencia entre asociar un nombre y copiar un valor, que está detrás de muchas sorpresas de Python.

Cómo estructurar tu respuesta

  • Di que los valores por defecto se evalúan una vez, en tiempo de definición.
  • Explica la consecuencia del objeto compartido.
  • Da la solución del centinela None.
  • Señala que los valores por defecto inmutables son seguros.

Ejemplo de respuesta

Ejemplo hablado, en primera persona

Porque el objeto por defecto se crea una sola vez, cuando Python ejecuta la sentencia def, y a partir de ahí toda llamada que omita el argumento recibe ese mismo objeto. Si es una lista y la función le hace append, la tercera llamada ve lo que dejaron la primera y la segunda. Me pasó con un helper de caché que recibía un diccionario de opciones vacío por defecto. Con un worker de vida larga, el diccionario creció durante días y al final una petición heredó ajustes de un tenant que no tenía nada que ver, un bug que no es divertido de explicar. La solución es aburrida: poner None por defecto, y dentro del cuerpo comprobar explícitamente si es None y construir un diccionario nuevo, para que un diccionario vacío pasado a propósito se siga respetando. Los valores por defecto inmutables, como enteros, cadenas o None, no dan problema porque nada puede mutarlos. Ruff lo marca como B006 sin configurar nada, así que es de esos bugs que nunca deberían llegar a revisión en un proyecto con linting en CI.

¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.

Mira cómo funciona

Preguntas de seguimiento que puedes esperar

  • ¿Por qué es arriesgado usar or en vez de una comprobación explícita de None?
  • ¿Las tuplas son seguras como valores por defecto?
  • ¿En qué otros sitios sorprende la evaluación en tiempo de definición?

Más preguntas para Desarrollador Python

Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.

Predecir mis preguntas

Ensaya las preguntas difíciles antes de que te las hagan

Practica con un copiloto en vivo y entra preparado. Un Session Pass de $29 te lleva a través de la entrevista sin suscripción y sin ataduras.

Consigue GhostPilot