[Python-Dev] Re: A small proposed change to dictionaries' "get" method
Barry A. Warsaw
[email protected]
Thu, 3 Aug 2000 00:41:14 -0400 (EDT)
>>>>> "GM" == Gareth McCaughan <[email protected]> writes:
GM> Consider the following piece of code, which takes a file
GM> and prepares a concordance saying on which lines each word
GM> in the file appears. (For real use it would need to be
GM> made more sophisticated.)
| line_number = 0
| for line in open(filename).readlines():
| line_number = line_number+1
| for word in map(string.lower, string.split(line)):
| existing_lines = word2lines.get(word, []) |
| existing_lines.append(line_number) | ugh!
| word2lines[word] = existing_lines |
I've run into this same situation many times myself. I agree it's
annoying. Annoying enough to warrant a change? Maybe -- I'm not
sure.
GM> I suggest a minor change: another optional argument to
GM> "get" so that
GM> dict.get(item,default,flag)
Good idea, not so good solution. Let's make it more explicit by
adding a new method instead of a flag. I'll use `put' here since this
seems (in a sense) opposite of get() and my sleep addled brain can't
think of anything more clever. Let's not argue about the name of this
method though -- if Guido likes the extension, he'll pick a good name
and I go on record as agreeing with his name choice, just to avoid a
protracted war.
A trivial patch to UserDict (see below) will let you play with this.
>>> d = UserDict()
>>> word = 'hello'
>>> d.get(word, [])
[]
>>> d.put(word, []).append('world')
>>> d.get(word)
['world']
>>> d.put(word, []).append('gareth')
>>> d.get(word)
['world', 'gareth']
Shouldn't be too hard to add equivalent C code to the dictionary
object.
-Barry
-------------------- snip snip --------------------
Index: UserDict.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/UserDict.py,v
retrieving revision 1.7
diff -u -r1.7 UserDict.py
--- UserDict.py 2000/02/02 15:10:14 1.7
+++ UserDict.py 2000/08/03 04:35:11
@@ -34,3 +34,7 @@
self.data[k] = v
def get(self, key, failobj=None):
return self.data.get(key, failobj)
+ def put(self, key, failobj=None):
+ if not self.data.has_key(key):
+ self.data[key] = failobj
+ return self.data[key]