Question d'entretien pour Développeur Python

Comment écririez-vous un décorateur qui prend ses propres arguments ?

Ce que le recruteur cherche à évaluer, comment structurer votre réponse et un exemple parlé à adapter.

Réponse rapide

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

Exemple parlé, à la première personne

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 marche

Questions 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

Répétez les questions difficiles avant qu'on vous les pose

Entraînez-vous avec un copilote en direct, puis présentez-vous prêt. Un Session Pass à $29 vous accompagne pendant l'entretien, sans abonnement et sans engagement.

Obtenir GhostPilot