Per PEP-492 Próbuję zaimplementować asynchroniczny iterator, taki że mogę zrobić np.Implementacja asynchronicznego iteratora
async for foo in bar:
...
Tutaj jest trywialny przykład, podobny do tego w docs, z bardzo podstawowego testu instancji i asynchronicznym iteracji:
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
Jednak, kiedy wykonać mój testowy pakiet, widzę :
=================================== 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 ======================
Dlaczego mój TestImplementation
wydaje się być nieważny? O ile mogę powiedzieć, że spotyka się z protokołem:
- Obiekt musi implementować metodę
__aiter__
... powrocie asynchroniczny obiekt iteratora.- Obiekt asynchronicznego iteratora musi implementować metodę
__anext__
... zwracając wartość oczekiwaną.- Aby zatrzymać iterację,
__anext__
musi podnieść wyjątekStopAsyncIteration
.
ta zawodzi z najnowszych wydanych wersji Pythona (3.5.1), py.test
(2.9.2) i pytest-asyncio
(0.4.1).
Po blisko 3 latach w końcu [zadać pytanie] (http://stackoverflow.com/users/3001761/jonrsharpe?tab=questions). Kudos –
@BhargavRao Miałem ochotę 2,076: 1 było o prawo; o) – jonrsharpe
Działa dla mnie z pytest 2.9.2. Jakiej wersji używasz? –