我正在学习 Python 相对较新的异步功能。我发现这个在PEP 492 https://www.python.org/dev/peps/pep-0492/#example-2:
以下是一个实用程序类,它将常规迭代转换为
异步的。虽然这不是一件非常有用的事情,
代码说明了正则和异步的关系
迭代器。
class AsyncIteratorWrapper:
def __init__(self, obj):
self._it = iter(obj)
def __aiter__(self):
return self
async def __anext__(self):
try:
value = next(self._it)
except StopIteration:
raise StopAsyncIteration
return value
async for letter in AsyncIteratorWrapper("abc"):
print(letter)
我尝试通过添加给定的来运行此代码async for
循环到一个函数,然后使用事件循环调用该函数。
完整示例代码(在解释器中运行):
class AsyncIteratorWrapper:
def __init__(self, obj):
self._it = iter(obj)
def __aiter__(self):
return self
async def __anext__(self):
try:
value = next(self._it)
except StopIteration:
raise StopAsyncIteration
return value
async def aprint(str):
async for letter in AsyncIteratorWrapper(str):
print(letter)
import asyncio
loop = asyncio.get_event_loop()
co = aprint("abcde")
loop.run_until_complete(co)
但是,我收到错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/rh/rh-python35/root/usr/lib64/python3.5/asyncio/base_events.py", line 337, in run_until_complete
return future.result()
File "/opt/rh/rh-python35/root/usr/lib64/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/opt/rh/rh-python35/root/usr/lib64/python3.5/asyncio/tasks.py", line 239, in _step
result = coro.send(None)
File "<stdin>", line 2, in aprint
TypeError: 'async for' received an invalid object from __aiter__: AsyncIteratorWrapper
我究竟做错了什么?如何修复这个例子?我有点惊讶 PEP 中的代码竟然失败了。
我正在使用 python 版本 3.5.1。