Decorators in Python

Decorators in Python - Python - Programmation

Marsh Posté le 13-04-2022 à 23:33:00    

Bonjour,
 
Je me remets un peu à la programmation (je n'ai jamais été très loin). Et plus précisément j'étudie un peu Python.  
Dernièrement, j'ai découvert la notion de Decorators et j'ai un peu de mal avec celle-ci. Je comprends le but général mais le fonctionnement profond m'échappe. J'ai donc joué un peu et vis à vis du code ci-dessous je n'arrive pas à m'expliquer le résultat et la manière dont python éxecute tout ça.
Merci par avance pour votre éclairage.
 
def DecorateFunct(funct):
    print("A little decoration here" )
    def wrrap(*arg):
        #print ("A little decoration here" )
        f=funct(*arg)
        print("Test" )
        return f
    return wrrap
 
@DecorateFunct
def MainFunct(a,b,c,d):
    print("The main one is here" )
    f=(a+b)-(c+d)
    print("The result is ",f)
    print("This is the main function",MainFunct.__name__)
 
@DecorateFunct
def OtherFunct():
    print("This is the other function",OtherFunct.__name__)
 
@DecorateFunct
def AndAnotherOne():
    print("And anotherone" )
 
MainFunct(5,10,1,2)
OtherFunct()
AndAnotherOne()
_____________________________________________________________________________________________
Résultat:
A little decoration here
A little decoration here
A little decoration here
The main one is here
The result is  12
This is the main function wrrap
Test
This is the other function wrrap
Test
And anotherone
Test

Reply

Marsh Posté le 13-04-2022 à 23:33:00   

Reply

Marsh Posté le 16-04-2022 à 13:05:33    

Quelqu'un peut-il m'aider??

Reply

Marsh Posté le 17-04-2022 à 09:12:16    

Hello,
Je ne fais pas de Python et je ne comprends pas pourquoi toutes ces méthodes additionnelles dans ton exemple mais je pense que de façon générale l'idée est de "greffer" sur une méthode existante un comportement additionnel.
Par exemple :
- La méthode addition fait la somme de deux nombres.
- Le décorateur affiche le résultat, ou il l'enregistre quand même (logging), ou il envoie une notification à l'utilisateur.

 

Le décorateur "modifie" donc la fonction addition pour y ajouter le fait de "propager l'info qu'elle renvoie quelque part où c'est utile"
Comme ça la fonction "addition" peut se concentrer sur son vrai boulot et les décorations s'occupent de ce qui doit se passer à côté.

 

En espérant ne pas me faire taper par les développeurs Python :o


Message édité par TotalRecall le 17-04-2022 à 09:12:55

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 18-04-2022 à 13:11:02    

phileasfogg23 a écrit :

Je me remets un peu à la programmation (je n'ai jamais été très loin). Et plus précisément j'étudie un peu Python.  
Dernièrement, j'ai découvert la notion de Decorators et j'ai un peu de mal avec celle-ci. Je comprends le but général mais le fonctionnement profond m'échappe. J'ai donc joué un peu et vis à vis du code ci-dessous je n'arrive pas à m'expliquer le résultat et la manière dont python éxecute tout ça.


Ya rien de spécial aux décotateurs, c'est juste une syntaxe dédiée pour appliquer une fonction à une fonction:

Code :
  1. @foo
  2. def bar(): ...


est équivalent à:

Code :
  1. def bar(): ...
  2. bar = foo(bar)


Donc dans ton bout de code, t'as "DecorateFunct" qui est immédiatement appelé 3 fois de suite quand tu définis des fonctions décorées, puis les fonctions décorées sont appelées.
 
Dans la mesure où ton décorateur remplace les fonctions par un wrapper (`wrrap`), toutes les fonctions "s'appellenent" wrrapt, parce-que c'est la fonction qui existe. C'est pour ça qu'il existe functools.wraps qui essaie de copier les métadonnées de la fonction décorée au wrapper (et dans mon souvenir il y a pas mal de trucs que ça copie pas, la librairie decorator fait ça mieux mais est un peu moins flexible et plus couteuse).


Message édité par masklinn le 18-04-2022 à 13:11:32

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-04-2022 à 15:48:24    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed