Согласно 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).
pytest-2.8.5
иasyncio-0.3.0
плагин, посмотрим, поможет ли обновление... - person jonrsharpe   schedule 25.06.2016pytest-2.9.2
иasyncio-0.4.1
- person jonrsharpe   schedule 25.06.2016async
, как показано ниже... - person jonrsharpe   schedule 25.06.2016pytest-asyncio
. ;). По крайней мере, это заставило вас смотреть на неправильный путь поиска версии. :) После установкиpytest-asyncio
могу воспроизвести вашу проблему и ваше решение. - person Mike Müller   schedule 26.06.2016