[Python-Dev] Re: A small proposed change to dictionaries' "get" method

Barry A. Warsaw bwarsaw@beopen.com
Thu, 3 Aug 2000 00:41:14 -0400 (EDT)

>>>>> "GM" == Gareth McCaughan <Gareth.McCaughan@pobox.com> 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

    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)
>>> d.put(word, []).append('gareth')
>>> d.get(word)
['world', 'gareth']

Shouldn't be too hard to add equivalent C code to the dictionary


-------------------- 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]