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

Loris Bennett loris.bennett at fu-berlin.de
Wed Dec 16 02:59:02 EST 2020


Serhiy Storchaka <storchaka at gmail.com> writes:

> 15.12.20 19:07, Mark Polesky via Python-list пише:
>> # 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.
>> 
>> Am I missing something?
>
> You are missed that expressions for function arguments are always
> evaluated before passing their values to a function. This is expected
> behavior, and I can't remember any programming language in which it's
> different.
>
> So dict.get() returns the value of argument default, which is computed
> by calling function get_default() before calling dict.get().

Isn't the second argument to D.get() the value to be return if the first
argument is not a valid key?  In that case, why does it make any
difference here what the second argument of D.get() is since the key 'a'
does exist?

Thus, I would indeed expect the code above to print '1'.  I am obviously
missing something here.

Cheers,

Loris

-- 
This signature is currently under construction.


More information about the Python-list mailing list