1.4 Getting a Value from a Dictionary


Credit: Andy McKay

1.4.1 Problem

You need to obtain a value from a dictionary, without having to handle an exception if the key you seek is not in the dictionary.

1.4.2 Solution

That's what the get method of dictionaries is for. Say you have a dictionary:

d = {'key':'value'}

You can write a test to pull out the value of 'key' from d in an exception-safe way:

if d.has_key('key'):      # or, in Python 2.2 or later: if 'key' in d:   print d['key'] else:   print 'not found'

However, there is a much simpler syntax:

print d.get('key', 'not found')

1.4.3 Discussion

Want to get a value from a dictionary but first make sure that the value exists in the dictionary? Use the simple and useful get method.

If you try to get a value with a syntax such as d[x], and the value of x is not a key in dictionary d, your attempt raises a KeyError exception. This is often okay. If you expected the value of x to be a key in d, an exception is just the right way to inform you that you're wrong (i.e., that you need to debug your program).

However, you often need to be more tentative about it: as far as you know, the value of x may or may not be a key in d. In this case, don't start messing with the has_key method or with try/except statements. Instead, use the get method. If you call d.get(x), no exception is thrown: you get d[x] if x is a key in d, and if it's not, you get None (which you can check for or propagate). If None is not what you want to get when x is not a key of d, call d.get(x, somethingelse) instead. In this case, if x is not a key, you will get the value of somethingelse.

get is a simple, useful mechanism that is well explained in the Python documentation, but a surprising number of people don't know about it. This idiom is also quite common in Zope, for example, when pulling variables out of the REQUEST dictionary.

1.4.4 See Also

The Library Reference section on mapping types.



Python Cookbook
Python Cookbook
ISBN: 0596007973
EAN: 2147483647
Year: 2005
Pages: 346

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net