On Jul 29, 8:38 pm, pigmartian <[EMAIL PROTECTED]> wrote: > [EMAIL PROTECTED] wrote: > > kj: > >> OK, I guess that in Python the only way to do what I want to do > >> is with objects... > > > There are other ways, like assigning the value out of the function, > > because Python functions too are objects: > > ... > > But I suggest you to use a class in this situation, it's often the way > > that will keep your code more bug-free, and more readable by near- > > casual readers too. Python philosophy asks you to write readable code > > instead of clever code when possible, this is a difference from Perl, > > I presume. > > > Bye, > > bearophile > > Here's a solution using decorators, I like it, but I'm biased: > > def staticAttrs(**kwds): > """ > Adds attributes to a function, akin to c-style > "static" variables > """ > > def _decorator(fcn): > for k in kwds: > setattr(fcn, k, kwds[k]) > return fcn > return _decorator > > @staticAttrs(n=0) > def rememberCalls(): > """ > >>> rememberCalls() > 0 > >>> rememberCalls() > 1 > >>> rememberCalls() > 2 > """ > print rememberCalls.n > rememberCalls.n += 1 > > ~Scott
I like it too. It also thought of (implementation not shown): @has_locals def rememberCalls( self ): self.val= 0 self.ref= object( ) where self is preserved between calls and is an instance of a custom class, possibly empty. If you want more than one, but still preserved: rememberCallsA= has_locals( rememberCalls ) rememberCallsB= has_locals( rememberCalls ) You might want to make self a small and lightweight dict-only object: @has_locals def rememberCalls( dic ): dic['val']= 0 dic['ref']= object( ) -- http://mail.python.org/mailman/listinfo/python-list