Aaron Brady <castiro...@gmail.com> wrote: > Here is how to get the function into the function as an argument, and > still permit recursive calls onto it. > >>>> def auto( f ): > ... def _inner( *ar, **kw ): > ... return f( g, *ar, **kw ) > ... g= _inner > ... return g > ... >>>> @auto > ... def f( self, n ): > ... print( self, n ) > ... return 1 if n== 1 else n* self( n- 1 ) > ... >>>> f(7) ><function _inner at 0x00BA0D68> 7 ><function _inner at 0x00BA0D68> 6 ><function _inner at 0x00BA0D68> 5 ><function _inner at 0x00BA0D68> 4 ><function _inner at 0x00BA0D68> 3 ><function _inner at 0x00BA0D68> 2 ><function _inner at 0x00BA0D68> 1 > 5040 >
It might be better to use some convention other than 'self' for the first argument otherwise it will cause confusion when writing recursive methods: >>> class C(object): @auto def meth(this, self, n): print this, self, n return 1 if n==1 else n*this(self, n-1) >>> inst = C() >>> inst.meth(5) <function _inner at 0x0000000003680198> <__main__.C object at 0x000000000366C4E0> 5 <function _inner at 0x0000000003680198> <__main__.C object at 0x000000000366C4E0> 4 <function _inner at 0x0000000003680198> <__main__.C object at 0x000000000366C4E0> 3 <function _inner at 0x0000000003680198> <__main__.C object at 0x000000000366C4E0> 2 <function _inner at 0x0000000003680198> <__main__.C object at 0x000000000366C4E0> 1 120 -- http://mail.python.org/mailman/listinfo/python-list