mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	Update typing.py and test_typing.py from upstream (https://github.com/python/typing)
This commit is contained in:
		
							parent
							
								
									63461bc384
								
							
						
					
					
						commit
						4cefe74aef
					
				
					 2 changed files with 447 additions and 593 deletions
				
			
		|  | @ -9,7 +9,7 @@ | ||||||
| from typing import TypeVar, AnyStr | from typing import TypeVar, AnyStr | ||||||
| from typing import T, KT, VT  # Not in __all__. | from typing import T, KT, VT  # Not in __all__. | ||||||
| from typing import Union, Optional | from typing import Union, Optional | ||||||
| from typing import Tuple, List | from typing import Tuple, List, MutableMapping | ||||||
| from typing import Callable | from typing import Callable | ||||||
| from typing import Generic, ClassVar | from typing import Generic, ClassVar | ||||||
| from typing import cast | from typing import cast | ||||||
|  | @ -21,6 +21,10 @@ | ||||||
| from typing import IO, TextIO, BinaryIO | from typing import IO, TextIO, BinaryIO | ||||||
| from typing import Pattern, Match | from typing import Pattern, Match | ||||||
| import typing | import typing | ||||||
|  | try: | ||||||
|  |     import collections.abc as collections_abc | ||||||
|  | except ImportError: | ||||||
|  |     import collections as collections_abc  # Fallback for PY3.2. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class BaseTestCase(TestCase): | class BaseTestCase(TestCase): | ||||||
|  | @ -62,18 +66,11 @@ def test_any_instance_type_error(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             isinstance(42, Any) |             isinstance(42, Any) | ||||||
| 
 | 
 | ||||||
|     def test_any_subclass(self): |     def test_any_subclass_type_error(self): | ||||||
|         self.assertTrue(issubclass(Employee, Any)) |         with self.assertRaises(TypeError): | ||||||
|         self.assertTrue(issubclass(int, Any)) |             issubclass(Employee, Any) | ||||||
|         self.assertTrue(issubclass(type(None), Any)) |         with self.assertRaises(TypeError): | ||||||
|         self.assertTrue(issubclass(object, Any)) |             issubclass(Any, Employee) | ||||||
| 
 |  | ||||||
|     def test_others_any(self): |  | ||||||
|         self.assertFalse(issubclass(Any, Employee)) |  | ||||||
|         self.assertFalse(issubclass(Any, int)) |  | ||||||
|         self.assertFalse(issubclass(Any, type(None))) |  | ||||||
|         # However, Any is a subclass of object (this can't be helped). |  | ||||||
|         self.assertTrue(issubclass(Any, object)) |  | ||||||
| 
 | 
 | ||||||
|     def test_repr(self): |     def test_repr(self): | ||||||
|         self.assertEqual(repr(Any), 'typing.Any') |         self.assertEqual(repr(Any), 'typing.Any') | ||||||
|  | @ -88,32 +85,21 @@ def test_cannot_subclass(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             class A(Any): |             class A(Any): | ||||||
|                 pass |                 pass | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             class A(type(Any)): | ||||||
|  |                 pass | ||||||
| 
 | 
 | ||||||
|     def test_cannot_instantiate(self): |     def test_cannot_instantiate(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             Any() |             Any() | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             type(Any)() | ||||||
| 
 | 
 | ||||||
|     def test_cannot_subscript(self): |     def test_cannot_subscript(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             Any[int] |             Any[int] | ||||||
| 
 | 
 | ||||||
|     def test_any_is_subclass(self): |     def test_any_works_with_alias(self): | ||||||
|         # Any should be considered a subclass of everything. |  | ||||||
|         self.assertIsSubclass(Any, Any) |  | ||||||
|         self.assertIsSubclass(Any, typing.List) |  | ||||||
|         self.assertIsSubclass(Any, typing.List[int]) |  | ||||||
|         self.assertIsSubclass(Any, typing.List[T]) |  | ||||||
|         self.assertIsSubclass(Any, typing.Mapping) |  | ||||||
|         self.assertIsSubclass(Any, typing.Mapping[str, int]) |  | ||||||
|         self.assertIsSubclass(Any, typing.Mapping[KT, VT]) |  | ||||||
|         self.assertIsSubclass(Any, Generic) |  | ||||||
|         self.assertIsSubclass(Any, Generic[T]) |  | ||||||
|         self.assertIsSubclass(Any, Generic[KT, VT]) |  | ||||||
|         self.assertIsSubclass(Any, AnyStr) |  | ||||||
|         self.assertIsSubclass(Any, Union) |  | ||||||
|         self.assertIsSubclass(Any, Union[int, str]) |  | ||||||
|         self.assertIsSubclass(Any, typing.Match) |  | ||||||
|         self.assertIsSubclass(Any, typing.Match[str]) |  | ||||||
|         # These expressions must simply not fail. |         # These expressions must simply not fail. | ||||||
|         typing.Match[Any] |         typing.Match[Any] | ||||||
|         typing.Pattern[Any] |         typing.Pattern[Any] | ||||||
|  | @ -124,13 +110,8 @@ class TypeVarTests(BaseTestCase): | ||||||
| 
 | 
 | ||||||
|     def test_basic_plain(self): |     def test_basic_plain(self): | ||||||
|         T = TypeVar('T') |         T = TypeVar('T') | ||||||
|         # Every class is a subclass of T. |  | ||||||
|         self.assertIsSubclass(int, T) |  | ||||||
|         self.assertIsSubclass(str, T) |  | ||||||
|         # T equals itself. |         # T equals itself. | ||||||
|         self.assertEqual(T, T) |         self.assertEqual(T, T) | ||||||
|         # T is a subclass of itself. |  | ||||||
|         self.assertIsSubclass(T, T) |  | ||||||
|         # T is an instance of TypeVar |         # T is an instance of TypeVar | ||||||
|         self.assertIsInstance(T, TypeVar) |         self.assertIsInstance(T, TypeVar) | ||||||
| 
 | 
 | ||||||
|  | @ -139,16 +120,12 @@ def test_typevar_instance_type_error(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             isinstance(42, T) |             isinstance(42, T) | ||||||
| 
 | 
 | ||||||
|     def test_basic_constrained(self): |     def test_typevar_subclass_type_error(self): | ||||||
|         A = TypeVar('A', str, bytes) |         T = TypeVar('T') | ||||||
|         # Only str and bytes are subclasses of A. |         with self.assertRaises(TypeError): | ||||||
|         self.assertIsSubclass(str, A) |             issubclass(int, T) | ||||||
|         self.assertIsSubclass(bytes, A) |         with self.assertRaises(TypeError): | ||||||
|         self.assertNotIsSubclass(int, A) |             issubclass(T, int) | ||||||
|         # A equals itself. |  | ||||||
|         self.assertEqual(A, A) |  | ||||||
|         # A is a subclass of itself. |  | ||||||
|         self.assertIsSubclass(A, A) |  | ||||||
| 
 | 
 | ||||||
|     def test_constrained_error(self): |     def test_constrained_error(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|  | @ -185,19 +162,6 @@ def test_no_redefinition(self): | ||||||
|         self.assertNotEqual(TypeVar('T'), TypeVar('T')) |         self.assertNotEqual(TypeVar('T'), TypeVar('T')) | ||||||
|         self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str)) |         self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str)) | ||||||
| 
 | 
 | ||||||
|     def test_subclass_as_unions(self): |  | ||||||
|         # None of these are true -- each type var is its own world. |  | ||||||
|         self.assertFalse(issubclass(TypeVar('T', int, str), |  | ||||||
|                                     TypeVar('T', int, str))) |  | ||||||
|         self.assertFalse(issubclass(TypeVar('T', int, float), |  | ||||||
|                                     TypeVar('T', int, float, str))) |  | ||||||
|         self.assertFalse(issubclass(TypeVar('T', int, str), |  | ||||||
|                                     TypeVar('T', str, int))) |  | ||||||
|         A = TypeVar('A', int, str) |  | ||||||
|         B = TypeVar('B', int, str, float) |  | ||||||
|         self.assertFalse(issubclass(A, B)) |  | ||||||
|         self.assertFalse(issubclass(B, A)) |  | ||||||
| 
 |  | ||||||
|     def test_cannot_subclass_vars(self): |     def test_cannot_subclass_vars(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             class V(TypeVar('T')): |             class V(TypeVar('T')): | ||||||
|  | @ -212,12 +176,6 @@ def test_cannot_instantiate_vars(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             TypeVar('A')() |             TypeVar('A')() | ||||||
| 
 | 
 | ||||||
|     def test_bound(self): |  | ||||||
|         X = TypeVar('X', bound=Employee) |  | ||||||
|         self.assertIsSubclass(Employee, X) |  | ||||||
|         self.assertIsSubclass(Manager, X) |  | ||||||
|         self.assertNotIsSubclass(int, X) |  | ||||||
| 
 |  | ||||||
|     def test_bound_errors(self): |     def test_bound_errors(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             TypeVar('X', bound=42) |             TypeVar('X', bound=42) | ||||||
|  | @ -230,8 +188,16 @@ class UnionTests(BaseTestCase): | ||||||
|     def test_basics(self): |     def test_basics(self): | ||||||
|         u = Union[int, float] |         u = Union[int, float] | ||||||
|         self.assertNotEqual(u, Union) |         self.assertNotEqual(u, Union) | ||||||
|         self.assertTrue(issubclass(int, u)) | 
 | ||||||
|         self.assertTrue(issubclass(float, u)) |     def test_subclass_error(self): | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             issubclass(int, Union) | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             issubclass(Union, int) | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             issubclass(int, Union[int, str]) | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             issubclass(Union[int, str], int) | ||||||
| 
 | 
 | ||||||
|     def test_union_any(self): |     def test_union_any(self): | ||||||
|         u = Union[Any] |         u = Union[Any] | ||||||
|  | @ -260,18 +226,6 @@ def test_unordered(self): | ||||||
|         u2 = Union[float, int] |         u2 = Union[float, int] | ||||||
|         self.assertEqual(u1, u2) |         self.assertEqual(u1, u2) | ||||||
| 
 | 
 | ||||||
|     def test_subclass(self): |  | ||||||
|         u = Union[int, Employee] |  | ||||||
|         self.assertTrue(issubclass(Manager, u)) |  | ||||||
| 
 |  | ||||||
|     def test_self_subclass(self): |  | ||||||
|         self.assertTrue(issubclass(Union[KT, VT], Union)) |  | ||||||
|         self.assertFalse(issubclass(Union, Union[KT, VT])) |  | ||||||
| 
 |  | ||||||
|     def test_multiple_inheritance(self): |  | ||||||
|         u = Union[int, Employee] |  | ||||||
|         self.assertTrue(issubclass(ManagingFounder, u)) |  | ||||||
| 
 |  | ||||||
|     def test_single_class_disappears(self): |     def test_single_class_disappears(self): | ||||||
|         t = Union[Employee] |         t = Union[Employee] | ||||||
|         self.assertIs(t, Employee) |         self.assertIs(t, Employee) | ||||||
|  | @ -284,13 +238,6 @@ def test_base_class_disappears(self): | ||||||
|         u = Union[Employee, Manager] |         u = Union[Employee, Manager] | ||||||
|         self.assertIs(u, Employee) |         self.assertIs(u, Employee) | ||||||
| 
 | 
 | ||||||
|     def test_weird_subclasses(self): |  | ||||||
|         u = Union[Employee, int, float] |  | ||||||
|         v = Union[int, float] |  | ||||||
|         self.assertTrue(issubclass(v, u)) |  | ||||||
|         w = Union[int, Manager] |  | ||||||
|         self.assertTrue(issubclass(w, u)) |  | ||||||
| 
 |  | ||||||
|     def test_union_union(self): |     def test_union_union(self): | ||||||
|         u = Union[int, float] |         u = Union[int, float] | ||||||
|         v = Union[u, Employee] |         v = Union[u, Employee] | ||||||
|  | @ -307,6 +254,9 @@ def test_cannot_subclass(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             class C(Union): |             class C(Union): | ||||||
|                 pass |                 pass | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             class C(type(Union)): | ||||||
|  |                 pass | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             class C(Union[int, str]): |             class C(Union[int, str]): | ||||||
|                 pass |                 pass | ||||||
|  | @ -314,9 +264,18 @@ class C(Union[int, str]): | ||||||
|     def test_cannot_instantiate(self): |     def test_cannot_instantiate(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             Union() |             Union() | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             type(Union)() | ||||||
|         u = Union[int, float] |         u = Union[int, float] | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             u() |             u() | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             type(u)() | ||||||
|  | 
 | ||||||
|  |     def test_union_generalization(self): | ||||||
|  |         self.assertFalse(Union[str, typing.Iterable[int]] == str) | ||||||
|  |         self.assertFalse(Union[str, typing.Iterable[int]] == typing.Iterable[int]) | ||||||
|  |         self.assertTrue(Union[str, typing.Iterable] == typing.Iterable) | ||||||
| 
 | 
 | ||||||
|     def test_optional(self): |     def test_optional(self): | ||||||
|         o = Optional[int] |         o = Optional[int] | ||||||
|  | @ -327,10 +286,6 @@ def test_empty(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             Union[()] |             Union[()] | ||||||
| 
 | 
 | ||||||
|     def test_issubclass_union(self): |  | ||||||
|         self.assertIsSubclass(Union[int, str], Union) |  | ||||||
|         self.assertNotIsSubclass(int, Union) |  | ||||||
| 
 |  | ||||||
|     def test_union_instance_type_error(self): |     def test_union_instance_type_error(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             isinstance(42, Union[int, str]) |             isinstance(42, Union[int, str]) | ||||||
|  | @ -355,43 +310,19 @@ def Elem(*args): | ||||||
|         Union[Elem, str]  # Nor should this |         Union[Elem, str]  # Nor should this | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class TypeVarUnionTests(BaseTestCase): |  | ||||||
| 
 |  | ||||||
|     def test_simpler(self): |  | ||||||
|         A = TypeVar('A', int, str, float) |  | ||||||
|         B = TypeVar('B', int, str) |  | ||||||
|         self.assertIsSubclass(A, A) |  | ||||||
|         self.assertIsSubclass(B, B) |  | ||||||
|         self.assertNotIsSubclass(B, A) |  | ||||||
|         self.assertIsSubclass(A, Union[int, str, float]) |  | ||||||
|         self.assertNotIsSubclass(Union[int, str, float], A) |  | ||||||
|         self.assertNotIsSubclass(Union[int, str], B) |  | ||||||
|         self.assertIsSubclass(B, Union[int, str]) |  | ||||||
|         self.assertNotIsSubclass(A, B) |  | ||||||
|         self.assertNotIsSubclass(Union[int, str, float], B) |  | ||||||
|         self.assertNotIsSubclass(A, Union[int, str]) |  | ||||||
| 
 |  | ||||||
|     def test_var_union_subclass(self): |  | ||||||
|         self.assertTrue(issubclass(T, Union[int, T])) |  | ||||||
|         self.assertTrue(issubclass(KT, Union[KT, VT])) |  | ||||||
| 
 |  | ||||||
|     def test_var_union(self): |  | ||||||
|         TU = TypeVar('TU', Union[int, float], None) |  | ||||||
|         self.assertIsSubclass(int, TU) |  | ||||||
|         self.assertIsSubclass(float, TU) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class TupleTests(BaseTestCase): | class TupleTests(BaseTestCase): | ||||||
| 
 | 
 | ||||||
|     def test_basics(self): |     def test_basics(self): | ||||||
|         self.assertTrue(issubclass(Tuple[int, str], Tuple)) |         with self.assertRaises(TypeError): | ||||||
|         self.assertTrue(issubclass(Tuple[int, str], Tuple[int, str])) |             issubclass(Tuple[int, str], Tuple) | ||||||
|         self.assertFalse(issubclass(int, Tuple)) |         with self.assertRaises(TypeError): | ||||||
|         self.assertFalse(issubclass(Tuple[float, str], Tuple[int, str])) |             issubclass(Tuple, Tuple[int, str]) | ||||||
|         self.assertFalse(issubclass(Tuple[int, str, int], Tuple[int, str])) |         with self.assertRaises(TypeError): | ||||||
|         self.assertFalse(issubclass(Tuple[int, str], Tuple[int, str, int])) |             issubclass(tuple, Tuple[int, str]) | ||||||
|  | 
 | ||||||
|  |         class TP(tuple): ... | ||||||
|         self.assertTrue(issubclass(tuple, Tuple)) |         self.assertTrue(issubclass(tuple, Tuple)) | ||||||
|         self.assertFalse(issubclass(Tuple, tuple))  # Can't have it both ways. |         self.assertTrue(issubclass(TP, Tuple)) | ||||||
| 
 | 
 | ||||||
|     def test_equality(self): |     def test_equality(self): | ||||||
|         self.assertEqual(Tuple[int], Tuple[int]) |         self.assertEqual(Tuple[int], Tuple[int]) | ||||||
|  | @ -407,21 +338,7 @@ class MyTuple(tuple): | ||||||
|     def test_tuple_instance_type_error(self): |     def test_tuple_instance_type_error(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             isinstance((0, 0), Tuple[int, int]) |             isinstance((0, 0), Tuple[int, int]) | ||||||
|         with self.assertRaises(TypeError): |         self.assertIsInstance((0, 0), Tuple) | ||||||
|             isinstance((0, 0), Tuple) |  | ||||||
| 
 |  | ||||||
|     def test_tuple_ellipsis_subclass(self): |  | ||||||
| 
 |  | ||||||
|         class B: |  | ||||||
|             pass |  | ||||||
| 
 |  | ||||||
|         class C(B): |  | ||||||
|             pass |  | ||||||
| 
 |  | ||||||
|         self.assertNotIsSubclass(Tuple[B], Tuple[B, ...]) |  | ||||||
|         self.assertIsSubclass(Tuple[C, ...], Tuple[B, ...]) |  | ||||||
|         self.assertNotIsSubclass(Tuple[C, ...], Tuple[B]) |  | ||||||
|         self.assertNotIsSubclass(Tuple[C], Tuple[B, ...]) |  | ||||||
| 
 | 
 | ||||||
|     def test_repr(self): |     def test_repr(self): | ||||||
|         self.assertEqual(repr(Tuple), 'typing.Tuple') |         self.assertEqual(repr(Tuple), 'typing.Tuple') | ||||||
|  | @ -439,17 +356,9 @@ def test_errors(self): | ||||||
| class CallableTests(BaseTestCase): | class CallableTests(BaseTestCase): | ||||||
| 
 | 
 | ||||||
|     def test_self_subclass(self): |     def test_self_subclass(self): | ||||||
|         self.assertTrue(issubclass(Callable[[int], int], Callable)) |         with self.assertRaises(TypeError): | ||||||
|         self.assertFalse(issubclass(Callable, Callable[[int], int])) |             self.assertTrue(issubclass(type(lambda x: x), Callable[[int], int])) | ||||||
|         self.assertTrue(issubclass(Callable[[int], int], Callable[[int], int])) |         self.assertTrue(issubclass(type(lambda x: x), Callable)) | ||||||
|         self.assertFalse(issubclass(Callable[[Employee], int], |  | ||||||
|                                     Callable[[Manager], int])) |  | ||||||
|         self.assertFalse(issubclass(Callable[[Manager], int], |  | ||||||
|                                     Callable[[Employee], int])) |  | ||||||
|         self.assertFalse(issubclass(Callable[[int], Employee], |  | ||||||
|                                     Callable[[int], Manager])) |  | ||||||
|         self.assertFalse(issubclass(Callable[[int], Manager], |  | ||||||
|                                     Callable[[int], Employee])) |  | ||||||
| 
 | 
 | ||||||
|     def test_eq_hash(self): |     def test_eq_hash(self): | ||||||
|         self.assertEqual(Callable[[int], int], Callable[[int], int]) |         self.assertEqual(Callable[[int], int], Callable[[int], int]) | ||||||
|  | @ -466,6 +375,11 @@ def test_cannot_subclass(self): | ||||||
|             class C(Callable): |             class C(Callable): | ||||||
|                 pass |                 pass | ||||||
| 
 | 
 | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  | 
 | ||||||
|  |             class C(type(Callable)): | ||||||
|  |                 pass | ||||||
|  | 
 | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
| 
 | 
 | ||||||
|             class C(Callable[[int], int]): |             class C(Callable[[int], int]): | ||||||
|  | @ -474,9 +388,13 @@ class C(Callable[[int], int]): | ||||||
|     def test_cannot_instantiate(self): |     def test_cannot_instantiate(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             Callable() |             Callable() | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             type(Callable)() | ||||||
|         c = Callable[[int], str] |         c = Callable[[int], str] | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             c() |             c() | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             type(c)() | ||||||
| 
 | 
 | ||||||
|     def test_callable_instance_works(self): |     def test_callable_instance_works(self): | ||||||
|         def f(): |         def f(): | ||||||
|  | @ -616,6 +534,12 @@ def test_basics(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             Y[str, str] |             Y[str, str] | ||||||
| 
 | 
 | ||||||
|  |     def test_generic_errors(self): | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             isinstance([], List[int]) | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             issubclass(list, List[int]) | ||||||
|  | 
 | ||||||
|     def test_init(self): |     def test_init(self): | ||||||
|         T = TypeVar('T') |         T = TypeVar('T') | ||||||
|         S = TypeVar('S') |         S = TypeVar('S') | ||||||
|  | @ -671,6 +595,42 @@ class C(B[int]): | ||||||
|         c.bar = 'abc' |         c.bar = 'abc' | ||||||
|         self.assertEqual(c.__dict__, {'bar': 'abc'}) |         self.assertEqual(c.__dict__, {'bar': 'abc'}) | ||||||
| 
 | 
 | ||||||
|  |     def test_false_subclasses(self): | ||||||
|  |         class MyMapping(MutableMapping[str, str]): pass | ||||||
|  |         self.assertNotIsInstance({}, MyMapping) | ||||||
|  |         self.assertNotIsSubclass(dict, MyMapping) | ||||||
|  | 
 | ||||||
|  |     def test_multiple_abc_bases(self): | ||||||
|  |         class MM1(MutableMapping[str, str], collections_abc.MutableMapping): | ||||||
|  |             def __getitem__(self, k): | ||||||
|  |                 return None | ||||||
|  |             def __setitem__(self, k, v): | ||||||
|  |                 pass | ||||||
|  |             def __delitem__(self, k): | ||||||
|  |                 pass | ||||||
|  |             def __iter__(self): | ||||||
|  |                 return iter(()) | ||||||
|  |             def __len__(self): | ||||||
|  |                 return 0 | ||||||
|  |         class MM2(collections_abc.MutableMapping, MutableMapping[str, str]): | ||||||
|  |             def __getitem__(self, k): | ||||||
|  |                 return None | ||||||
|  |             def __setitem__(self, k, v): | ||||||
|  |                 pass | ||||||
|  |             def __delitem__(self, k): | ||||||
|  |                 pass | ||||||
|  |             def __iter__(self): | ||||||
|  |                 return iter(()) | ||||||
|  |             def __len__(self): | ||||||
|  |                 return 0 | ||||||
|  |         # these two should just work | ||||||
|  |         MM1().update() | ||||||
|  |         MM2().update() | ||||||
|  |         self.assertIsInstance(MM1(), collections_abc.MutableMapping) | ||||||
|  |         self.assertIsInstance(MM1(), MutableMapping) | ||||||
|  |         self.assertIsInstance(MM2(), collections_abc.MutableMapping) | ||||||
|  |         self.assertIsInstance(MM2(), MutableMapping) | ||||||
|  | 
 | ||||||
|     def test_pickle(self): |     def test_pickle(self): | ||||||
|         global C  # pickle wants to reference the class by name |         global C  # pickle wants to reference the class by name | ||||||
|         T = TypeVar('T') |         T = TypeVar('T') | ||||||
|  | @ -853,6 +813,8 @@ class C(type(ClassVar[int])): | ||||||
|                 pass |                 pass | ||||||
| 
 | 
 | ||||||
|     def test_cannot_init(self): |     def test_cannot_init(self): | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             ClassVar() | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             type(ClassVar)() |             type(ClassVar)() | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|  | @ -865,52 +827,6 @@ def test_no_isinstance(self): | ||||||
|             issubclass(int, ClassVar) |             issubclass(int, ClassVar) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class VarianceTests(BaseTestCase): |  | ||||||
| 
 |  | ||||||
|     def test_invariance(self): |  | ||||||
|         # Because of invariance, List[subclass of X] is not a subclass |  | ||||||
|         # of List[X], and ditto for MutableSequence. |  | ||||||
|         self.assertNotIsSubclass(typing.List[Manager], typing.List[Employee]) |  | ||||||
|         self.assertNotIsSubclass(typing.MutableSequence[Manager], |  | ||||||
|                               typing.MutableSequence[Employee]) |  | ||||||
|         # It's still reflexive. |  | ||||||
|         self.assertIsSubclass(typing.List[Employee], typing.List[Employee]) |  | ||||||
|         self.assertIsSubclass(typing.MutableSequence[Employee], |  | ||||||
|                           typing.MutableSequence[Employee]) |  | ||||||
| 
 |  | ||||||
|     def test_covariance_tuple(self): |  | ||||||
|         # Check covariace for Tuple (which are really special cases). |  | ||||||
|         self.assertIsSubclass(Tuple[Manager], Tuple[Employee]) |  | ||||||
|         self.assertNotIsSubclass(Tuple[Employee], Tuple[Manager]) |  | ||||||
|         # And pairwise. |  | ||||||
|         self.assertIsSubclass(Tuple[Manager, Manager], |  | ||||||
|                               Tuple[Employee, Employee]) |  | ||||||
|         self.assertNotIsSubclass(Tuple[Employee, Employee], |  | ||||||
|                               Tuple[Manager, Employee]) |  | ||||||
|         # And using ellipsis. |  | ||||||
|         self.assertIsSubclass(Tuple[Manager, ...], Tuple[Employee, ...]) |  | ||||||
|         self.assertNotIsSubclass(Tuple[Employee, ...], Tuple[Manager, ...]) |  | ||||||
| 
 |  | ||||||
|     def test_covariance_sequence(self): |  | ||||||
|         # Check covariance for Sequence (which is just a generic class |  | ||||||
|         # for this purpose, but using a type variable with covariant=True). |  | ||||||
|         self.assertIsSubclass(typing.Sequence[Manager], |  | ||||||
|                               typing.Sequence[Employee]) |  | ||||||
|         self.assertNotIsSubclass(typing.Sequence[Employee], |  | ||||||
|                               typing.Sequence[Manager]) |  | ||||||
| 
 |  | ||||||
|     def test_covariance_mapping(self): |  | ||||||
|         # Ditto for Mapping (covariant in the value, invariant in the key). |  | ||||||
|         self.assertIsSubclass(typing.Mapping[Employee, Manager], |  | ||||||
|                           typing.Mapping[Employee, Employee]) |  | ||||||
|         self.assertNotIsSubclass(typing.Mapping[Manager, Employee], |  | ||||||
|                               typing.Mapping[Employee, Employee]) |  | ||||||
|         self.assertNotIsSubclass(typing.Mapping[Employee, Manager], |  | ||||||
|                               typing.Mapping[Manager, Manager]) |  | ||||||
|         self.assertNotIsSubclass(typing.Mapping[Manager, Employee], |  | ||||||
|                               typing.Mapping[Manager, Manager]) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class CastTests(BaseTestCase): | class CastTests(BaseTestCase): | ||||||
| 
 | 
 | ||||||
|     def test_basics(self): |     def test_basics(self): | ||||||
|  | @ -1247,7 +1163,6 @@ def test_iterable(self): | ||||||
|         # path and could fail.  So call this a few times. |         # path and could fail.  So call this a few times. | ||||||
|         self.assertIsInstance([], typing.Iterable) |         self.assertIsInstance([], typing.Iterable) | ||||||
|         self.assertIsInstance([], typing.Iterable) |         self.assertIsInstance([], typing.Iterable) | ||||||
|         self.assertIsInstance([], typing.Iterable[int]) |  | ||||||
|         self.assertNotIsInstance(42, typing.Iterable) |         self.assertNotIsInstance(42, typing.Iterable) | ||||||
|         # Just in case, also test issubclass() a few times. |         # Just in case, also test issubclass() a few times. | ||||||
|         self.assertIsSubclass(list, typing.Iterable) |         self.assertIsSubclass(list, typing.Iterable) | ||||||
|  | @ -1256,7 +1171,6 @@ def test_iterable(self): | ||||||
|     def test_iterator(self): |     def test_iterator(self): | ||||||
|         it = iter([]) |         it = iter([]) | ||||||
|         self.assertIsInstance(it, typing.Iterator) |         self.assertIsInstance(it, typing.Iterator) | ||||||
|         self.assertIsInstance(it, typing.Iterator[int]) |  | ||||||
|         self.assertNotIsInstance(42, typing.Iterator) |         self.assertNotIsInstance(42, typing.Iterator) | ||||||
| 
 | 
 | ||||||
|     @skipUnless(PY35, 'Python 3.5 required') |     @skipUnless(PY35, 'Python 3.5 required') | ||||||
|  | @ -1268,13 +1182,8 @@ def test_awaitable(self): | ||||||
|             globals(), ns) |             globals(), ns) | ||||||
|         foo = ns['foo'] |         foo = ns['foo'] | ||||||
|         g = foo() |         g = foo() | ||||||
|         self.assertIsSubclass(type(g), typing.Awaitable[int]) |  | ||||||
|         self.assertIsInstance(g, typing.Awaitable) |         self.assertIsInstance(g, typing.Awaitable) | ||||||
|         self.assertNotIsInstance(foo, typing.Awaitable) |         self.assertNotIsInstance(foo, typing.Awaitable) | ||||||
|         self.assertIsSubclass(typing.Awaitable[Manager], |  | ||||||
|                           typing.Awaitable[Employee]) |  | ||||||
|         self.assertNotIsSubclass(typing.Awaitable[Employee], |  | ||||||
|                               typing.Awaitable[Manager]) |  | ||||||
|         g.send(None)  # Run foo() till completion, to avoid warning. |         g.send(None)  # Run foo() till completion, to avoid warning. | ||||||
| 
 | 
 | ||||||
|     @skipUnless(PY35, 'Python 3.5 required') |     @skipUnless(PY35, 'Python 3.5 required') | ||||||
|  | @ -1283,8 +1192,6 @@ def test_async_iterable(self): | ||||||
|         it = AsyncIteratorWrapper(base_it) |         it = AsyncIteratorWrapper(base_it) | ||||||
|         self.assertIsInstance(it, typing.AsyncIterable) |         self.assertIsInstance(it, typing.AsyncIterable) | ||||||
|         self.assertIsInstance(it, typing.AsyncIterable) |         self.assertIsInstance(it, typing.AsyncIterable) | ||||||
|         self.assertIsSubclass(typing.AsyncIterable[Manager], |  | ||||||
|                           typing.AsyncIterable[Employee]) |  | ||||||
|         self.assertNotIsInstance(42, typing.AsyncIterable) |         self.assertNotIsInstance(42, typing.AsyncIterable) | ||||||
| 
 | 
 | ||||||
|     @skipUnless(PY35, 'Python 3.5 required') |     @skipUnless(PY35, 'Python 3.5 required') | ||||||
|  | @ -1292,8 +1199,6 @@ def test_async_iterator(self): | ||||||
|         base_it = range(10)  # type: Iterator[int] |         base_it = range(10)  # type: Iterator[int] | ||||||
|         it = AsyncIteratorWrapper(base_it) |         it = AsyncIteratorWrapper(base_it) | ||||||
|         self.assertIsInstance(it, typing.AsyncIterator) |         self.assertIsInstance(it, typing.AsyncIterator) | ||||||
|         self.assertIsSubclass(typing.AsyncIterator[Manager], |  | ||||||
|                           typing.AsyncIterator[Employee]) |  | ||||||
|         self.assertNotIsInstance(42, typing.AsyncIterator) |         self.assertNotIsInstance(42, typing.AsyncIterator) | ||||||
| 
 | 
 | ||||||
|     def test_sized(self): |     def test_sized(self): | ||||||
|  | @ -1457,10 +1362,6 @@ def foo(): | ||||||
|             yield 42 |             yield 42 | ||||||
|         g = foo() |         g = foo() | ||||||
|         self.assertIsSubclass(type(g), typing.Generator) |         self.assertIsSubclass(type(g), typing.Generator) | ||||||
|         self.assertIsSubclass(typing.Generator[Manager, Employee, Manager], |  | ||||||
|                           typing.Generator[Employee, Manager, Employee]) |  | ||||||
|         self.assertNotIsSubclass(typing.Generator[Manager, Manager, Manager], |  | ||||||
|                               typing.Generator[Employee, Employee, Employee]) |  | ||||||
| 
 | 
 | ||||||
|     def test_no_generator_instantiation(self): |     def test_no_generator_instantiation(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|  | @ -1511,7 +1412,6 @@ def manager(): | ||||||
| 
 | 
 | ||||||
|         cm = manager() |         cm = manager() | ||||||
|         self.assertIsInstance(cm, typing.ContextManager) |         self.assertIsInstance(cm, typing.ContextManager) | ||||||
|         self.assertIsInstance(cm, typing.ContextManager[int]) |  | ||||||
|         self.assertNotIsInstance(42, typing.ContextManager) |         self.assertNotIsInstance(42, typing.ContextManager) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1653,22 +1553,16 @@ def test_basics(self): | ||||||
|         pat = re.compile('[a-z]+', re.I) |         pat = re.compile('[a-z]+', re.I) | ||||||
|         self.assertIsSubclass(pat.__class__, Pattern) |         self.assertIsSubclass(pat.__class__, Pattern) | ||||||
|         self.assertIsSubclass(type(pat), Pattern) |         self.assertIsSubclass(type(pat), Pattern) | ||||||
|         self.assertIsSubclass(type(pat), Pattern[str]) |         self.assertIsInstance(pat, Pattern) | ||||||
| 
 | 
 | ||||||
|         mat = pat.search('12345abcde.....') |         mat = pat.search('12345abcde.....') | ||||||
|         self.assertIsSubclass(mat.__class__, Match) |         self.assertIsSubclass(mat.__class__, Match) | ||||||
|         self.assertIsSubclass(mat.__class__, Match[str]) |  | ||||||
|         self.assertIsSubclass(mat.__class__, Match[bytes])  # Sad but true. |  | ||||||
|         self.assertIsSubclass(type(mat), Match) |         self.assertIsSubclass(type(mat), Match) | ||||||
|         self.assertIsSubclass(type(mat), Match[str]) |         self.assertIsInstance(mat, Match) | ||||||
| 
 | 
 | ||||||
|  |         # these should just work | ||||||
|         p = Pattern[Union[str, bytes]] |         p = Pattern[Union[str, bytes]] | ||||||
|         self.assertIsSubclass(Pattern[str], Pattern) |  | ||||||
|         self.assertIsSubclass(Pattern[str], p) |  | ||||||
| 
 |  | ||||||
|         m = Match[Union[bytes, str]] |         m = Match[Union[bytes, str]] | ||||||
|         self.assertIsSubclass(Match[bytes], Match) |  | ||||||
|         self.assertIsSubclass(Match[bytes], m) |  | ||||||
| 
 | 
 | ||||||
|     def test_errors(self): |     def test_errors(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|  | @ -1681,9 +1575,6 @@ def test_errors(self): | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             # Too complicated? |             # Too complicated? | ||||||
|             m[str] |             m[str] | ||||||
|         with self.assertRaises(TypeError): |  | ||||||
|             # We don't support isinstance(). |  | ||||||
|             isinstance(42, Pattern) |  | ||||||
|         with self.assertRaises(TypeError): |         with self.assertRaises(TypeError): | ||||||
|             # We don't support isinstance(). |             # We don't support isinstance(). | ||||||
|             isinstance(42, Pattern[str]) |             isinstance(42, Pattern[str]) | ||||||
|  | @ -1710,7 +1601,7 @@ class A(typing.Match): | ||||||
|                 pass |                 pass | ||||||
| 
 | 
 | ||||||
|         self.assertEqual(str(ex.exception), |         self.assertEqual(str(ex.exception), | ||||||
|                          "A type alias cannot be subclassed") |                          "Cannot subclass typing._TypeAlias") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class AllTests(BaseTestCase): | class AllTests(BaseTestCase): | ||||||
|  |  | ||||||
							
								
								
									
										697
									
								
								Lib/typing.py
									
										
									
									
									
								
							
							
						
						
									
										697
									
								
								Lib/typing.py
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum