Re: Way for see if dict has a key



Paul McGuire wrote:


Another factor to consider is if "default" is not something simple like 0 or
None, but is an object constructed and initialized with some expensive
initialization code (like access to a database). In this case:

dict.get(key, ExpensiveObjectToCreate())

always creates the default value, and if the key does not exist, then
promptly drops it on the floor.

In such a case you'd be better off with one of the "check for existence"
patterns, which only creates the default value if you *know* you're going to
need it.

unless you're targeting 2.5 or later, in which case you can use the defaultdict class:

>>> import collections

>>> def ExpensiveObjectToCreate():
.... print "creating an expensive object"
.... return "expensive object"
....
>>> d = collections.defaultdict(ExpensiveObjectToCreate)
>>> d["key"]
creating an expensive object
'expensive object'
>>> d["key"]
'expensive object'

or, if you prefer, the new __missing__ hook:

>>> class mydict(dict):
.... def __missing__(self, key):
.... print "add new object base on", key
.... value = "new object"
.... self[key] = value
.... return value
....
>>> d = mydict()
>>> d["key"]
add new object base on key
'new object'
>>> d["key"]
'new object'

</F>

.