在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異步)'是無效的語法。 –