お客様can'tコルーチン内での収量を使用します。あなたのアイデアを実装するには、私が見る方法はAsynchronous Iteratorを実装することだけです。私が正しいとすれば、そのようなもの:
class MapFilter:
def __init__(self, aiterable, p, func):
self.aiterable = aiterable
self.p = p
self.func = func
async def __aiter__(self):
return self
async def __anext__(self):
while True:
payload = await self.aiterable.__anext__() # StopAsyncIteration would be raise here on no new values
if self.p(payload):
return self.func(payload)
それを試してみましょう。ここでは(私はhereからそれを取った)ヘルパーarange
クラスで完全な例です:
import asyncio
class arange:
def __init__(self, n):
self.n = n
self.i = 0
async def __aiter__(self):
return self
async def __anext__(self):
i = self.i
self.i += 1
if self.i <= self.n:
await asyncio.sleep(0) # insert yield point
return i
else:
raise StopAsyncIteration
class MapFilter:
def __init__(self, aiterable, p, func):
self.aiterable = aiterable
self.p = p
self.func = func
async def __aiter__(self):
return self
async def __anext__(self):
while True:
payload = await self.aiterable.__anext__()
if self.p(payload):
return self.func(payload)
async def main():
aiterable = arange(5)
p = lambda x: bool(x>2)
func = lambda x: x*2
async for i in MapFilter(aiterable, p, func):
print(i)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
出力:
6
8
https://pypi.python.org/pypi/paralleltools/0.0.3? – jonrsharpe
@jonrsharpeこのlibはスレッドに関するasyncioではありません。 –
内部の非同期関数を生成する方法を実装しようとしました:http://stackoverflow.com/a/37572657/1113207 –