static variables in Python?

castironpi castironpi at gmail.com
Wed Jul 30 05:28:48 CEST 2008


On Jul 29, 8:38 pm, pigmartian <scottp... at comcast.net> wrote:
> bearophileH... at lycos.com 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( )



More information about the Python-list mailing list