using "private" parameters as static storage?

Chris Mellon arkanes at gmail.com
Thu Nov 13 12:19:30 EST 2008


On Thu, Nov 13, 2008 at 11:16 AM, Joe Strout <joe at strout.net> wrote:
> One thing I miss as I move from REALbasic to Python is the ability to have
> static storage within a method -- i.e. storage that is persistent between
> calls, but not visible outside the method.  I frequently use this for such
> things as caching, or for keeping track of how many objects a factory
> function has created, and so on.
>
> Today it occurred to me to use a mutable object as the default value of a
> parameter.  A simple example:
>
> def spam(_count=[0]):
>     _count[0] += 1
>     return "spam " * _count[0]
>
>>>> spam()
> 'spam '
>>>> spam()
> 'spam spam '
>
> This appears to work fine, but it feels a little unclean, having stuff in
> the method signature that is only meant for internal use.  Naming the
> parameter with an underscore "_count" makes me feel a little better about
> it.  But then, adding something to the module namespace just for use by one
> function seems unclean too.
>
> What are your opinions on this idiom?  Is there another solution people
> generally prefer?
>
> Ooh, for a change I had another thought BEFORE hitting Send rather than
> after.  Here's another trick:
>
> def spam2():
>     if not hasattr(spam2,'count'):spam2.count=0
>     spam2.count += 1
>     return "spam2 " * spam2.count
>
> This doesn't expose any uncleanliness outside the function at all.  The
> drawback is that the name of the function has to appear several times within
> itself, so if I rename the function, I have to remember to change those
> references too.  But then, if I renamed a function, I'd have to change all
> the callers anyway.  So maybe this is better.  What do y'all think?
>

Static storage is a way of preserving state. Objects are a way of
encapsulating state and behavior. Use an object.



More information about the Python-list mailing list