Loader: clean up callback awaiter code via Python 3.6+ syntax

This commit is contained in:
rdb 2021-02-07 17:00:42 +01:00
parent a64dcd7c5d
commit 7b5280c0dd

View File

@ -31,42 +31,6 @@ class Loader(DirectObject):
# This indicates that this class behaves like a Future.
_asyncio_future_blocking = False
class _ResultAwaiter(object):
"""Reinvents generators because of PEP 479, sigh. See #513."""
__slots__ = 'requestList', 'index'
def __init__(self, requestList):
self.requestList = requestList
self.index = 0
def __await__(self):
return self
def __anext__(self):
if self.index >= len(self.requestList):
raise StopAsyncIteration
return self
def __iter__(self):
return self
def __next__(self):
i = self.index
request = self.requestList[i]
if not request.done():
return request
self.index = i + 1
result = request.result()
if isinstance(result, PandaNode):
result = NodePath(result)
exc = StopIteration(result)
exc.value = result
raise exc
def __init__(self, loader, numObjects, gotList, callback, extraArgs):
self._loader = loader
self.objects = [None] * numObjects
@ -124,13 +88,15 @@ class Loader(DirectObject):
if self.requests:
self._asyncio_future_blocking = True
while self.requests:
yield self
if self.gotList:
return self._ResultAwaiter([self])
return self.objects
else:
return self._ResultAwaiter(self.requestList)
return self.objects[0]
def __aiter__(self):
async def __aiter__(self):
""" This allows using `async for` to iterate asynchronously over
the results of this class. It does guarantee to return the
results in order, though, even though they may not be loaded in
@ -138,7 +104,8 @@ class Loader(DirectObject):
requestList = self.requestList
assert requestList is not None, "Request was cancelled."
return self._ResultAwaiter(requestList)
for req in requestList:
yield await req
# special methods
def __init__(self, base):