Un gestionnaire de contexte est tout objet doté de dunder enter et dunder exit. L'instruction with appelle enter, lie sa valeur de retour à la cible du as, et garantit que exit s'exécute ensuite même si le corps lève une exception. Exit reçoit les détails de l'exception et peut la supprimer en renvoyant True. Le décorateur contextlib.contextmanager permet d'écrire la même chose sous forme de générateur avec un seul yield.
Pourquoi les recruteurs posent cette question
Les fuites de ressources sont l'une des pannes de production les plus courantes dans les services Python, donc les recruteurs vérifient que vous dégainez with par réflexe et que vous comprenez la garantie qu'il apporte. Ils veulent aussi voir que vous savez en écrire un et pas seulement en consommer, et que vous savez que exit s'exécute sur le chemin d'erreur, ce qui en fait un mécanisme de nettoyage et pas juste une syntaxe pratique.
Comment structurer votre réponse
- Nommez les deux méthodes dunder et leur rôle.
- Insistez sur le fait que exit s'exécute même en cas d'exception.
- Mentionnez le raccourci générateur de contextlib.
- Décrivez-en un que vous avez écrit et la fuite qu'il a évitée.
Exemple de réponse
Le protocole tient en deux méthodes. Enter fait l'initialisation et renvoie ce que vous voulez lier après le mot-clé as, et exit fait le nettoyage. L'important, c'est que exit s'exécute que le bloc se soit terminé proprement ou qu'il ait explosé, et qu'il reçoit le type, la valeur et la traceback de l'exception, donc il peut décider quoi en faire. Renvoyer True depuis exit avale l'exception, ce que j'utilise avec parcimonie parce que cela masque des erreurs. La plupart de ceux que j'écris passent par contextlib.contextmanager, où le code avant le yield est l'initialisation, celui d'après le nettoyage, et j'entoure le yield d'un try finally pour que le nettoyage ait bien lieu en cas d'erreur. J'en ai construit un dans une fintech pour les transactions de base de données, qui posait aussi un identifiant de requête dans le contexte de logs, de sorte que chaque requête SQL du bloc était traçable et que l'identifiant était effacé à la sortie. Avant cela nous le posions et l'effacions à la main, et un return anticipé dans un handler faisait fuiter l'identifiant sur la requête suivante servie par le même worker.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Comment gérez-vous plusieurs gestionnaires de contexte à la fois ?
- Quel problème résout contextlib.ExitStack ?
- Comment écririez-vous un gestionnaire de contexte asynchrone ?
Autres questions pour Développeur Python
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions