Per PEP-492 Я пытаюсь реализовать асинхронный итератор, чтобы я мог делать, например.
async for foo in bar:
...
Вот тривиальный пример, похожий на тот, что содержится в документах, с очень простым тестом на создание экземпляра и асинхронную итерацию:
import pytest
class TestImplementation:
def __aiter__(self):
return self
async def __anext__(self):
raise StopAsyncIteration
@pytest.mark.asyncio # note use of pytest-asyncio marker
async def test_async_for():
async for _ in TestImplementation():
pass
Однако, когда я выполняю свой тестовый набор, я вижу:
=================================== FAILURES ===================================
________________________________ test_async_for ________________________________
@pytest.mark.asyncio
async def test_async_for():
> async for _ in TestImplementation():
E TypeError: 'async for' received an invalid object from __aiter__: TestImplementation
...: TypeError
===================== 1 failed, ... passed in 2.89 seconds ======================
Почему мой TestImplementation
окажется недействительным? Насколько я могу судить, он отвечает протоколу:
- Объект должен реализовать метод
__aiter__
... возвращающий асинхронный объект итератора.- Асинхронный объект-итератор должен реализовать метод
__anext__
... возвращающий ожидаемый.- Для остановки итерации
__anext__
необходимо создать исключениеStopAsyncIteration
.
Это не работает с последними выпущенными версиями Python (3.5.1), py.test
(2.9.2) и pytest-asyncio
(0.4.1).