You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
 
 
 

76 lines
1.9 KiB

  1. Décorateurs
  2. ============
  3. Définition
  4. ------------
  5. Un décorateur est une fonction qui *enveloppe* une autre fonction.
  6. On place le nom du décorateur avec une arobase (``@``) au-dessus
  7. de la fonction décorée::
  8. def mon_décorateur(fonction):
  9. def fonction_retournée():
  10. # fait quelque chose l'argument `fonction`, par exemple
  11. # l'appeler avec un argument:
  12. fonction(42)
  13. return fonction_retournée
  14. @mon_décorateur
  15. def ma_fonction_décorée(un_argument):
  16. fais_un_truc_avec(un_argument)
  17. Les deux dernières lignes sont équivalentes à::
  18. def ma_fonction_décorée(un_argument):
  19. fais_un_truc_avec(un_argument)
  20. ma_fonction_décorée = mon_décorateur(ma_fonction_décorée)
  21. Exemples de décorateurs
  22. -----------------------
  23. On peut faire un décorateur qui nous empêche
  24. d'appeler une fonction sous certaines conditions::
  25. def pas_pendant_la_nuit(fonction):
  26. def résultat():
  27. if il_fait_nuit:
  28. print("chut")
  29. else:
  30. fonction()
  31. return résultat
  32. @pas_pendant_la_nuit
  33. def dire_bonjour():
  34. print("bonjour")
  35. il_fait_nuit = True
  36. dire_bonjour()
  37. # afiche: "chut"
  38. Décorateur prenant des arguments
  39. --------------------------------
  40. On peut aussi avoir des arguments passés aux décorateurs. Dans ce cas, on a besoin de
  41. *trois* fonctions imbriquées. En effet, il nous faut une fonction pour traiter l'argument
  42. ``message`` et une autre pour traiter l`argument ``fonction``::
  43. def affiche_message_avant_appel(message):
  44. def décorateur(fonction):
  45. def résultat():
  46. print(message)
  47. fonction()
  48. return résultat
  49. return décorateur
  50. @affiche_message_avant_appel("dire_bonjour est appelée")
  51. def dire_bonjour():
  52. print("bonjour")
  53. dire_bonjour()
  54. # affiche:
  55. # dire_bonjour est appelée
  56. # bonjour