Added Type[C] implementation to typing.py. (Merge 3.5->3.6)

This commit is contained in:
Guido van Rossum 2016-05-24 16:39:23 -07:00
commit 70223d9b09
2 changed files with 61 additions and 1 deletions

View File

@ -15,6 +15,7 @@ from typing import Generic
from typing import cast from typing import cast
from typing import get_type_hints from typing import get_type_hints
from typing import no_type_check, no_type_check_decorator from typing import no_type_check, no_type_check_decorator
from typing import Type
from typing import NamedTuple from typing import NamedTuple
from typing import IO, TextIO, BinaryIO from typing import IO, TextIO, BinaryIO
from typing import Pattern, Match from typing import Pattern, Match
@ -1373,6 +1374,33 @@ class OtherABCTests(BaseTestCase):
self.assertNotIsInstance(42, typing.ContextManager) self.assertNotIsInstance(42, typing.ContextManager)
class TypeTests(BaseTestCase):
def test_type_basic(self):
class User: pass
class BasicUser(User): pass
class ProUser(User): pass
def new_user(user_class: Type[User]) -> User:
return user_class()
joe = new_user(BasicUser)
def test_type_typevar(self):
class User: pass
class BasicUser(User): pass
class ProUser(User): pass
U = TypeVar('U', bound=User)
def new_user(user_class: Type[U]) -> U:
return user_class()
joe = new_user(BasicUser)
class NamedTupleTests(BaseTestCase): class NamedTupleTests(BaseTestCase):
def test_basics(self): def test_basics(self):

View File

@ -19,9 +19,10 @@ __all__ = [
'Callable', 'Callable',
'Generic', 'Generic',
'Optional', 'Optional',
'Tuple',
'Type',
'TypeVar', 'TypeVar',
'Union', 'Union',
'Tuple',
# ABCs (from collections.abc). # ABCs (from collections.abc).
'AbstractSet', # collections.abc.Set. 'AbstractSet', # collections.abc.Set.
@ -447,6 +448,7 @@ class TypeVar(TypingMeta, metaclass=TypingMeta, _root=True):
# Some unconstrained type variables. These are used by the container types. # Some unconstrained type variables. These are used by the container types.
# (These are not for export.)
T = TypeVar('T') # Any type. T = TypeVar('T') # Any type.
KT = TypeVar('KT') # Key type. KT = TypeVar('KT') # Key type.
VT = TypeVar('VT') # Value type. VT = TypeVar('VT') # Value type.
@ -456,6 +458,7 @@ VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant. T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
# A useful type variable with constraints. This represents string types. # A useful type variable with constraints. This represents string types.
# (This one *is* for export!)
AnyStr = TypeVar('AnyStr', bytes, str) AnyStr = TypeVar('AnyStr', bytes, str)
@ -1572,6 +1575,35 @@ class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co],
return super().__new__(cls, *args, **kwds) return super().__new__(cls, *args, **kwds)
# Internal type variable used for Type[].
CT = TypeVar('CT', covariant=True, bound=type)
class Type(type, Generic[CT], extra=type):
"""A generic type usable to annotate class objects.
For example, suppose we have the following classes::
class User: ... # Abstract base for User classes
class BasicUser(User): ...
class ProUser(User): ...
class TeamUser(User): ...
And a function that takes a class argument that's a subclass of
User and returns an instance of the corresponding class::
U = TypeVar('U', bound=User)
def new_user(user_class: Type[U]) -> U:
user = user_class()
# (Here we could write the user object to a database)
return user
joe = new_user(BasicUser)
At this point the type checker knows that joe has type BasicUser.
"""
def NamedTuple(typename, fields): def NamedTuple(typename, fields):
"""Typed version of namedtuple. """Typed version of namedtuple.