On Thu, Oct 21, 2021 at 10:49:35AM +0200, Baptiste Carvello wrote:
> > Versions of this that rely on catching AttributeError are simply wrong
> > and are an anti-pattern. They catch too much and silently turn
> > errors into silent wrong behaviour.
> >
> > PEP 505 does not fall into that trap.
>
> This is not true as a general rule: the PEP 505 examples with
> `dict.get()` do catch too much.
The problem there is not the None-aware operators, but the use of
dict.get. That's a good reason to re-think None-aware subscripting.
dict?['key']
will still raise if you mistype the key, while dict.get does not.
Even if we limit ourselves to dict.get:
return obj?.get('spam')?.get('eggs')
doesn't protect against mispellings of the keys, *due to dict.get*, but
it does protect against mispelling "get" (unlikely). More importantly it
also protects against type errors:
obj['spam'] = {'eggs', value} # oops, a set, not a dict
or equivalent. (I don't mean to limit this to just typos.)
Now if we write:
obj?.get('spam')?.get('eggs')
the first attribute lookup will return a set and the second will fail
because sets don't have a get method.
Where as if we use exceptions:
try:
obj['spam]['eggs']
except (TypeError, KeyError):
return None
the error is silently suppressed and we get None when we should get a
TypeError.
--
Steve
_______________________________________________
Python-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/WYEIZ3IC6P6KN4L2MROV4SBCZ5XOQUV6/
Code of Conduct: http://python.org/psf/codeofconduct/