Un context manager es cualquier objeto con dunder enter y dunder exit. La sentencia with llama a enter, asocia su valor de retorno al destino del as y garantiza que exit se ejecute después, incluso si el cuerpo lanza una excepción. Exit recibe los detalles de la excepción y puede suprimirla devolviendo True. El decorador contextlib.contextmanager te deja escribir lo mismo como un generador con un único yield.
Por qué lo preguntan los entrevistadores
Las fugas de recursos son uno de los fallos en producción más comunes en servicios Python, así que los entrevistadores comprueban que recurres a with por reflejo y que entiendes la garantía que ofrece. También quieren ver que sabes escribir uno y no solo consumirlos, y que sabes que exit se ejecuta también en la ruta de excepción, que es lo que lo convierte en un mecanismo de limpieza y no en azúcar sintáctico.
Cómo estructurar tu respuesta
- Nombra los dos métodos dunder y su función.
- Insiste en que exit se ejecuta incluso con excepciones.
- Menciona el atajo del generador de contextlib.
- Describe uno que escribiste y la fuga que evitó.
Ejemplo de respuesta
El protocolo son dos métodos. Enter hace la preparación y devuelve lo que quieras que quede asociado tras la palabra as, y exit hace el desmontaje. Lo importante es que exit se ejecuta tanto si el bloque terminó limpio como si reventó, y recibe el tipo de excepción, el valor y el traceback para decidir qué hacer. Devolver True desde exit se traga la excepción, algo que uso con mucha moderación porque oculta fallos. La mayoría de los que escribo usan contextlib.contextmanager, donde el código antes del yield es la preparación, el de después es la limpieza, y envuelvo el yield en un try finally para que la limpieza pase igual si hay un error. Construí uno en una fintech para transacciones de base de datos que además estampaba un id de petición en el contexto de logging, así cada consulta dentro del bloque era trazable y el id se borraba al salir. Antes de eso lo poníamos y lo quitábamos a mano, y un return temprano en un handler filtró el id a la siguiente petición del mismo worker.
¿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 manejas varios context managers a la vez?
- ¿Qué resuelve contextlib.ExitStack?
- ¿Cómo escribirías un context manager asíncrono?
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