Vous ajoutez une troisième couche. La fonction extérieure prend les arguments du décorateur et renvoie le vrai décorateur, qui prend la fonction et renvoie un wrapper qui l'appelle. Appliquez functools.wraps au wrapper pour que le nom, la docstring et les métadonnées de signature survivent. Par exemple, un décorateur de retry prend le nombre de tentatives à la couche extérieure et le wrapper implémente la boucle.
Pourquoi les recruteurs posent cette question
Les décorateurs testent si vous êtes à l'aise pour traiter les fonctions comme des valeurs et pour capturer de l'état dans une fermeture. La version paramétrée monte la difficulté parce qu'il faut garder trois niveaux au clair tout en expliquant à voix haute. Les recruteurs guettent aussi functools.wraps, puisque l'oublier casse l'introspection, la sortie de help et tout ce qui s'appuie sur le nom de la fonction, ce qui pose un vrai problème dans les frameworks qui enregistrent des routes ou des tâches.
Comment structurer votre réponse
- Décrivez les trois couches imbriquées dans l'ordre.
- Dites ce que chaque couche reçoit et renvoie.
- Mentionnez functools.wraps et pourquoi c'est important.
- Ancrez cela dans un décorateur que vous avez réellement écrit.
Exemple de réponse
Trois couches, et je les énonce à voix haute dans l'ordre pour ne pas m'y perdre. La fonction la plus externe prend la configuration, disons le nombre de tentatives. Elle renvoie le décorateur, qui prend la fonction cible. Celui-ci renvoie le wrapper, qui prend des args et des kwargs, fait le travail autour de l'appel et renvoie le résultat. Je mets toujours functools.wraps sur le wrapper, sinon la fonction décorée s'annonce partout sous le nom wrapper, et Flask ou Celery enregistreront joyeusement deux routes sous le même nom avant d'échouer de façon déroutante. Celui que j'ai écrit le plus souvent est un retry avec backoff exponentiel pour des appels amont capricieux : trois tentatives, une pause qui double à chaque fois, et on relève l'exception à la dernière. Un raffinement utile est d'accepter aussi la fonction directement, pour que le décorateur marche avec et sans parenthèses, même si en pratique j'exige plutôt les parenthèses parce que la logique de branchement coûte plus de clarté qu'elle n'en fait gagner.
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 feriez-vous marcher ce décorateur sur des fonctions asynchrones ?
- Que copie exactement functools.wraps ?
- Quand un décorateur écrit sous forme de classe serait-il préférable ?
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