Add Awaitable, AsyncIterable, AsyncIterator to typing.py. (Merge 3.5->3.6)
This commit is contained in:
commit
ce2650fda4
|
@ -1,3 +1,4 @@
|
||||||
|
import asyncio
|
||||||
import pickle
|
import pickle
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
@ -960,6 +961,36 @@ class OverloadTests(TestCase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
T_a = TypeVar('T')
|
||||||
|
|
||||||
|
|
||||||
|
class AwaitableWrapper(typing.Awaitable[T_a]):
|
||||||
|
|
||||||
|
def __init__(self, value):
|
||||||
|
self.value = value
|
||||||
|
|
||||||
|
def __await__(self) -> typing.Iterator[T_a]:
|
||||||
|
yield
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncIteratorWrapper(typing.AsyncIterator[T_a]):
|
||||||
|
|
||||||
|
def __init__(self, value: typing.Iterable[T_a]):
|
||||||
|
self.value = value
|
||||||
|
|
||||||
|
def __aiter__(self) -> typing.AsyncIterator[T_a]:
|
||||||
|
return self
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def __anext__(self) -> T_a:
|
||||||
|
data = yield from self.value
|
||||||
|
if data:
|
||||||
|
return data
|
||||||
|
else:
|
||||||
|
raise StopAsyncIteration
|
||||||
|
|
||||||
|
|
||||||
class CollectionsAbcTests(TestCase):
|
class CollectionsAbcTests(TestCase):
|
||||||
|
|
||||||
def test_hashable(self):
|
def test_hashable(self):
|
||||||
|
@ -984,6 +1015,36 @@ class CollectionsAbcTests(TestCase):
|
||||||
assert isinstance(it, typing.Iterator[int])
|
assert isinstance(it, typing.Iterator[int])
|
||||||
assert not isinstance(42, typing.Iterator)
|
assert not isinstance(42, typing.Iterator)
|
||||||
|
|
||||||
|
def test_awaitable(self):
|
||||||
|
async def foo() -> typing.Awaitable[int]:
|
||||||
|
return await AwaitableWrapper(42)
|
||||||
|
g = foo()
|
||||||
|
assert issubclass(type(g), typing.Awaitable[int])
|
||||||
|
assert isinstance(g, typing.Awaitable)
|
||||||
|
assert not isinstance(foo, typing.Awaitable)
|
||||||
|
assert issubclass(typing.Awaitable[Manager],
|
||||||
|
typing.Awaitable[Employee])
|
||||||
|
assert not issubclass(typing.Awaitable[Employee],
|
||||||
|
typing.Awaitable[Manager])
|
||||||
|
g.send(None) # Run foo() till completion, to avoid warning.
|
||||||
|
|
||||||
|
def test_async_iterable(self):
|
||||||
|
base_it = range(10) # type: Iterator[int]
|
||||||
|
it = AsyncIteratorWrapper(base_it)
|
||||||
|
assert isinstance(it, typing.AsyncIterable)
|
||||||
|
assert isinstance(it, typing.AsyncIterable)
|
||||||
|
assert issubclass(typing.AsyncIterable[Manager],
|
||||||
|
typing.AsyncIterable[Employee])
|
||||||
|
assert not isinstance(42, typing.AsyncIterable)
|
||||||
|
|
||||||
|
def test_async_iterator(self):
|
||||||
|
base_it = range(10) # type: Iterator[int]
|
||||||
|
it = AsyncIteratorWrapper(base_it)
|
||||||
|
assert isinstance(it, typing.AsyncIterator)
|
||||||
|
assert issubclass(typing.AsyncIterator[Manager],
|
||||||
|
typing.AsyncIterator[Employee])
|
||||||
|
assert not isinstance(42, typing.AsyncIterator)
|
||||||
|
|
||||||
def test_sized(self):
|
def test_sized(self):
|
||||||
assert isinstance([], typing.Sized)
|
assert isinstance([], typing.Sized)
|
||||||
assert not isinstance(42, typing.Sized)
|
assert not isinstance(42, typing.Sized)
|
||||||
|
|
|
@ -28,6 +28,9 @@ __all__ = [
|
||||||
|
|
||||||
# ABCs (from collections.abc).
|
# ABCs (from collections.abc).
|
||||||
'AbstractSet', # collections.abc.Set.
|
'AbstractSet', # collections.abc.Set.
|
||||||
|
'Awaitable',
|
||||||
|
'AsyncIterator',
|
||||||
|
'AsyncIterable',
|
||||||
'ByteString',
|
'ByteString',
|
||||||
'Container',
|
'Container',
|
||||||
'Hashable',
|
'Hashable',
|
||||||
|
@ -1261,6 +1264,18 @@ class _Protocol(metaclass=_ProtocolMeta):
|
||||||
Hashable = collections_abc.Hashable # Not generic.
|
Hashable = collections_abc.Hashable # Not generic.
|
||||||
|
|
||||||
|
|
||||||
|
class Awaitable(Generic[T_co], extra=collections_abc.Awaitable):
|
||||||
|
__slots__ = ()
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncIterable(Generic[T_co], extra=collections_abc.AsyncIterable):
|
||||||
|
__slots__ = ()
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncIterator(AsyncIterable[T_co], extra=collections_abc.AsyncIterator):
|
||||||
|
__slots__ = ()
|
||||||
|
|
||||||
|
|
||||||
class Iterable(Generic[T_co], extra=collections_abc.Iterable):
|
class Iterable(Generic[T_co], extra=collections_abc.Iterable):
|
||||||
__slots__ = ()
|
__slots__ = ()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue