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:
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:
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