Pythonic way for missing dict keys

Bruno Desthuilliers bdesth.quelquechose at free.quelquepart.fr
Thu Jul 19 00:29:59 EDT 2007


Alex Popescu a écrit :
> Hi all!
> 
> I am pretty sure this has been asked a couple of times, but I don't seem 
> to find it on the archives (Google seems to have a couple of problems 
> lately).
> 
> I am wondering what is the most pythonic way of dealing with missing 
> keys and default values.
> 
> According to my readings one can take the following approaches:
> 
> 1/ check before (this has a specific name and acronym that I haven't 
> learnt yet by heart)
> 
> if not my_dict.has_key(key):
>   my_obj = myobject()
>   my_dict[key] = my_obj
> else:
>   my_obj = my_dict[key]

if key not in my_dict:
   my_obj = my_dict[key] = myobject()
else:
   my_obj = my_dict[key]

> 2/ try and react on error (this has also a specific name, but...)
> 
> try:
>   my_obj = my_dict[key]
> except AttributeError:
>   my_obj = myobject()
>   my_dict[key] = my_obj

cf above for a shortcut...

> 3/ dict.get usage:
> 
> my_obj = my_dict.get(key, myobject())

Note that this last one won't have the same result, since it won't store 
my_obj under my_dict[key]. You'd have to use dict.setdefault :

my_obj = my_dict.setdefault(key, myobject())

> I am wondering which one is the most recommended way?

It depends on the context. wrt/ 1 and 2, use 1 if you expect that most 
of the time, my_dict[key] will not be set, and 2 if you expect that most 
of the time, my_dict[key] will be set.

> get usage seems 
> the clearest, but the only problem I see is that I think myobject() is 
> evaluated at call time,

Myobject will be instanciated each time, yes.

> and so if the initialization is expensive you 
> will probably see surprises.

No "surprise" here, but it can indeed be suboptimal if instanciating 
myobject is costly.



More information about the Python-list mailing list