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.

02-décorateurs.rst 1.8 KiB

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