Реализация асинхронного итератораPython

Программы на Python
Ответить
Anonymous
 Реализация асинхронного итератора

Сообщение Anonymous »

В соответствии с 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).

Подробнее здесь: https://stackoverflow.com/questions/380 ... s-iterator
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»