• # LMSTFY

    Posté par  . Évalué à 4 (+2/-0). Dernière modification le 25/11/21 à 15:18.

    https://stackoverflow.com/questions/6392739/what-does-the-at-symbol-do-in-python

    Ce commentaire passe-t-il les trois tamis de Socrate ? -- https://linuxfr.org/suivi/autoriser-la-correction-limitee-de-commentaires-apres-les-5min

  • # décorateur

    Posté par  . Évalué à 2 (+0/-0). Dernière modification le 25/11/21 à 21:12.

    Il s'agit d'un décorateur. C'est un remplacement d'une fonction par une autre.

    L'exemple qui illustre :

    def replace_add_by_multiply(func):
        def multiply(x, y):
            return x*y
        return multiply
    
    @replace_add_by_multiply
    def add(a, y):
        return x+y
    
    
    print(add(3, 4)) # prints 12

    Par contre cet exemple apporte de la confusion et ne révèle pas l'utilité des décorateurs, ce qui est une autre question…

    • [^] # Re: décorateur

      Posté par  . Évalué à 3 (+1/-0). Dernière modification le 26/11/21 à 08:05.

      Par contre cet exemple apporte de la confusion et ne révèle pas l'utilité des décorateurs, ce qui est une autre question…

      Je confirme que l'exemple n'est pas très bon car au final il n'utilise pas la fonction décorée.

      Pour moi le décorateur est un "tag" que tu mets à une fonction. L'exemple de Flask est plus parlant :

      @app.route("/dlfp")
      def dlfp():
          return "DLFP RuL3z !"

      Flask définit le décorateur "route". Ainsi, quand tu crées une fonction et que tu la décores par une URL, cette fonction sera appelée par le moteur Flask lorsqu'un visiteur va sur cette URL.

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: décorateur

      Posté par  (site Web personnel) . Évalué à 5 (+3/-0). Dernière modification le 26/11/21 à 09:37.

      Plus formellement, un décorateur est une fonction recevant une fonction et retournant une fonction. Ça peut être la même.

      def décorateur(fn):
          fn.__décorée__ = True
          return fn
      
      
      @décorateur
      def mafn():
          pass
      
      assert fn.__décorée__

      On peut aussi décorer une classe.

      • [^] # Re: décorateur

        Posté par  . Évalué à 2 (+0/-0).

        N'importe quel objet, pas forcément une fonction.

        C'est aussi souvent une classe, par exemple.

        • [^] # Re: décorateur

          Posté par  . Évalué à 2 (+1/-0). Dernière modification le 27/11/21 à 09:16.

          Oui, on peut même en mettre plusieurs!
          @noel
          @clignote
          @sapin
          etc…

        • [^] # Re: décorateur

          Posté par  (site Web personnel) . Évalué à 2 (+0/-0).

          J'ai précisé qu'on peut décorer une classe. À quel autre objet pense-tu ?

          • [^] # Re: décorateur

            Posté par  . Évalué à 2 (+0/-0).

            Anéfé, j'avais pas vu la précision en bas et tiqué sur la formulation en haut.

            J'ai pas d'autre exemple courant. On doit pouvoir décorer une variable dans un module, un attribut dans une classe,… mais c'est pas quelque chose que je fais couramment.

    • [^] # Re: décorateur

      Posté par  . Évalué à 2 (+0/-0).

      Si ça peut aider à la compréhension, j'ajouterais que ces deux codes sont équivalents :

      @replace_add_by_multiply
      def add(a, y):
          return x+y

      et

      def add(a, y):
          return x+y
      
      add = replace_add_by_multiply(add)

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.