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