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