In Python you can write a generator that is iterable like:
def generate(count):
for x in range(count):
yield x
# as an iterator you can apply the function next() to get the values.
it = generate(10)
r0 = next(it)
r1 = next(it) ...
When trying to use an async iterator, you get the 'yield inside async' error. The suggested solution is to implement your own generator:
class async_generator:
def __aiter__(self):
return self
async def __anext__(self):
await asyncio.sleep()
return random.randint(0, 10)
# But when you try to get the next element
it = async_generator(10)
r0 = next(it)
You get the error "'async_generator' object is not an iterator"
I think that if you are going to call something an Iterator its because it has exactly the same interface, so I can just write async iterators and use on a framework that relies heavily on next() calls. Any new Python capability is pointless if you need to rewrite your entire code to be able to use async.
Am I missing something?
Thanks!
I believe a new statement was introduced for async generators:
according to PEP 492.
Basically, this would mean you should do:
Also, check the Differences from generators:
I used this to async loop through a list
then simply:
So, as @bosnjak said, you can use async for:
But if you want to iterate manually, you can simply write:
But I wouldn't recommend to do that.
No, acutally it's not the same. There is a difference between regular synchronous iterators and asynchronous ones. And there few reasons for that:
That's why it's impossible to use
iter
andnext
with asynchronous iterators. And you cannot use them with frameworks that expects synchronous iterators. So if you are going to make your code asynchronous, you have to use asynchronous frameworks as well. Here are few of them.Also, I would like to say a few words about iterators and generators. Iterator is a special object that has
__iter__
and__next__
methods. Whereas generator is a special function containingyield
expression. Every generator is an iterator, but not vice versa. The same thing is acceptable to asynchronous iterators and generators. Yes, since python 3.6 you are able to write asynchronous generators!You can read PEP 525 for more details