I would think that you can use tuple unpacking for this?

    single_element, = some_iterator

Will attempt to unpack the some_iterator into single_element and fail if
single_element doesn't have exactly 1 element. It also has the added
benefit that it works for any number of elements:

one, two = some_iterator

Example:

>>> a = [1]
>>> one, = a
>>> one
1
>>> b = [1, 2]
>>> one, = b
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-9b70ee0300f5> in <module>
----> 1 one, = b

ValueError: too many values to unpack (expected 1)
>>> c = []
>>> one, = c
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-413c1b218942> in <module>
----> 1 one, = c

ValueError: not enough values to unpack (expected 1, got 0)

Best,
Paul

On 7/27/20 3:19 PM, Rollo Konig-Brock wrote:
> I second this as being useful.
>
> However the “pythonic” way (whatever that means nowadays) is to do a
> for break else loop, which I think is kinda difficult to read as you
> need to make a few assumptions.
>
> Rollo
>
>> On 27 Jul 2020, at 20:06, Noam Yorav-Raphael <noamr...@gmail.com> wrote:
>>
>> 
>> Hi,
>>
>> There's a simple function that I use many times, and I think may be a
>> good fit to be added to itertools. A function that gets an iterator,
>> and if it has exactly one element returns it, and otherwise raises an
>> exception. This is very useful for cases where I do some sort of
>> query that I expect to get exactly one result, and I want an
>> exception to be raised if I'm wrong. For example:
>>
>> jack = one(p for p in people if p.id <http://p.id> == '1234')
>>
>> sqlalchemy already has such a function for
>> queries: 
>> https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query.one
>>
>> This is my implementation:
>>
>> def one(iterable):
>>     it = iter(iterable)
>>     try:
>>         r = next(it)
>>     except StopIteration:
>>         raise ValueError("Iterator is empty")
>>     try:
>>         next(it)
>>     except StopIteration:
>>         return r
>>     else:
>>         raise ValueError("Iterator has more than one item")
>>
>> What do you think?
>>
>> Thanks,
>> Noam
>> _______________________________________________
>> Python-Dev mailing list -- python-dev@python.org
>> To unsubscribe send an email to python-dev-le...@python.org
>> https://mail.python.org/mailman3/lists/python-dev.python.org/
>> Message archived at
>> https://mail.python.org/archives/list/python-dev@python.org/message/D52MPKLIN4VEXBOCKVMTWAK66MAOEINY/
>> Code of Conduct: http://python.org/psf/codeofconduct/
>
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-le...@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at 
> https://mail.python.org/archives/list/python-dev@python.org/message/3NA4E3QCTSLGIQXAMVWUL66TK6O7ZHLS/
> Code of Conduct: http://python.org/psf/codeofconduct/

Attachment: signature.asc
Description: OpenPGP digital signature

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

Reply via email to