On Fri, Jul 31, 2020 at 08:08:58PM -0700, Guido van Rossum wrote:
The other simple solution is `next(iter(mydict.items()))`.
That one always makes me uncomfortable, because the StopIteration it raises when the dict is empty might be misinterpreted. Basically I never want to call next() unless there's a try...except StopIteration: around it, and that makes this a lot less simple.
Acknowledged. But there are ways to solve that which perhaps aren't as well known as they should be.
* Use a default: `next(iter(mydict.items()), MISSING)`
* Use a helper to convert StopIteration to something else.
Some years ago, someone (I think it was Nick Coghlan?) proposed a standard solution for this issue, a context manager + decorator function that guarded against a specific exception. Nothing much came of it, but I did experiment with the idea, and got something which you could use like this:
with exception_guard(StopIteration): first = next(iter(mydict.items()))
or like this:
safenext = exception_guard(StopIteration)(next) first = safenext(iter(mydict.items()))
I think that would be a good tool for the functools library, but I acknowledge that even if standard, it would be a little too obscure for most people thinking "I need the first key from this dict".