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".



-- 
Steven
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/7HUGB5JJIJS6JCQBU4GM4X7BPYYNPRC3/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to