On Sat, May 23, 2009 at 2:03 AM, Rhodri James <rho...@wildebst.demon.co.uk>wrote:
> I asked you not to top-post. Please put your replies *below* the > messages you're quoting, not above. It's much easier to understand > the conversation that we're having if you do that, and much more > aggravating if you don't. > I misunderstand you last email, thanks. > > On Fri, 22 May 2009 09:53:04 +0100, Red Forks <redfo...@gmail.com> wrote: > > Yes, you maybe right. When use defaultdict, should not rely get() method >> anymore, d[] is just enough. >> > > Almost. You should rely on get() to do what it says, not what you think > it should do. That's generally true, by the way; when the Fine Manual > says that a class, function or method will do one thing, expecting it to > do something else is unreasonable. > > Actually, I steal defaultdict to do other things: >> >> class OnloadDict(defaultdict): >> def __init__(self, onload): >> self.__onload = onload >> >> def __missing__(self, key): >> result = self.__onload(key) >> if not result: >> raise KeyError >> >> self[key] = result >> return result >> >> def get(self, key, default = None): >> ''' defaultdict.get() won't call __missing__, so override ''' >> try: >> return self[key] >> except KeyError: >> return default >> >> OnloadDict, is like a cache. When the value is not in dict, using 'onload' >> function to load the value by the key. >> When no value correspond to a key, a KeyError will raised. So I need a >> *safer* version 'get()' method. >> > > Why are you so determined to (ab)use get() on your class? You should > only be calling OnloadDict.get() if you really mean "get me the value > associated with this key, or the default I'm telling you about *right* > *now* if there isn't one." The key point is: "what key/value pairs should in defaultdict". I think any key/default pair(they'll add to dict when you ask for it), maybe you think only manual added pairs. defaultdict break dict rules, that a query method (d[key]) should not modify dict, so another query method (the get() method) break default rule is not a big deal. Never mind, my "get()" method hack works OK. > > > Aside from that, this is neat. Strictly you should call > defaultdict.__init__(self) in your __init__() function just in case > defaultdict needs any setup that you aren't doing (which it does, but > you override __missing__() so it never notices that it doesn't have > a default_factory). You get away with it here, but it's not a good > habit to get into. > I'm new to python, adding 'defaultdict.__init__()' call would be nice. In other languages, base class's default constructor is automaticlly called. > > -- > Rhodri James *-* Wildebeeste Herder to the Masses > -- > http://mail.python.org/mailman/listinfo/python-list >
-- http://mail.python.org/mailman/listinfo/python-list