using "private" parameters as static storage?

Steve Holden steve at holdenweb.com
Thu Nov 13 13:35:21 EST 2008


Joe Strout 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.
> 
This is a pretty bizarre requirement, IMHO. The normal place to keep
such information is either class variables or instance variables.

> 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.
> 
It's a bad smell.

> 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?
> 
I think you'd be much better off creating an instance of a class and
using that.

regards
 Steve
-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC              http://www.holdenweb.com/




More information about the Python-list mailing list