using "private" parameters as static storage?
Joe Strout
joe at strout.net
Fri Nov 14 13:08:44 EST 2008
On Nov 13, 2008, at 8:26 PM, Steven D'Aprano wrote:
>> def spam(_count=[0]):
>> _count[0] += 1
>> return "spam " * _count[0]
>
> This is a common trick, often used for things like caching. One major
> advantage is that you are exposing the cache as an *optional* part
> of the
> interface, which makes testing easier. For example, instead of a test
> that looks something like this:
>
> cache = get_access_to_secret_cache() # somehow
> modify(cache)
> result = function(arg)
> restore(cache)
> assert something_about(result)
>
> you can simple do this:
>
> result = function(arg, _cache=mycache)
> assert something_about(result)
That's a very good point. I'd been working under the assumption that
any outside mucking with the cache was a Bad Thing, but for testing,
it can be darned helpful. And this is a very safe form of mucking; it
doesn't actually affect the "real" cache at all, but just substitutes
a temporary one.
Thanks also for pointing out that this is a common trick -- after all
the attacks on the very idea last night, I was wondering if I were off
alone in the woods again.
>> 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've used this myself, but to me it feels more icky than the semi-
> private
> argument trick above.
Thanks for the feedback.
Best,
- Joe
More information about the Python-list
mailing list