IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Doublement des décorateurs


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Doublement des décorateurs
    Bonjour,

    je voudrais pourvoir doubler les décorateurs d'une fonction.
    Pour cela, j'utilise un "class" décorateur de base, inspiré d'un snippet, car je ne suis pas des plus à l'aise avec le module functools

    ma classe de décoration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    import functools
     
    class decorate(object):
        def __init__(self, *args, **kwargs):
            self.initprocess(*args, **kwargs)
     
        def __call__(self, func):
            self.initwrap(func)
            def wrapper(*args, **kwargs):
                args, kwargs = self.preprocess(*args, **kwargs)
                result = func(args, kwargs)
                result = self.postprocess(result, *args, **kwargs)
                return result
            return functools.wraps(func)(wrapper)
     
     
        def initprocess(self, *args, **kwargs):
            """ 
                initialisation du decorateur
                recoit les parametres du decorateur
            """
     
     
        def initwrap(self, func):
            """
                wrapping de la fonction
                recoit la fonction envelloper
            """
     
        def preprocess(self,*args, **kwargs):
            """
                Avant l'appel a la fonction reel
                recoit les parametres de la fonction
            """
            return (args, kwargs)
     
        def postprocess(self, result, *args, **kwargs):
            """
                Apres l'appel a la fonction reel
                recoit les parametres de la fonction
            """
            return result
    un exemple d'implementation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    class premier(decorate):
        def initprocess(self, init_arg1, init_arg2):
            print "premier", init_arg1, init_arg2
     
     
     
    class second(decorate):
        def initprocess(self, init_arg1):
            print "second", init_arg1
     
     
    @premier("premier1", "premier2")
    @second("second1")
    def test(func_arg1, func_arg2, func_arg3 ):
        print "test",  func_arg1, func_arg2, func_arg3
     
    test("test1","test2","test3")
    je me retrouve avec l'erreur suivante :
    TypeError: test() takes exactly 3 arguments (2 given)

    est ce que quelqu'un peut m'expliquer mon erreur ?

    merci de vos lumières


    Kermit

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    Je n'ai pas testé.
    Logiquement le soucis vient de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            def wrapper(*args, **kwargs):
                args, kwargs = self.preprocess(*args, **kwargs)
                result = func(args, kwargs)
                result = self.postprocess(result, *args, **kwargs)
                return result
    écrit comme çà test/func est appelée avec 2 arguments, il faudrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = func(*args, **kwargs)
    pour que l'interpréteur "caste" les arguments récupérés sur ceux attendus par la fonction.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Salut wiztricks,

    tu as pas testé ??? tu abuse ......

    merci pour ta réponse , cela fonctionne nickel

    Kermit

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    le source avec la correction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    import functools
     
    class decorate(object):
        def __init__(self, *args, **kwargs):
            self.initprocess(*args, **kwargs)
     
        def __call__(self, func):
            self.initwrap(func)
            def wrapper(*args, **kwargs):
                args, kwargs = self.preprocess(*args, **kwargs)
                result = func(*args, **kwargs)
                result = self.postprocess(result, *args, **kwargs)
                return result
            return functools.wraps(func)(wrapper)
     
     
        def initprocess(self, *args, **kwargs):
            """ 
                initialisation du decorateur
                recoit les parametres du decorateur
            """
     
     
        def initwrap(self, func):
            """
                wrapping de la fonction
                recoit la fonction envelloper
            """
     
        def preprocess(self,*args, **kwargs):
            """
                Avant l'appel a la fonction reel
                recoit les parametres de la fonction
            """
            return (args, kwargs)
     
        def postprocess(self, result, *args, **kwargs):
            """
                Apres l'appel a la fonction reel
                recoit les parametres de la fonction
            """
            return result

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par 3DKermit Voir le message
    tu as pas testé ??? tu abuse ......
    Absolument!
    Mais vous aviez bien documenté le code et ce que vous attendiez.
    De plus, l'erreur remontée était cohérente avec le code proposé.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilité des décorateurs en JAVA
    Par specsy dans le forum Général Java
    Réponses: 5
    Dernier message: 15/04/2008, 17h32
  2. [X3][CR10] Doublement des lignes à l'impression
    Par Aitone dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 05/12/2007, 15h27
  3. [Décorateur] Desassembler des Décorateurs
    Par NiamorH dans le forum Design Patterns
    Réponses: 3
    Dernier message: 28/10/2007, 09h29
  4. Doublement des slash
    Par ducker88 dans le forum C#
    Réponses: 2
    Dernier message: 26/03/2007, 13h35
  5. [RegEx] Doublement des \n après str_replace() des <br> dans un textarea
    Par psychoBob dans le forum Langage
    Réponses: 11
    Dernier message: 11/06/2006, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo