Y[str, str]
def test_generic_errors(self):
+ T = TypeVar('T')
+ with self.assertRaises(TypeError):
+ Generic[T]()
with self.assertRaises(TypeError):
isinstance([], List[int])
with self.assertRaises(TypeError):
ASYNCIO_TESTS = """
import asyncio
-T_a = TypeVar('T')
+T_a = TypeVar('T_a')
class AwaitableWrapper(typing.Awaitable[T_a]):
self.assertNotIsInstance(foo, typing.Awaitable)
g.send(None) # Run foo() till completion, to avoid warning.
+ @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
+ def test_coroutine(self):
+ ns = {}
+ exec(
+ "async def foo():\n"
+ " return\n",
+ globals(), ns)
+ foo = ns['foo']
+ g = foo()
+ self.assertIsInstance(g, typing.Coroutine)
+ with self.assertRaises(TypeError):
+ isinstance(g, typing.Coroutine[int])
+ self.assertNotIsInstance(foo, typing.Coroutine)
+ try:
+ g.send(None)
+ except StopIteration:
+ pass
+
@skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
def test_async_iterable(self):
base_it = range(10) # type: Iterator[int]
# ABCs (from collections.abc).
'AbstractSet', # collections.abc.Set.
- 'Awaitable',
- 'AsyncIterator',
- 'AsyncIterable',
'ByteString',
'Container',
'Hashable',
'Sequence',
'Sized',
'ValuesView',
+ # The following are added depending on presence
+ # of their non-generic counterparts in stdlib:
+ # Awaitable,
+ # AsyncIterator,
+ # AsyncIterable,
+ # Coroutine,
+ # Collection,
+ # ContextManager
# Structural checks, a.k.a. protocols.
'Reversible',
__slots__ = ()
def __new__(cls, *args, **kwds):
+ if _geqv(cls, Generic):
+ raise TypeError("Type Generic cannot be instantiated; "
+ "it can be used only as a base class")
return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
if hasattr(collections_abc, 'Awaitable'):
class Awaitable(Generic[T_co], extra=collections_abc.Awaitable):
__slots__ = ()
-else:
- Awaitable = None
+
+ __all__.append('Awaitable')
+
+
+if hasattr(collections_abc, 'Coroutine'):
+ class Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co],
+ extra=collections_abc.Coroutine):
+ __slots__ = ()
+
+ __all__.append('Coroutine')
if hasattr(collections_abc, 'AsyncIterable'):
extra=collections_abc.AsyncIterator):
__slots__ = ()
-else:
- AsyncIterable = None
- AsyncIterator = None
+ __all__.append('AsyncIterable')
+ __all__.append('AsyncIterator')
class Iterable(Generic[T_co], extra=collections_abc.Iterable):