Cannot step through asynchronous iterator manually
Chris Angelico
rosuav at gmail.com
Sat Jan 30 03:27:59 EST 2016
On Sat, Jan 30, 2016 at 7:22 PM, Frank Millman <frank at chagford.com> wrote:
> We had a recent discussion about the best way to do this, and ChrisA
> suggested the following, which I liked -
>
> cur.execute('SELECT ...)
> try:
> row = next(cur)
> except StopIteration:
> # row does not exist
> else:
> try:
> next_row = next(cur)
> except StopIteration:
> # row does exist
> else:
> # raise exception
>
> Now that I have gone async, I want to do the same with an asynchronous
> iterator.
Here's a crazy option. (Assuming that a row can't be None. If not, use
a unique sentinel object.)
cur.execute(whatever)
have_row = None
async for row in cur:
if have_row is not None:
raise TooManyRows
have_row = row
if have_row is None:
raise NoRowFound
It's kinda abusing the loop construct, but it'd work. Alternatively,
you could call the dunder method directly, but that feels dirty.
Dunders are for defining, not calling.
ChrisA
More information about the Python-list
mailing list