Ok... it's works! :)
So what do you think? Look at the last stacked example, it process the preprocess's first in forward order, then does the postprocess's in reverse order. Which might be usefull. Interesting in any case. Making decorators with this class is a snap! Any thoughts? Any improvements? Any bugs? Cheers, Ron_Adam #---start--- class Decorator(object): """ Decorator - A base class to make decorators with. self.function - the function decorated. self.arglist - list of arguments of decorator self.preprocess - over ride to preprocess function arguments. self.postprocess - over ride to postprocess function return value. Example use: class mydecorator(Decorate): def self.preprocess(self, args): # process args return args def self.postprocess(self, results): # process results return results deco = mydecorator() @deco def function(args): # function body return args """ def __init__(self): self.function = None self.arglist = [] def __call__(self, *arg): if len(arg) == 1: arg = arg[0] self.arglist.append(arg) def _wrapper(*args): pre_args = self.preprocess(*args) if type(pre_args) is not tuple: pre_args = (pre_args,) result = self.function(*pre_args) return self.postprocess(result) if '<function ' in str(arg): self.arglist = self.arglist[:-1] self.function = arg return _wrapper return self def preprocess(self, *args): # # Over ride this method. # return args def postprocess(self, result): # # Over ride this method. # return result #---1--- class decorator1(Decorator): def preprocess(self, arg): newarg = "" n = 0 darg = list(self.arglist[0]) for a in list(arg): newarg += a newarg += darg[n] n += 1 if n>=len(darg): n = 0 return newarg deco1 = decorator1() @deco1('_-^-') def test1(text): return text print test1('abcdefg') # a_b-c^d-e_f-g^ #---2--- class decorator2(Decorator): def postprocess(self, result): result = result*1.0*self.arglist[0][0]/self.arglist[0][1] return result deco2 = decorator2() @deco2(2,3) def test2(a): return a print test2(7) # 4.66666666667 #---3--- class decorator3(Decorator): def preprocess(self, arg1, arg2): arg1 *= 2 arg2 *= 2 return arg1, arg2 deco3 = decorator3() @deco3 def test3(a,b): return a,b print test3(1,3) # (2, 6) #---4--- class decorator4(Decorator): def postprocess(self, result): result = int(result/self.arglist[0]) return result deco4 = decorator4() @deco4(2) def test4(n1,n2,n3,n4,n5): return n1+n2+n3+n4+n5 print test4(1,2,3,4,5) # 7 #---5--- class decorator5(Decorator): def preprocess(self, arg): arg *= 2 print 'Preprocess:',self.arglist[0][0],arg return arg def postprocess(self, result): result *= 2 print 'Postprocess:',self.arglist[0][0],result return result deco5a = decorator5() deco5b = decorator5() deco5c = decorator5() deco5d = decorator5() deco5e = decorator5() @deco5a('a') @deco5b('b') @deco5c('c') @deco5d('d') @deco5e('e') def test5(i): return i print test5(10) # Preprocess: a 20 # Preprocess: b 40 # Preprocess: c 80 # Preprocess: d 160 # Preprocess: e 320 # Postprocess: e 640 # Postprocess: d 1280 # Postprocess: c 2560 # Postprocess: b 5120 # Postprocess: a 10240 # 10240 #---end--- -- http://mail.python.org/mailman/listinfo/python-list