Credit: Andy McKay
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.
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')
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.