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

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to