dict.get(key, default) evaluates default even if key exists

Dan Stromberg drsalists at gmail.com
Tue Dec 15 13:52:42 EST 2020


On Tue, Dec 15, 2020 at 9:57 AM Mark Polesky via Python-list <
python-list at python.org> wrote:

> Hi.
>
> # Running this script....
>
> D = {'a':1}
> def get_default():
>     print('Nobody expects this')
>     return 0
> print(D.get('a', get_default()))
>
> # ...generates this output:
>
> Nobody expects this
> 1
>
> ###
>
> Since I'm brand new to this community, I thought I'd ask here first... Is
> this worthy of a bug report?  This behavior is definitely unexpected to me,
> and I accidentally coded an endless loop in a mutual recursion situation
> because of it.  Calling dict.get.__doc__ only gives this short sentence:
> Return the value for key if key is in the dictionary, else default.
> Nothing in that docstring suggests that the default value is evaluated even
> if the key exists, and I can't think of any good reason to do so.
>

Python isn't a lazy language.  It's evaluating get_default()
unconditionally, prior to executing the D.get().  I don't think it's a
Python bug.

BTW, I tend to prefer collections.defaultdict over the two argument D.get
or setdefault.


More information about the Python-list mailing list