On 2020-12-16 at 12:01:01 +1300, dn via Python-list <python-list@python.org> wrote:
> > On Tue, Dec 15, 2020 at 9:57 AM Mark Polesky via Python-list < > > python-list@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. > > > Hey this is fun! A quick search reveals that I've (mea culpa) always thought > of dict.get() as providing a default *value* and not used a function in > there to provide said value. > > That said, the function's name says it all: get_default(). Is it 'getting' a > default value? No, it's (also) reporting-back. Thus a "side-effect". > Undesirable, as you say. > > Were it appropriate to report that a default value was necessary, maybe > something like: > > try: > print( d[ 'a' ] ) > except KeyError: > print( "Nobody expects this" ) > d[ 'a' ] = 0 Be careful: that mutates d in the except clause, whereas calling d.get('a', 0) doesn't, which may or may not be okay. -- https://mail.python.org/mailman/listinfo/python-list