Añades una tercera capa. La función exterior recibe los argumentos del decorador y devuelve el decorador de verdad, que recibe la función y devuelve un wrapper que la llama. Aplica functools.wraps al wrapper para que sobrevivan el nombre, el docstring y los metadatos de la firma. Por ejemplo, un decorador de reintentos recibe el número de intentos en la capa exterior y el wrapper implementa el bucle.
Por qué lo preguntan los entrevistadores
Los decoradores comprueban si te resulta cómodo tratar las funciones como valores y capturar estado en un closure. La versión parametrizada sube la dificultad porque tienes que mantener claras tres capas mientras lo explicas en voz alta. Los entrevistadores también están atentos a functools.wraps, porque olvidarlo rompe la introspección, la salida de help y cualquier cosa que dependa del nombre de la función, lo que es un problema real en frameworks que registran rutas o tareas.
Cómo estructurar tu respuesta
- Describe las tres capas anidadas en orden.
- Di qué recibe y qué devuelve cada capa.
- Menciona functools.wraps y por qué importa.
- Aterrízalo en un decorador que hayas escrito de verdad.
Ejemplo de respuesta
Tres capas, y las digo en voz alta en orden para no perderme. La función más externa recibe la configuración, por ejemplo el número de reintentos. Devuelve el decorador, que recibe la función objetivo. Y este devuelve el wrapper, que recibe args y kwargs, hace el trabajo alrededor de la llamada y devuelve el resultado. Siempre pongo functools.wraps en el wrapper, porque si no la función decorada se identifica como wrapper en todas partes, y Flask o Celery registrarán tan felices dos rutas con el mismo nombre y fallarán de una forma confusa. El que más veces he escrito es un reintento con backoff exponencial para llamadas inestables a servicios externos: tres intentos, durmiendo un intervalo que se duplica, relanzando la excepción en el último. Un refinamiento útil es aceptar también la función directamente, para que funcione con y sin paréntesis, aunque sinceramente suelo exigir los paréntesis porque la lógica de ramificación cuesta más claridad de la que ahorra.
¿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 funcionaPreguntas de seguimiento que puedes esperar
- ¿Cómo harías que ese decorador funcione con funciones asíncronas?
- ¿Qué copia en realidad functools.wraps?
- ¿Cuándo sería mejor un decorador basado en clases?
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