Tim Chase wrote: > I've got some decorators that work fine as such: > > @dec1(args1) > @dec2(args2) > @dec3(args3) > def myfun(...): > pass > > However, I used that sequence quite a bit, so I figured I could do > something like > > dec_all = dec1(args1)(dec2(args2)(dec3(args3)))
With these shortcuts a = dec1(args1) b = dec2(args2) c = dec3(args3) to make it look less messy your first attempt is dec_all = a(b(c)) and the final decorated function will be a(b(c))(myfun) when it should be a(b(c(myfun))) i. e. instead of decorating myfun three times you are decorating the decorator c twice and then use the result of that decoration to decorate myfunc. Does that help? I have my doubts ;) > to consolidate the whole mess down to > > @dec_all > def myfun(...): > pass > > However, this yields different (test-breaking) results. Messing > around, I found that if I write it as > > dec_all = lambda fn: dec1(args1)(dec2(args2)(dec3(args3)(fn))) > > it works and passes all preexisting tests. > > What am I missing that would cause this difference in behavior? > > -tkc -- https://mail.python.org/mailman/listinfo/python-list