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 == '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
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 == '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