在Python你可以写一个发电机是可迭代的喜欢:异步生成器不是迭代器?
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) ...
当尝试使用异步迭代器,你得到的“内部收益率异步”的错误。 建议的解决方案是实现自己的发电机:
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)
你得到错误“‘async_generator’对象不是一个迭代器”
我认为,如果你要调用的东西一个Iterator其原因它具有完全相同的接口,这样我就可以写异步迭代器和对在很大程度上依赖于未来的框架使用()调用。 如果你需要重写整个代码,以便能够使用异步的任何新的Python的能力是毫无意义的。
我错过了什么吗?
谢谢!
你说每个生成器都是一个迭代器,并且适用于异步生成器。为什么Python抱怨'async_generator'不是一个迭代器呢? – fenceop
但是我怎么能'''.join([x x中的x异步])'而不是'''.join(x中的x异步xs)'?那只是'[]'对于async_generators有特殊的语法吗? –
在python 3.6中添加了异步解析的新语法([PEP 530](https://www.python.org/dev/peps/pep-0530/))。所以你可以编写'[x x async for xs]''。而'(x for x in xs)' - 是生成器表达式(另一个括号可以在作为函数参数传递时简单省略)。我想你不能用异步代码创建生成器对象。所以'(x在xs中的x异步)'是无效的语法。 –