blob: fd2d93c3a4db1fbdaaf96125a6430da1e261e392 [file] [log] [blame]
Guido van Rossum6aafbd42016-04-17 17:52:05 -07001import contextlib
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002import collections
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08003import pickle
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07004import re
5import sys
Guido van Rossum91185fe2016-06-08 11:19:11 -07006from unittest import TestCase, main, skipUnless, SkipTest
Guido van Rossumb7dedc82016-10-29 12:44:29 -07007from copy import copy, deepcopy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07008
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02009from typing import Any, NoReturn
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070010from typing import TypeVar, AnyStr
11from typing import T, KT, VT # Not in __all__.
12from typing import Union, Optional
Guido van Rossum4cefe742016-09-27 15:20:12 -070013from typing import Tuple, List, MutableMapping
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070014from typing import Callable
Guido van Rossum83ec3022017-01-17 20:43:28 -080015from typing import Generic, ClassVar, GenericMeta
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070016from typing import cast
17from typing import get_type_hints
18from typing import no_type_check, no_type_check_decorator
Guido van Rossumeb9aca32016-05-24 16:38:22 -070019from typing import Type
Guido van Rossum91185fe2016-06-08 11:19:11 -070020from typing import NewType
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070021from typing import NamedTuple
22from typing import IO, TextIO, BinaryIO
23from typing import Pattern, Match
Guido van Rossume2592672016-10-08 20:27:22 -070024import abc
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070025import typing
Guido van Rossum83ec3022017-01-17 20:43:28 -080026import weakref
Guido van Rossum4cefe742016-09-27 15:20:12 -070027try:
28 import collections.abc as collections_abc
29except ImportError:
30 import collections as collections_abc # Fallback for PY3.2.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070031
32
Zachary Ware75b1bdc2016-04-19 11:49:37 -050033class BaseTestCase(TestCase):
34
35 def assertIsSubclass(self, cls, class_or_tuple, msg=None):
36 if not issubclass(cls, class_or_tuple):
37 message = '%r is not a subclass of %r' % (cls, class_or_tuple)
38 if msg is not None:
39 message += ' : %s' % msg
40 raise self.failureException(message)
41
42 def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
43 if issubclass(cls, class_or_tuple):
44 message = '%r is a subclass of %r' % (cls, class_or_tuple)
45 if msg is not None:
46 message += ' : %s' % msg
47 raise self.failureException(message)
48
Guido van Rossumca4b2522016-11-19 10:32:41 -080049 def clear_caches(self):
50 for f in typing._cleanups:
51 f()
52
Zachary Ware75b1bdc2016-04-19 11:49:37 -050053
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070054class Employee:
55 pass
56
57
58class Manager(Employee):
59 pass
60
61
62class Founder(Employee):
63 pass
64
65
66class ManagingFounder(Manager, Founder):
67 pass
68
69
Zachary Ware75b1bdc2016-04-19 11:49:37 -050070class AnyTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070071
Guido van Rossumd70fe632015-08-05 12:11:06 +020072 def test_any_instance_type_error(self):
73 with self.assertRaises(TypeError):
74 isinstance(42, Any)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070075
Guido van Rossum4cefe742016-09-27 15:20:12 -070076 def test_any_subclass_type_error(self):
77 with self.assertRaises(TypeError):
78 issubclass(Employee, Any)
79 with self.assertRaises(TypeError):
80 issubclass(Any, Employee)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070081
82 def test_repr(self):
83 self.assertEqual(repr(Any), 'typing.Any')
84
85 def test_errors(self):
86 with self.assertRaises(TypeError):
87 issubclass(42, Any)
88 with self.assertRaises(TypeError):
89 Any[int] # Any is not a generic type.
90
91 def test_cannot_subclass(self):
92 with self.assertRaises(TypeError):
93 class A(Any):
94 pass
Guido van Rossum4cefe742016-09-27 15:20:12 -070095 with self.assertRaises(TypeError):
96 class A(type(Any)):
97 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070098
99 def test_cannot_instantiate(self):
100 with self.assertRaises(TypeError):
101 Any()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700102 with self.assertRaises(TypeError):
103 type(Any)()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700104
Guido van Rossum4cefe742016-09-27 15:20:12 -0700105 def test_any_works_with_alias(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700106 # These expressions must simply not fail.
107 typing.Match[Any]
108 typing.Pattern[Any]
109 typing.IO[Any]
110
111
Ivan Levkivskyif06e0212017-05-02 19:14:07 +0200112class NoReturnTests(BaseTestCase):
113
114 def test_noreturn_instance_type_error(self):
115 with self.assertRaises(TypeError):
116 isinstance(42, NoReturn)
117
118 def test_noreturn_subclass_type_error(self):
119 with self.assertRaises(TypeError):
120 issubclass(Employee, NoReturn)
121 with self.assertRaises(TypeError):
122 issubclass(NoReturn, Employee)
123
124 def test_repr(self):
125 self.assertEqual(repr(NoReturn), 'typing.NoReturn')
126
127 def test_not_generic(self):
128 with self.assertRaises(TypeError):
129 NoReturn[int]
130
131 def test_cannot_subclass(self):
132 with self.assertRaises(TypeError):
133 class A(NoReturn):
134 pass
135 with self.assertRaises(TypeError):
136 class A(type(NoReturn)):
137 pass
138
139 def test_cannot_instantiate(self):
140 with self.assertRaises(TypeError):
141 NoReturn()
142 with self.assertRaises(TypeError):
143 type(NoReturn)()
144
145
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500146class TypeVarTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700147
148 def test_basic_plain(self):
149 T = TypeVar('T')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700150 # T equals itself.
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500151 self.assertEqual(T, T)
Guido van Rossumd70fe632015-08-05 12:11:06 +0200152 # T is an instance of TypeVar
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500153 self.assertIsInstance(T, TypeVar)
Guido van Rossumd70fe632015-08-05 12:11:06 +0200154
155 def test_typevar_instance_type_error(self):
156 T = TypeVar('T')
157 with self.assertRaises(TypeError):
158 isinstance(42, T)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700159
Guido van Rossum4cefe742016-09-27 15:20:12 -0700160 def test_typevar_subclass_type_error(self):
161 T = TypeVar('T')
162 with self.assertRaises(TypeError):
163 issubclass(int, T)
164 with self.assertRaises(TypeError):
165 issubclass(T, int)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700166
167 def test_constrained_error(self):
168 with self.assertRaises(TypeError):
169 X = TypeVar('X', int)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700170 X
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700171
172 def test_union_unique(self):
173 X = TypeVar('X')
174 Y = TypeVar('Y')
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500175 self.assertNotEqual(X, Y)
176 self.assertEqual(Union[X], X)
177 self.assertNotEqual(Union[X], Union[X, Y])
178 self.assertEqual(Union[X, X], X)
179 self.assertNotEqual(Union[X, int], Union[X])
180 self.assertNotEqual(Union[X, int], Union[int])
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700181 self.assertEqual(Union[X, int].__args__, (X, int))
182 self.assertEqual(Union[X, int].__parameters__, (X,))
183 self.assertIs(Union[X, int].__origin__, Union)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700184
185 def test_union_constrained(self):
186 A = TypeVar('A', str, bytes)
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500187 self.assertNotEqual(Union[A, str], Union[A])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700188
189 def test_repr(self):
190 self.assertEqual(repr(T), '~T')
191 self.assertEqual(repr(KT), '~KT')
192 self.assertEqual(repr(VT), '~VT')
193 self.assertEqual(repr(AnyStr), '~AnyStr')
194 T_co = TypeVar('T_co', covariant=True)
195 self.assertEqual(repr(T_co), '+T_co')
196 T_contra = TypeVar('T_contra', contravariant=True)
197 self.assertEqual(repr(T_contra), '-T_contra')
198
199 def test_no_redefinition(self):
200 self.assertNotEqual(TypeVar('T'), TypeVar('T'))
201 self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str))
202
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700203 def test_cannot_subclass_vars(self):
204 with self.assertRaises(TypeError):
205 class V(TypeVar('T')):
206 pass
207
208 def test_cannot_subclass_var_itself(self):
209 with self.assertRaises(TypeError):
210 class V(TypeVar):
211 pass
212
213 def test_cannot_instantiate_vars(self):
214 with self.assertRaises(TypeError):
215 TypeVar('A')()
216
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700217 def test_bound_errors(self):
218 with self.assertRaises(TypeError):
219 TypeVar('X', bound=42)
220 with self.assertRaises(TypeError):
221 TypeVar('X', str, float, bound=Employee)
222
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100223 def test_no_bivariant(self):
224 with self.assertRaises(ValueError):
225 TypeVar('T', covariant=True, contravariant=True)
226
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700227
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500228class UnionTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700229
230 def test_basics(self):
231 u = Union[int, float]
232 self.assertNotEqual(u, Union)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700233
234 def test_subclass_error(self):
235 with self.assertRaises(TypeError):
236 issubclass(int, Union)
237 with self.assertRaises(TypeError):
238 issubclass(Union, int)
239 with self.assertRaises(TypeError):
240 issubclass(int, Union[int, str])
241 with self.assertRaises(TypeError):
242 issubclass(Union[int, str], int)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700243
244 def test_union_any(self):
245 u = Union[Any]
246 self.assertEqual(u, Any)
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700247 u1 = Union[int, Any]
248 u2 = Union[Any, int]
249 u3 = Union[Any, object]
250 self.assertEqual(u1, u2)
251 self.assertNotEqual(u1, Any)
252 self.assertNotEqual(u2, Any)
253 self.assertNotEqual(u3, Any)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700254
255 def test_union_object(self):
256 u = Union[object]
257 self.assertEqual(u, object)
258 u = Union[int, object]
259 self.assertEqual(u, object)
260 u = Union[object, int]
261 self.assertEqual(u, object)
262
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700263 def test_unordered(self):
264 u1 = Union[int, float]
265 u2 = Union[float, int]
266 self.assertEqual(u1, u2)
267
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700268 def test_single_class_disappears(self):
269 t = Union[Employee]
270 self.assertIs(t, Employee)
271
272 def test_base_class_disappears(self):
273 u = Union[Employee, Manager, int]
274 self.assertEqual(u, Union[int, Employee])
275 u = Union[Manager, int, Employee]
276 self.assertEqual(u, Union[int, Employee])
277 u = Union[Employee, Manager]
278 self.assertIs(u, Employee)
279
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700280 def test_union_union(self):
281 u = Union[int, float]
282 v = Union[u, Employee]
283 self.assertEqual(v, Union[int, float, Employee])
284
285 def test_repr(self):
286 self.assertEqual(repr(Union), 'typing.Union')
287 u = Union[Employee, int]
288 self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__)
289 u = Union[int, Employee]
290 self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100291 T = TypeVar('T')
292 u = Union[T, int][int]
293 self.assertEqual(repr(u), repr(int))
294 u = Union[List[int], int]
295 self.assertEqual(repr(u), 'typing.Union[typing.List[int], int]')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700296
297 def test_cannot_subclass(self):
298 with self.assertRaises(TypeError):
299 class C(Union):
300 pass
301 with self.assertRaises(TypeError):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700302 class C(type(Union)):
303 pass
304 with self.assertRaises(TypeError):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700305 class C(Union[int, str]):
306 pass
307
308 def test_cannot_instantiate(self):
309 with self.assertRaises(TypeError):
310 Union()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700311 with self.assertRaises(TypeError):
312 type(Union)()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700313 u = Union[int, float]
314 with self.assertRaises(TypeError):
315 u()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700316 with self.assertRaises(TypeError):
317 type(u)()
318
319 def test_union_generalization(self):
320 self.assertFalse(Union[str, typing.Iterable[int]] == str)
321 self.assertFalse(Union[str, typing.Iterable[int]] == typing.Iterable[int])
322 self.assertTrue(Union[str, typing.Iterable] == typing.Iterable)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700323
Guido van Rossum83ec3022017-01-17 20:43:28 -0800324 def test_union_compare_other(self):
325 self.assertNotEqual(Union, object)
326 self.assertNotEqual(Union, Any)
327 self.assertNotEqual(ClassVar, Union)
328 self.assertNotEqual(Optional, Union)
329 self.assertNotEqual([None], Optional)
330 self.assertNotEqual(Optional, typing.Mapping)
331 self.assertNotEqual(Optional[typing.MutableMapping], Union)
332
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700333 def test_optional(self):
334 o = Optional[int]
335 u = Union[int, None]
336 self.assertEqual(o, u)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700337
338 def test_empty(self):
339 with self.assertRaises(TypeError):
340 Union[()]
341
Guido van Rossumd70fe632015-08-05 12:11:06 +0200342 def test_union_instance_type_error(self):
343 with self.assertRaises(TypeError):
344 isinstance(42, Union[int, str])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700345
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100346 def test_no_eval_union(self):
347 u = Union[int, str]
348 def f(x: u): ...
349 self.assertIs(get_type_hints(f)['x'], u)
350
351 def test_function_repr_union(self):
352 def fun() -> int: ...
353 self.assertEqual(repr(Union[fun, int]), 'typing.Union[fun, int]')
354
Guido van Rossumca636ea2015-10-19 14:55:47 -0700355 def test_union_str_pattern(self):
356 # Shouldn't crash; see http://bugs.python.org/issue25390
357 A = Union[str, Pattern]
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700358 A
Guido van Rossumca636ea2015-10-19 14:55:47 -0700359
Guido van Rossum91185fe2016-06-08 11:19:11 -0700360 def test_etree(self):
361 # See https://github.com/python/typing/issues/229
362 # (Only relevant for Python 2.)
363 try:
364 from xml.etree.cElementTree import Element
365 except ImportError:
366 raise SkipTest("cElementTree not found")
367 Union[Element, str] # Shouldn't crash
368
369 def Elem(*args):
370 return Element(*args)
371
372 Union[Elem, str] # Nor should this
373
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700374
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500375class TupleTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700376
377 def test_basics(self):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700378 with self.assertRaises(TypeError):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700379 issubclass(Tuple, Tuple[int, str])
380 with self.assertRaises(TypeError):
381 issubclass(tuple, Tuple[int, str])
382
383 class TP(tuple): ...
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700384 self.assertTrue(issubclass(tuple, Tuple))
Guido van Rossum4cefe742016-09-27 15:20:12 -0700385 self.assertTrue(issubclass(TP, Tuple))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700386
Guido van Rossum5abcbb32016-04-18 07:37:41 -0700387 def test_equality(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500388 self.assertEqual(Tuple[int], Tuple[int])
389 self.assertEqual(Tuple[int, ...], Tuple[int, ...])
390 self.assertNotEqual(Tuple[int], Tuple[int, int])
391 self.assertNotEqual(Tuple[int], Tuple[int, ...])
Guido van Rossum5abcbb32016-04-18 07:37:41 -0700392
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700393 def test_tuple_subclass(self):
394 class MyTuple(tuple):
395 pass
396 self.assertTrue(issubclass(MyTuple, Tuple))
397
Guido van Rossumd70fe632015-08-05 12:11:06 +0200398 def test_tuple_instance_type_error(self):
399 with self.assertRaises(TypeError):
400 isinstance((0, 0), Tuple[int, int])
Guido van Rossum4cefe742016-09-27 15:20:12 -0700401 self.assertIsInstance((0, 0), Tuple)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700402
403 def test_repr(self):
404 self.assertEqual(repr(Tuple), 'typing.Tuple')
Guido van Rossum91185fe2016-06-08 11:19:11 -0700405 self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700406 self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]')
407 self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]')
408
409 def test_errors(self):
410 with self.assertRaises(TypeError):
411 issubclass(42, Tuple)
412 with self.assertRaises(TypeError):
413 issubclass(42, Tuple[int])
414
415
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500416class CallableTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700417
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700418 def test_self_subclass(self):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700419 with self.assertRaises(TypeError):
420 self.assertTrue(issubclass(type(lambda x: x), Callable[[int], int]))
421 self.assertTrue(issubclass(type(lambda x: x), Callable))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700422
423 def test_eq_hash(self):
424 self.assertEqual(Callable[[int], int], Callable[[int], int])
425 self.assertEqual(len({Callable[[int], int], Callable[[int], int]}), 1)
426 self.assertNotEqual(Callable[[int], int], Callable[[int], str])
427 self.assertNotEqual(Callable[[int], int], Callable[[str], int])
428 self.assertNotEqual(Callable[[int], int], Callable[[int, int], int])
429 self.assertNotEqual(Callable[[int], int], Callable[[], int])
430 self.assertNotEqual(Callable[[int], int], Callable)
431
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700432 def test_cannot_instantiate(self):
433 with self.assertRaises(TypeError):
434 Callable()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700435 with self.assertRaises(TypeError):
436 type(Callable)()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700437 c = Callable[[int], str]
438 with self.assertRaises(TypeError):
439 c()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700440 with self.assertRaises(TypeError):
441 type(c)()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700442
Guido van Rossum991d14f2016-11-09 13:12:51 -0800443 def test_callable_wrong_forms(self):
444 with self.assertRaises(TypeError):
445 Callable[[...], int]
446 with self.assertRaises(TypeError):
447 Callable[(), int]
448 with self.assertRaises(TypeError):
449 Callable[[()], int]
450 with self.assertRaises(TypeError):
451 Callable[[int, 1], 2]
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100452 with self.assertRaises(TypeError):
453 Callable[int]
Guido van Rossum991d14f2016-11-09 13:12:51 -0800454
Guido van Rossumd70fe632015-08-05 12:11:06 +0200455 def test_callable_instance_works(self):
Guido van Rossum1b669102015-09-04 12:15:54 -0700456 def f():
457 pass
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500458 self.assertIsInstance(f, Callable)
459 self.assertNotIsInstance(None, Callable)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700460
Guido van Rossumd70fe632015-08-05 12:11:06 +0200461 def test_callable_instance_type_error(self):
Guido van Rossum1b669102015-09-04 12:15:54 -0700462 def f():
463 pass
Guido van Rossumd70fe632015-08-05 12:11:06 +0200464 with self.assertRaises(TypeError):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500465 self.assertIsInstance(f, Callable[[], None])
Guido van Rossumd70fe632015-08-05 12:11:06 +0200466 with self.assertRaises(TypeError):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500467 self.assertIsInstance(f, Callable[[], Any])
Guido van Rossumd70fe632015-08-05 12:11:06 +0200468 with self.assertRaises(TypeError):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500469 self.assertNotIsInstance(None, Callable[[], None])
Guido van Rossumd70fe632015-08-05 12:11:06 +0200470 with self.assertRaises(TypeError):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500471 self.assertNotIsInstance(None, Callable[[], Any])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700472
473 def test_repr(self):
474 ct0 = Callable[[], bool]
475 self.assertEqual(repr(ct0), 'typing.Callable[[], bool]')
476 ct2 = Callable[[str, float], int]
477 self.assertEqual(repr(ct2), 'typing.Callable[[str, float], int]')
478 ctv = Callable[..., str]
479 self.assertEqual(repr(ctv), 'typing.Callable[..., str]')
480
Guido van Rossumd70fe632015-08-05 12:11:06 +0200481 def test_callable_with_ellipsis(self):
482
483 def foo(a: Callable[..., T]):
484 pass
485
486 self.assertEqual(get_type_hints(foo, globals(), locals()),
487 {'a': Callable[..., T]})
488
Guido van Rossumefa798d2016-08-23 11:01:50 -0700489 def test_ellipsis_in_generic(self):
490 # Shouldn't crash; see https://github.com/python/typing/issues/259
491 typing.List[Callable[..., str]]
492
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700493
494XK = TypeVar('XK', str, bytes)
495XV = TypeVar('XV')
496
497
498class SimpleMapping(Generic[XK, XV]):
499
500 def __getitem__(self, key: XK) -> XV:
501 ...
502
503 def __setitem__(self, key: XK, value: XV):
504 ...
505
506 def get(self, key: XK, default: XV = None) -> XV:
507 ...
508
509
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700510class MySimpleMapping(SimpleMapping[XK, XV]):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700511
512 def __init__(self):
513 self.store = {}
514
515 def __getitem__(self, key: str):
516 return self.store[key]
517
518 def __setitem__(self, key: str, value):
519 self.store[key] = value
520
521 def get(self, key: str, default=None):
522 try:
523 return self.store[key]
524 except KeyError:
525 return default
526
527
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500528class ProtocolTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700529
530 def test_supports_int(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500531 self.assertIsSubclass(int, typing.SupportsInt)
532 self.assertNotIsSubclass(str, typing.SupportsInt)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700533
534 def test_supports_float(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500535 self.assertIsSubclass(float, typing.SupportsFloat)
536 self.assertNotIsSubclass(str, typing.SupportsFloat)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700537
538 def test_supports_complex(self):
539
540 # Note: complex itself doesn't have __complex__.
541 class C:
542 def __complex__(self):
543 return 0j
544
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500545 self.assertIsSubclass(C, typing.SupportsComplex)
546 self.assertNotIsSubclass(str, typing.SupportsComplex)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700547
548 def test_supports_bytes(self):
549
550 # Note: bytes itself doesn't have __bytes__.
551 class B:
552 def __bytes__(self):
553 return b''
554
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500555 self.assertIsSubclass(B, typing.SupportsBytes)
556 self.assertNotIsSubclass(str, typing.SupportsBytes)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700557
558 def test_supports_abs(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500559 self.assertIsSubclass(float, typing.SupportsAbs)
560 self.assertIsSubclass(int, typing.SupportsAbs)
561 self.assertNotIsSubclass(str, typing.SupportsAbs)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700562
563 def test_supports_round(self):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700564 issubclass(float, typing.SupportsRound)
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500565 self.assertIsSubclass(float, typing.SupportsRound)
566 self.assertIsSubclass(int, typing.SupportsRound)
567 self.assertNotIsSubclass(str, typing.SupportsRound)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700568
569 def test_reversible(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500570 self.assertIsSubclass(list, typing.Reversible)
571 self.assertNotIsSubclass(int, typing.Reversible)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700572
Guido van Rossumd70fe632015-08-05 12:11:06 +0200573 def test_protocol_instance_type_error(self):
574 with self.assertRaises(TypeError):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700575 isinstance(0, typing.SupportsAbs)
Guido van Rossumca4b2522016-11-19 10:32:41 -0800576 class C1(typing.SupportsInt):
577 def __int__(self) -> int:
578 return 42
579 class C2(C1):
580 pass
581 c = C2()
582 self.assertIsInstance(c, C1)
Guido van Rossumd70fe632015-08-05 12:11:06 +0200583
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700584
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500585class GenericTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700586
587 def test_basics(self):
588 X = SimpleMapping[str, Any]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500589 self.assertEqual(X.__parameters__, ())
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700590 with self.assertRaises(TypeError):
591 X[str]
592 with self.assertRaises(TypeError):
593 X[str, str]
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700594 Y = SimpleMapping[XK, str]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500595 self.assertEqual(Y.__parameters__, (XK,))
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700596 Y[str]
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700597 with self.assertRaises(TypeError):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700598 Y[str, str]
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100599 self.assertIsSubclass(SimpleMapping[str, int], SimpleMapping)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700600
Guido van Rossum4cefe742016-09-27 15:20:12 -0700601 def test_generic_errors(self):
Guido van Rossum62fe1bb2016-10-29 16:05:26 -0700602 T = TypeVar('T')
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100603 S = TypeVar('S')
Guido van Rossum62fe1bb2016-10-29 16:05:26 -0700604 with self.assertRaises(TypeError):
605 Generic[T]()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700606 with self.assertRaises(TypeError):
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100607 Generic[T][T]
608 with self.assertRaises(TypeError):
609 Generic[T][S]
610 with self.assertRaises(TypeError):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700611 isinstance([], List[int])
612 with self.assertRaises(TypeError):
613 issubclass(list, List[int])
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100614 with self.assertRaises(TypeError):
615 class NewGeneric(Generic): ...
616 with self.assertRaises(TypeError):
617 class MyGeneric(Generic[T], Generic[S]): ...
618 with self.assertRaises(TypeError):
619 class MyGeneric(List[T], Generic[S]): ...
Guido van Rossum4cefe742016-09-27 15:20:12 -0700620
Guido van Rossumd70fe632015-08-05 12:11:06 +0200621 def test_init(self):
622 T = TypeVar('T')
623 S = TypeVar('S')
624 with self.assertRaises(TypeError):
625 Generic[T, T]
626 with self.assertRaises(TypeError):
627 Generic[T, S, T]
628
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700629 def test_repr(self):
630 self.assertEqual(repr(SimpleMapping),
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700631 __name__ + '.' + 'SimpleMapping')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700632 self.assertEqual(repr(MySimpleMapping),
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700633 __name__ + '.' + 'MySimpleMapping')
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700634
635 def test_chain_repr(self):
636 T = TypeVar('T')
637 S = TypeVar('S')
638
639 class C(Generic[T]):
640 pass
641
642 X = C[Tuple[S, T]]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500643 self.assertEqual(X, C[Tuple[S, T]])
644 self.assertNotEqual(X, C[Tuple[T, S]])
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700645
646 Y = X[T, int]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500647 self.assertEqual(Y, X[T, int])
648 self.assertNotEqual(Y, X[S, int])
649 self.assertNotEqual(Y, X[T, str])
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700650
651 Z = Y[str]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500652 self.assertEqual(Z, Y[str])
653 self.assertNotEqual(Z, Y[int])
654 self.assertNotEqual(Z, Y[T])
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700655
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500656 self.assertTrue(str(Z).endswith(
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700657 '.C[typing.Tuple[str, int]]'))
658
659 def test_new_repr(self):
660 T = TypeVar('T')
661 U = TypeVar('U', covariant=True)
662 S = TypeVar('S')
663
664 self.assertEqual(repr(List), 'typing.List')
665 self.assertEqual(repr(List[T]), 'typing.List[~T]')
666 self.assertEqual(repr(List[U]), 'typing.List[+U]')
667 self.assertEqual(repr(List[S][T][int]), 'typing.List[int]')
668 self.assertEqual(repr(List[int]), 'typing.List[int]')
669
670 def test_new_repr_complex(self):
671 T = TypeVar('T')
672 TS = TypeVar('TS')
673
674 self.assertEqual(repr(typing.Mapping[T, TS][TS, T]), 'typing.Mapping[~TS, ~T]')
675 self.assertEqual(repr(List[Tuple[T, TS]][int, T]),
676 'typing.List[typing.Tuple[int, ~T]]')
Guido van Rossum95919c02017-01-22 17:47:20 -0800677 self.assertEqual(
678 repr(List[Tuple[T, T]][List[int]]),
679 'typing.List[typing.Tuple[typing.List[int], typing.List[int]]]'
680 )
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700681
682 def test_new_repr_bare(self):
683 T = TypeVar('T')
684 self.assertEqual(repr(Generic[T]), 'typing.Generic[~T]')
685 self.assertEqual(repr(typing._Protocol[T]), 'typing.Protocol[~T]')
686 class C(typing.Dict[Any, Any]): ...
687 # this line should just work
688 repr(C.__mro__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700689
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800690 def test_dict(self):
691 T = TypeVar('T')
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700692
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800693 class B(Generic[T]):
694 pass
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700695
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800696 b = B()
697 b.foo = 42
698 self.assertEqual(b.__dict__, {'foo': 42})
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700699
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800700 class C(B[int]):
701 pass
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700702
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800703 c = C()
704 c.bar = 'abc'
705 self.assertEqual(c.__dict__, {'bar': 'abc'})
706
Ivan Levkivskyiabb3b8a2017-02-24 04:03:28 +0100707 def test_subscripted_generics_as_proxies(self):
708 T = TypeVar('T')
709 class C(Generic[T]):
710 x = 'def'
711 self.assertEqual(C[int].x, 'def')
712 self.assertEqual(C[C[int]].x, 'def')
713 C[C[int]].x = 'changed'
714 self.assertEqual(C.x, 'changed')
715 self.assertEqual(C[str].x, 'changed')
716 C[List[str]].z = 'new'
717 self.assertEqual(C.z, 'new')
718 self.assertEqual(C[Tuple[int]].z, 'new')
719
720 self.assertEqual(C().x, 'changed')
721 self.assertEqual(C[Tuple[str]]().z, 'new')
722
723 class D(C[T]):
724 pass
725 self.assertEqual(D[int].x, 'changed')
726 self.assertEqual(D.z, 'new')
727 D.z = 'from derived z'
728 D[int].x = 'from derived x'
729 self.assertEqual(C.x, 'changed')
730 self.assertEqual(C[int].z, 'new')
731 self.assertEqual(D.x, 'from derived x')
732 self.assertEqual(D[str].z, 'from derived z')
733
Ivan Levkivskyi365cb5b2017-02-24 18:28:26 +0100734 def test_abc_registry_kept(self):
735 T = TypeVar('T')
736 class C(Generic[T]): ...
737 C.register(int)
738 self.assertIsInstance(1, C)
739 C[int]
740 self.assertIsInstance(1, C)
741
Guido van Rossum4cefe742016-09-27 15:20:12 -0700742 def test_false_subclasses(self):
743 class MyMapping(MutableMapping[str, str]): pass
744 self.assertNotIsInstance({}, MyMapping)
745 self.assertNotIsSubclass(dict, MyMapping)
746
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700747 def test_abc_bases(self):
748 class MM(MutableMapping[str, str]):
749 def __getitem__(self, k):
750 return None
751 def __setitem__(self, k, v):
752 pass
753 def __delitem__(self, k):
754 pass
755 def __iter__(self):
756 return iter(())
757 def __len__(self):
758 return 0
759 # this should just work
760 MM().update()
761 self.assertIsInstance(MM(), collections_abc.MutableMapping)
762 self.assertIsInstance(MM(), MutableMapping)
763 self.assertNotIsInstance(MM(), List)
764 self.assertNotIsInstance({}, MM)
765
766 def test_multiple_bases(self):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700767 class MM1(MutableMapping[str, str], collections_abc.MutableMapping):
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700768 pass
769 with self.assertRaises(TypeError):
770 # consistent MRO not possible
771 class MM2(collections_abc.MutableMapping, MutableMapping[str, str]):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700772 pass
Guido van Rossum4cefe742016-09-27 15:20:12 -0700773
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700774 def test_orig_bases(self):
775 T = TypeVar('T')
776 class C(typing.Dict[str, T]): ...
777 self.assertEqual(C.__orig_bases__, (typing.Dict[str, T],))
778
779 def test_naive_runtime_checks(self):
780 def naive_dict_check(obj, tp):
781 # Check if a dictionary conforms to Dict type
782 if len(tp.__parameters__) > 0:
783 raise NotImplementedError
784 if tp.__args__:
785 KT, VT = tp.__args__
Guido van Rossum95919c02017-01-22 17:47:20 -0800786 return all(
787 isinstance(k, KT) and isinstance(v, VT)
788 for k, v in obj.items()
789 )
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700790 self.assertTrue(naive_dict_check({'x': 1}, typing.Dict[str, int]))
791 self.assertFalse(naive_dict_check({1: 'x'}, typing.Dict[str, int]))
792 with self.assertRaises(NotImplementedError):
793 naive_dict_check({1: 'x'}, typing.Dict[str, T])
794
795 def naive_generic_check(obj, tp):
796 # Check if an instance conforms to the generic class
797 if not hasattr(obj, '__orig_class__'):
798 raise NotImplementedError
799 return obj.__orig_class__ == tp
800 class Node(Generic[T]): ...
801 self.assertTrue(naive_generic_check(Node[int](), Node[int]))
802 self.assertFalse(naive_generic_check(Node[str](), Node[int]))
803 self.assertFalse(naive_generic_check(Node[str](), List))
804 with self.assertRaises(NotImplementedError):
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800805 naive_generic_check([1, 2, 3], Node[int])
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700806
807 def naive_list_base_check(obj, tp):
808 # Check if list conforms to a List subclass
809 return all(isinstance(x, tp.__orig_bases__[0].__args__[0])
810 for x in obj)
811 class C(List[int]): ...
812 self.assertTrue(naive_list_base_check([1, 2, 3], C))
813 self.assertFalse(naive_list_base_check(['a', 'b'], C))
814
815 def test_multi_subscr_base(self):
816 T = TypeVar('T')
817 U = TypeVar('U')
818 V = TypeVar('V')
819 class C(List[T][U][V]): ...
820 class D(C, List[T][U][V]): ...
821 self.assertEqual(C.__parameters__, (V,))
822 self.assertEqual(D.__parameters__, (V,))
823 self.assertEqual(C[int].__parameters__, ())
824 self.assertEqual(D[int].__parameters__, ())
825 self.assertEqual(C[int].__args__, (int,))
826 self.assertEqual(D[int].__args__, (int,))
827 self.assertEqual(C.__bases__, (List,))
828 self.assertEqual(D.__bases__, (C, List))
829 self.assertEqual(C.__orig_bases__, (List[T][U][V],))
830 self.assertEqual(D.__orig_bases__, (C, List[T][U][V]))
831
Guido van Rossum83ec3022017-01-17 20:43:28 -0800832 def test_subscript_meta(self):
833 T = TypeVar('T')
834 self.assertEqual(Type[GenericMeta], Type[GenericMeta])
835 self.assertEqual(Union[T, int][GenericMeta], Union[GenericMeta, int])
836 self.assertEqual(Callable[..., GenericMeta].__args__, (Ellipsis, GenericMeta))
837
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100838 def test_generic_hashes(self):
839 try:
840 from test import mod_generics_cache
841 except ImportError: # for Python 3.4 and previous versions
842 import mod_generics_cache
843 class A(Generic[T]):
844 ...
845
846 class B(Generic[T]):
847 class A(Generic[T]):
848 ...
849
850 self.assertEqual(A, A)
851 self.assertEqual(mod_generics_cache.A[str], mod_generics_cache.A[str])
852 self.assertEqual(B.A, B.A)
853 self.assertEqual(mod_generics_cache.B.A[B.A[str]],
854 mod_generics_cache.B.A[B.A[str]])
855
856 self.assertNotEqual(A, B.A)
857 self.assertNotEqual(A, mod_generics_cache.A)
858 self.assertNotEqual(A, mod_generics_cache.B.A)
859 self.assertNotEqual(B.A, mod_generics_cache.A)
860 self.assertNotEqual(B.A, mod_generics_cache.B.A)
861
862 self.assertNotEqual(A[str], B.A[str])
863 self.assertNotEqual(A[List[Any]], B.A[List[Any]])
864 self.assertNotEqual(A[str], mod_generics_cache.A[str])
865 self.assertNotEqual(A[str], mod_generics_cache.B.A[str])
866 self.assertNotEqual(B.A[int], mod_generics_cache.A[int])
867 self.assertNotEqual(B.A[List[Any]], mod_generics_cache.B.A[List[Any]])
868
869 self.assertNotEqual(Tuple[A[str]], Tuple[B.A[str]])
870 self.assertNotEqual(Tuple[A[List[Any]]], Tuple[B.A[List[Any]]])
871 self.assertNotEqual(Union[str, A[str]], Union[str, mod_generics_cache.A[str]])
872 self.assertNotEqual(Union[A[str], A[str]],
873 Union[A[str], mod_generics_cache.A[str]])
874 self.assertNotEqual(typing.FrozenSet[A[str]],
875 typing.FrozenSet[mod_generics_cache.B.A[str]])
876
877 if sys.version_info[:2] > (3, 2):
878 self.assertTrue(repr(Tuple[A[str]]).endswith('<locals>.A[str]]'))
879 self.assertTrue(repr(Tuple[B.A[str]]).endswith('<locals>.B.A[str]]'))
880 self.assertTrue(repr(Tuple[mod_generics_cache.A[str]])
881 .endswith('mod_generics_cache.A[str]]'))
882 self.assertTrue(repr(Tuple[mod_generics_cache.B.A[str]])
883 .endswith('mod_generics_cache.B.A[str]]'))
884
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700885 def test_extended_generic_rules_eq(self):
886 T = TypeVar('T')
887 U = TypeVar('U')
888 self.assertEqual(Tuple[T, T][int], Tuple[int, int])
889 self.assertEqual(typing.Iterable[Tuple[T, T]][T], typing.Iterable[Tuple[T, T]])
890 with self.assertRaises(TypeError):
891 Tuple[T, int][()]
892 with self.assertRaises(TypeError):
893 Tuple[T, U][T, ...]
894
895 self.assertEqual(Union[T, int][int], int)
896 self.assertEqual(Union[T, U][int, Union[int, str]], Union[int, str])
897 class Base: ...
898 class Derived(Base): ...
899 self.assertEqual(Union[T, Base][Derived], Base)
900 with self.assertRaises(TypeError):
901 Union[T, int][1]
902
903 self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT])
904 self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]])
905 with self.assertRaises(TypeError):
906 Callable[[T], U][..., int]
907 with self.assertRaises(TypeError):
908 Callable[[T], U][[], int]
909
910 def test_extended_generic_rules_repr(self):
911 T = TypeVar('T')
912 self.assertEqual(repr(Union[Tuple, Callable]).replace('typing.', ''),
913 'Union[Tuple, Callable]')
914 self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
915 'Tuple')
916 self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
917 'Callable[..., Union[int, NoneType]]')
918 self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
919 'Callable[[], List[int]]')
920
Guido van Rossumf9099de2016-11-09 13:18:59 -0800921 def test_generic_forward_ref(self):
922 def foobar(x: List[List['CC']]): ...
923 class CC: ...
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800924 self.assertEqual(
925 get_type_hints(foobar, globals(), locals()),
926 {'x': List[List[CC]]}
927 )
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700928 T = TypeVar('T')
Guido van Rossumca4b2522016-11-19 10:32:41 -0800929 AT = Tuple[T, ...]
930 def barfoo(x: AT): ...
931 self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], AT)
932 CT = Callable[..., List[T]]
933 def barfoo2(x: CT): ...
934 self.assertIs(get_type_hints(barfoo2, globals(), locals())['x'], CT)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700935
936 def test_extended_generic_rules_subclassing(self):
937 class T1(Tuple[T, KT]): ...
938 class T2(Tuple[T, ...]): ...
939 class C1(Callable[[T], T]): ...
940 class C2(Callable[..., int]):
941 def __call__(self):
942 return None
943
944 self.assertEqual(T1.__parameters__, (T, KT))
945 self.assertEqual(T1[int, str].__args__, (int, str))
946 self.assertEqual(T1[int, T].__origin__, T1)
947
948 self.assertEqual(T2.__parameters__, (T,))
949 with self.assertRaises(TypeError):
950 T1[int]
951 with self.assertRaises(TypeError):
952 T2[int, str]
953
954 self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]')
955 self.assertEqual(C2.__parameters__, ())
956 self.assertIsInstance(C2(), collections_abc.Callable)
957 self.assertIsSubclass(C2, collections_abc.Callable)
958 self.assertIsSubclass(C1, collections_abc.Callable)
959 self.assertIsInstance(T1(), tuple)
960 self.assertIsSubclass(T2, tuple)
961 self.assertIsSubclass(Tuple[int, ...], typing.Sequence)
962 self.assertIsSubclass(Tuple[int, ...], typing.Iterable)
963
964 def test_fail_with_bare_union(self):
965 with self.assertRaises(TypeError):
966 List[Union]
967 with self.assertRaises(TypeError):
968 Tuple[Optional]
969 with self.assertRaises(TypeError):
970 ClassVar[ClassVar]
971 with self.assertRaises(TypeError):
972 List[ClassVar[int]]
973
974 def test_fail_with_bare_generic(self):
975 T = TypeVar('T')
976 with self.assertRaises(TypeError):
977 List[Generic]
978 with self.assertRaises(TypeError):
979 Tuple[Generic[T]]
980 with self.assertRaises(TypeError):
981 List[typing._Protocol]
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100982 with self.assertRaises(TypeError):
983 isinstance(1, Generic)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700984
985 def test_type_erasure_special(self):
986 T = TypeVar('T')
Guido van Rossumca4b2522016-11-19 10:32:41 -0800987 # this is the only test that checks type caching
988 self.clear_caches()
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700989 class MyTup(Tuple[T, T]): ...
990 self.assertIs(MyTup[int]().__class__, MyTup)
991 self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
992 class MyCall(Callable[..., T]):
993 def __call__(self): return None
994 self.assertIs(MyCall[T]().__class__, MyCall)
995 self.assertIs(MyCall[T]().__orig_class__, MyCall[T])
996 class MyDict(typing.Dict[T, T]): ...
997 self.assertIs(MyDict[int]().__class__, MyDict)
998 self.assertIs(MyDict[int]().__orig_class__, MyDict[int])
999 class MyDef(typing.DefaultDict[str, T]): ...
1000 self.assertIs(MyDef[int]().__class__, MyDef)
1001 self.assertIs(MyDef[int]().__orig_class__, MyDef[int])
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001002 # ChainMap was added in 3.3
1003 if sys.version_info >= (3, 3):
1004 class MyChain(typing.ChainMap[str, T]): ...
1005 self.assertIs(MyChain[int]().__class__, MyChain)
1006 self.assertIs(MyChain[int]().__orig_class__, MyChain[int])
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001007
1008 def test_all_repr_eq_any(self):
1009 objs = (getattr(typing, el) for el in typing.__all__)
1010 for obj in objs:
1011 self.assertNotEqual(repr(obj), '')
1012 self.assertEqual(obj, obj)
1013 if getattr(obj, '__parameters__', None) and len(obj.__parameters__) == 1:
1014 self.assertEqual(obj[Any].__args__, (Any,))
1015 if isinstance(obj, type):
1016 for base in obj.__mro__:
1017 self.assertNotEqual(repr(base), '')
1018 self.assertEqual(base, base)
1019
1020 def test_substitution_helper(self):
1021 T = TypeVar('T')
1022 KT = TypeVar('KT')
1023 VT = TypeVar('VT')
1024 class Map(Generic[KT, VT]):
1025 def meth(self, k: KT, v: VT): ...
1026 StrMap = Map[str, T]
1027 obj = StrMap[int]()
1028
1029 new_args = typing._subs_tree(obj.__orig_class__)
1030 new_annots = {k: typing._replace_arg(v, type(obj).__parameters__, new_args)
1031 for k, v in obj.meth.__annotations__.items()}
1032
1033 self.assertEqual(new_annots, {'k': str, 'v': int})
Guido van Rossum7ef22d62016-10-21 14:27:58 -07001034
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001035 def test_pickle(self):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001036 global C # pickle wants to reference the class by name
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001037 T = TypeVar('T')
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001038
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001039 class B(Generic[T]):
1040 pass
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001041
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001042 class C(B[int]):
1043 pass
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001044
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001045 c = C()
1046 c.foo = 42
1047 c.bar = 'abc'
Serhiy Storchaka6d9e9232015-11-20 18:33:02 +02001048 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1049 z = pickle.dumps(c, proto)
1050 x = pickle.loads(z)
1051 self.assertEqual(x.foo, 42)
1052 self.assertEqual(x.bar, 'abc')
1053 self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
Guido van Rossumb7dedc82016-10-29 12:44:29 -07001054 simples = [Any, Union, Tuple, Callable, ClassVar, List, typing.Iterable]
1055 for s in simples:
1056 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1057 z = pickle.dumps(s, proto)
1058 x = pickle.loads(z)
1059 self.assertEqual(s, x)
1060
1061 def test_copy_and_deepcopy(self):
1062 T = TypeVar('T')
1063 class Node(Generic[T]): ...
1064 things = [Union[T, int], Tuple[T, int], Callable[..., T], Callable[[int], int],
1065 Tuple[Any, Any], Node[T], Node[int], Node[Any], typing.Iterable[T],
1066 typing.Iterable[Any], typing.Iterable[int], typing.Dict[int, str],
1067 typing.Dict[T, Any], ClassVar[int], ClassVar[List[T]], Tuple['T', 'T'],
1068 Union['T', int], List['T'], typing.Mapping['T', int]]
1069 for t in things + [Any]:
1070 self.assertEqual(t, copy(t))
1071 self.assertEqual(t, deepcopy(t))
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001072
Guido van Rossum83ec3022017-01-17 20:43:28 -08001073 def test_weakref_all(self):
1074 T = TypeVar('T')
1075 things = [Any, Union[T, int], Callable[..., T], Tuple[Any, Any],
1076 Optional[List[int]], typing.Mapping[int, str],
1077 typing.re.Match[bytes], typing.Iterable['whatever']]
1078 for t in things:
1079 self.assertEqual(weakref.ref(t)(), t)
1080
Guido van Rossum61f0a022016-11-29 09:46:21 -08001081 def test_parameterized_slots(self):
1082 T = TypeVar('T')
1083 class C(Generic[T]):
1084 __slots__ = ('potato',)
1085
1086 c = C()
1087 c_int = C[int]()
1088 self.assertEqual(C.__slots__, C[str].__slots__)
1089
1090 c.potato = 0
1091 c_int.potato = 0
1092 with self.assertRaises(AttributeError):
1093 c.tomato = 0
1094 with self.assertRaises(AttributeError):
1095 c_int.tomato = 0
1096
1097 def foo(x: C['C']): ...
1098 self.assertEqual(get_type_hints(foo, globals(), locals())['x'], C[C])
1099 self.assertEqual(get_type_hints(foo, globals(), locals())['x'].__slots__,
1100 C.__slots__)
1101 self.assertEqual(copy(C[int]), deepcopy(C[int]))
1102
1103 def test_parameterized_slots_dict(self):
1104 T = TypeVar('T')
1105 class D(Generic[T]):
1106 __slots__ = {'banana': 42}
1107
1108 d = D()
1109 d_int = D[int]()
1110 self.assertEqual(D.__slots__, D[str].__slots__)
1111
1112 d.banana = 'yes'
1113 d_int.banana = 'yes'
1114 with self.assertRaises(AttributeError):
1115 d.foobar = 'no'
1116 with self.assertRaises(AttributeError):
1117 d_int.foobar = 'no'
1118
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001119 def test_errors(self):
1120 with self.assertRaises(TypeError):
1121 B = SimpleMapping[XK, Any]
1122
1123 class C(Generic[B]):
1124 pass
1125
1126 def test_repr_2(self):
1127 PY32 = sys.version_info[:2] < (3, 3)
1128
1129 class C(Generic[T]):
1130 pass
1131
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001132 self.assertEqual(C.__module__, __name__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001133 if not PY32:
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001134 self.assertEqual(C.__qualname__,
1135 'GenericTests.test_repr_2.<locals>.C')
Guido van Rossum7ef22d62016-10-21 14:27:58 -07001136 self.assertEqual(repr(C).split('.')[-1], 'C')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001137 X = C[int]
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001138 self.assertEqual(X.__module__, __name__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001139 if not PY32:
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001140 self.assertTrue(X.__qualname__.endswith('.<locals>.C'))
Guido van Rossum7ef22d62016-10-21 14:27:58 -07001141 self.assertEqual(repr(X).split('.')[-1], 'C[int]')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001142
1143 class Y(C[int]):
1144 pass
1145
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001146 self.assertEqual(Y.__module__, __name__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001147 if not PY32:
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001148 self.assertEqual(Y.__qualname__,
1149 'GenericTests.test_repr_2.<locals>.Y')
1150 self.assertEqual(repr(Y).split('.')[-1], 'Y')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001151
1152 def test_eq_1(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001153 self.assertEqual(Generic, Generic)
1154 self.assertEqual(Generic[T], Generic[T])
1155 self.assertNotEqual(Generic[KT], Generic[VT])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001156
1157 def test_eq_2(self):
1158
1159 class A(Generic[T]):
1160 pass
1161
1162 class B(Generic[T]):
1163 pass
1164
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001165 self.assertEqual(A, A)
1166 self.assertNotEqual(A, B)
1167 self.assertEqual(A[T], A[T])
1168 self.assertNotEqual(A[T], B[T])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001169
1170 def test_multiple_inheritance(self):
1171
1172 class A(Generic[T, VT]):
1173 pass
1174
1175 class B(Generic[KT, T]):
1176 pass
1177
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001178 class C(A[T, VT], Generic[VT, T, KT], B[KT, T]):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001179 pass
1180
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001181 self.assertEqual(C.__parameters__, (VT, T, KT))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001182
1183 def test_nested(self):
1184
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001185 G = Generic
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001186
1187 class Visitor(G[T]):
1188
1189 a = None
1190
1191 def set(self, a: T):
1192 self.a = a
1193
1194 def get(self):
1195 return self.a
1196
1197 def visit(self) -> T:
1198 return self.a
1199
1200 V = Visitor[typing.List[int]]
1201
1202 class IntListVisitor(V):
1203
1204 def append(self, x: int):
1205 self.a.append(x)
1206
1207 a = IntListVisitor()
1208 a.set([])
1209 a.append(1)
1210 a.append(42)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001211 self.assertEqual(a.get(), [1, 42])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001212
1213 def test_type_erasure(self):
1214 T = TypeVar('T')
1215
1216 class Node(Generic[T]):
Guido van Rossum1b669102015-09-04 12:15:54 -07001217 def __init__(self, label: T,
1218 left: 'Node[T]' = None,
1219 right: 'Node[T]' = None):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001220 self.label = label # type: T
1221 self.left = left # type: Optional[Node[T]]
1222 self.right = right # type: Optional[Node[T]]
1223
1224 def foo(x: T):
1225 a = Node(x)
1226 b = Node[T](x)
1227 c = Node[Any](x)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001228 self.assertIs(type(a), Node)
1229 self.assertIs(type(b), Node)
1230 self.assertIs(type(c), Node)
1231 self.assertEqual(a.label, x)
1232 self.assertEqual(b.label, x)
1233 self.assertEqual(c.label, x)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001234
1235 foo(42)
1236
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001237 def test_implicit_any(self):
1238 T = TypeVar('T')
1239
1240 class C(Generic[T]):
1241 pass
1242
1243 class D(C):
1244 pass
1245
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001246 self.assertEqual(D.__parameters__, ())
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001247
1248 with self.assertRaises(Exception):
1249 D[int]
1250 with self.assertRaises(Exception):
1251 D[Any]
1252 with self.assertRaises(Exception):
1253 D[T]
1254
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001255
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001256class ClassVarTests(BaseTestCase):
1257
1258 def test_basics(self):
1259 with self.assertRaises(TypeError):
1260 ClassVar[1]
1261 with self.assertRaises(TypeError):
1262 ClassVar[int, str]
1263 with self.assertRaises(TypeError):
1264 ClassVar[int][str]
1265
1266 def test_repr(self):
1267 self.assertEqual(repr(ClassVar), 'typing.ClassVar')
1268 cv = ClassVar[int]
1269 self.assertEqual(repr(cv), 'typing.ClassVar[int]')
1270 cv = ClassVar[Employee]
1271 self.assertEqual(repr(cv), 'typing.ClassVar[%s.Employee]' % __name__)
1272
1273 def test_cannot_subclass(self):
1274 with self.assertRaises(TypeError):
1275 class C(type(ClassVar)):
1276 pass
1277 with self.assertRaises(TypeError):
1278 class C(type(ClassVar[int])):
1279 pass
1280
1281 def test_cannot_init(self):
1282 with self.assertRaises(TypeError):
Guido van Rossum4cefe742016-09-27 15:20:12 -07001283 ClassVar()
1284 with self.assertRaises(TypeError):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001285 type(ClassVar)()
1286 with self.assertRaises(TypeError):
1287 type(ClassVar[Optional[int]])()
1288
1289 def test_no_isinstance(self):
1290 with self.assertRaises(TypeError):
1291 isinstance(1, ClassVar[int])
1292 with self.assertRaises(TypeError):
1293 issubclass(int, ClassVar)
1294
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001295
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001296class CastTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001297
1298 def test_basics(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001299 self.assertEqual(cast(int, 42), 42)
1300 self.assertEqual(cast(float, 42), 42)
1301 self.assertIs(type(cast(float, 42)), int)
1302 self.assertEqual(cast(Any, 42), 42)
1303 self.assertEqual(cast(list, 42), 42)
1304 self.assertEqual(cast(Union[str, float], 42), 42)
1305 self.assertEqual(cast(AnyStr, 42), 42)
1306 self.assertEqual(cast(None, 42), 42)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001307
1308 def test_errors(self):
1309 # Bogus calls are not expected to fail.
1310 cast(42, 42)
1311 cast('hello', 42)
1312
1313
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001314class ForwardRefTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001315
1316 def test_basics(self):
1317
1318 class Node(Generic[T]):
1319
1320 def __init__(self, label: T):
1321 self.label = label
1322 self.left = self.right = None
1323
1324 def add_both(self,
1325 left: 'Optional[Node[T]]',
1326 right: 'Node[T]' = None,
1327 stuff: int = None,
1328 blah=None):
1329 self.left = left
1330 self.right = right
1331
1332 def add_left(self, node: Optional['Node[T]']):
1333 self.add_both(node, None)
1334
1335 def add_right(self, node: 'Node[T]' = None):
1336 self.add_both(None, node)
1337
1338 t = Node[int]
1339 both_hints = get_type_hints(t.add_both, globals(), locals())
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001340 self.assertEqual(both_hints['left'], Optional[Node[T]])
1341 self.assertEqual(both_hints['right'], Optional[Node[T]])
1342 self.assertEqual(both_hints['left'], both_hints['right'])
1343 self.assertEqual(both_hints['stuff'], Optional[int])
1344 self.assertNotIn('blah', both_hints)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001345
1346 left_hints = get_type_hints(t.add_left, globals(), locals())
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001347 self.assertEqual(left_hints['node'], Optional[Node[T]])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001348
1349 right_hints = get_type_hints(t.add_right, globals(), locals())
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001350 self.assertEqual(right_hints['node'], Optional[Node[T]])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001351
Guido van Rossumd70fe632015-08-05 12:11:06 +02001352 def test_forwardref_instance_type_error(self):
1353 fr = typing._ForwardRef('int')
1354 with self.assertRaises(TypeError):
1355 isinstance(42, fr)
1356
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001357 def test_forwardref_subclass_type_error(self):
1358 fr = typing._ForwardRef('int')
1359 with self.assertRaises(TypeError):
1360 issubclass(int, fr)
1361
1362 def test_forward_equality(self):
1363 fr = typing._ForwardRef('int')
1364 self.assertEqual(fr, typing._ForwardRef('int'))
1365 self.assertNotEqual(List['int'], List[int])
1366
1367 def test_forward_repr(self):
1368 self.assertEqual(repr(List['int']), "typing.List[_ForwardRef('int')]")
1369
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001370 def test_union_forward(self):
1371
1372 def foo(a: Union['T']):
1373 pass
1374
1375 self.assertEqual(get_type_hints(foo, globals(), locals()),
1376 {'a': Union[T]})
1377
1378 def test_tuple_forward(self):
1379
1380 def foo(a: Tuple['T']):
1381 pass
1382
1383 self.assertEqual(get_type_hints(foo, globals(), locals()),
1384 {'a': Tuple[T]})
1385
1386 def test_callable_forward(self):
1387
1388 def foo(a: Callable[['T'], 'T']):
1389 pass
1390
1391 self.assertEqual(get_type_hints(foo, globals(), locals()),
1392 {'a': Callable[[T], T]})
1393
Guido van Rossumd70fe632015-08-05 12:11:06 +02001394 def test_callable_with_ellipsis_forward(self):
1395
1396 def foo(a: 'Callable[..., T]'):
1397 pass
1398
1399 self.assertEqual(get_type_hints(foo, globals(), locals()),
1400 {'a': Callable[..., T]})
1401
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001402 def test_syntax_error(self):
1403
1404 with self.assertRaises(SyntaxError):
1405 Generic['/T']
1406
1407 def test_delayed_syntax_error(self):
1408
1409 def foo(a: 'Node[T'):
1410 pass
1411
1412 with self.assertRaises(SyntaxError):
1413 get_type_hints(foo)
1414
1415 def test_type_error(self):
1416
1417 def foo(a: Tuple['42']):
1418 pass
1419
1420 with self.assertRaises(TypeError):
1421 get_type_hints(foo)
1422
1423 def test_name_error(self):
1424
1425 def foo(a: 'Noode[T]'):
1426 pass
1427
1428 with self.assertRaises(NameError):
1429 get_type_hints(foo, locals())
1430
1431 def test_no_type_check(self):
1432
1433 @no_type_check
1434 def foo(a: 'whatevers') -> {}:
1435 pass
1436
1437 th = get_type_hints(foo)
1438 self.assertEqual(th, {})
1439
1440 def test_no_type_check_class(self):
1441
1442 @no_type_check
1443 class C:
1444 def foo(a: 'whatevers') -> {}:
1445 pass
1446
1447 cth = get_type_hints(C.foo)
1448 self.assertEqual(cth, {})
1449 ith = get_type_hints(C().foo)
1450 self.assertEqual(ith, {})
1451
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001452 def test_no_type_check_no_bases(self):
1453 class C:
1454 def meth(self, x: int): ...
1455 @no_type_check
1456 class D(C):
1457 c = C
1458 # verify that @no_type_check never affects bases
1459 self.assertEqual(get_type_hints(C.meth), {'x': int})
1460
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001461 def test_meta_no_type_check(self):
1462
1463 @no_type_check_decorator
1464 def magic_decorator(deco):
1465 return deco
1466
1467 self.assertEqual(magic_decorator.__name__, 'magic_decorator')
1468
1469 @magic_decorator
1470 def foo(a: 'whatevers') -> {}:
1471 pass
1472
1473 @magic_decorator
1474 class C:
1475 def foo(a: 'whatevers') -> {}:
1476 pass
1477
1478 self.assertEqual(foo.__name__, 'foo')
1479 th = get_type_hints(foo)
1480 self.assertEqual(th, {})
1481 cth = get_type_hints(C.foo)
1482 self.assertEqual(cth, {})
1483 ith = get_type_hints(C().foo)
1484 self.assertEqual(ith, {})
1485
1486 def test_default_globals(self):
1487 code = ("class C:\n"
1488 " def foo(self, a: 'C') -> 'D': pass\n"
1489 "class D:\n"
1490 " def bar(self, b: 'D') -> C: pass\n"
1491 )
1492 ns = {}
1493 exec(code, ns)
1494 hints = get_type_hints(ns['C'].foo)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001495 self.assertEqual(hints, {'a': ns['C'], 'return': ns['D']})
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001496
1497
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001498class OverloadTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001499
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001500 def test_overload_fails(self):
1501 from typing import overload
1502
1503 with self.assertRaises(RuntimeError):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001504
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001505 @overload
1506 def blah():
1507 pass
1508
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001509 blah()
1510
1511 def test_overload_succeeds(self):
1512 from typing import overload
1513
1514 @overload
1515 def blah():
1516 pass
1517
1518 def blah():
1519 pass
1520
1521 blah()
1522
1523
Guido van Rossumac353df2016-10-21 16:12:17 -07001524ASYNCIO = sys.version_info[:2] >= (3, 5)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001525
Guido van Rossumac353df2016-10-21 16:12:17 -07001526ASYNCIO_TESTS = """
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001527import asyncio
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001528
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001529T_a = TypeVar('T_a')
Guido van Rossumf17c2002015-12-03 17:31:24 -08001530
Guido van Rossumf17c2002015-12-03 17:31:24 -08001531class AwaitableWrapper(typing.Awaitable[T_a]):
1532
1533 def __init__(self, value):
1534 self.value = value
1535
1536 def __await__(self) -> typing.Iterator[T_a]:
1537 yield
1538 return self.value
1539
Guido van Rossumf17c2002015-12-03 17:31:24 -08001540class AsyncIteratorWrapper(typing.AsyncIterator[T_a]):
1541
1542 def __init__(self, value: typing.Iterable[T_a]):
1543 self.value = value
1544
1545 def __aiter__(self) -> typing.AsyncIterator[T_a]:
1546 return self
1547
1548 @asyncio.coroutine
1549 def __anext__(self) -> T_a:
1550 data = yield from self.value
1551 if data:
1552 return data
1553 else:
1554 raise StopAsyncIteration
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02001555
1556class ACM:
1557 async def __aenter__(self) -> int:
1558 return 42
1559 async def __aexit__(self, etype, eval, tb):
1560 return None
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001561"""
1562
Guido van Rossumac353df2016-10-21 16:12:17 -07001563if ASYNCIO:
1564 try:
1565 exec(ASYNCIO_TESTS)
1566 except ImportError:
1567 ASYNCIO = False
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001568else:
1569 # fake names for the sake of static analysis
1570 asyncio = None
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02001571 AwaitableWrapper = AsyncIteratorWrapper = ACM = object
Guido van Rossumf17c2002015-12-03 17:31:24 -08001572
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001573PY36 = sys.version_info[:2] >= (3, 6)
1574
1575PY36_TESTS = """
1576from test import ann_module, ann_module2, ann_module3
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02001577from typing import AsyncContextManager
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001578
Guido van Rossum991d14f2016-11-09 13:12:51 -08001579class A:
1580 y: float
1581class B(A):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001582 x: ClassVar[Optional['B']] = None
1583 y: int
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001584 b: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001585class CSub(B):
1586 z: ClassVar['CSub'] = B()
1587class G(Generic[T]):
1588 lst: ClassVar[List[T]] = []
1589
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001590class NoneAndForward:
1591 parent: 'NoneAndForward'
1592 meaning: None
1593
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001594class CoolEmployee(NamedTuple):
1595 name: str
1596 cool: int
Guido van Rossum3c268be2017-01-18 08:03:50 -08001597
1598class CoolEmployeeWithDefault(NamedTuple):
1599 name: str
1600 cool: int = 0
Guido van Rossum95919c02017-01-22 17:47:20 -08001601
1602class XMeth(NamedTuple):
1603 x: int
1604 def double(self):
1605 return 2 * self.x
1606
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001607class XRepr(NamedTuple):
Guido van Rossum95919c02017-01-22 17:47:20 -08001608 x: int
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001609 y: int = 1
1610 def __str__(self):
1611 return f'{self.x} -> {self.y}'
1612 def __add__(self, other):
1613 return 0
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02001614
1615async def g_with(am: AsyncContextManager[int]):
1616 x: int
1617 async with am as x:
1618 return x
1619
1620try:
1621 g_with(ACM()).send(None)
1622except StopIteration as e:
1623 assert e.args[0] == 42
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001624"""
1625
1626if PY36:
1627 exec(PY36_TESTS)
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001628else:
1629 # fake names for the sake of static analysis
1630 ann_module = ann_module2 = ann_module3 = None
1631 A = B = CSub = G = CoolEmployee = CoolEmployeeWithDefault = object
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001632 XMeth = XRepr = NoneAndForward = object
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001633
1634gth = get_type_hints
1635
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001636
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001637class GetTypeHintTests(BaseTestCase):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001638 def test_get_type_hints_from_various_objects(self):
1639 # For invalid objects should fail with TypeError (not AttributeError etc).
1640 with self.assertRaises(TypeError):
1641 gth(123)
1642 with self.assertRaises(TypeError):
1643 gth('abc')
1644 with self.assertRaises(TypeError):
1645 gth(None)
1646
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001647 @skipUnless(PY36, 'Python 3.6 required')
1648 def test_get_type_hints_modules(self):
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001649 ann_module_type_hints = {1: 2, 'f': Tuple[int, int], 'x': int, 'y': str}
1650 self.assertEqual(gth(ann_module), ann_module_type_hints)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001651 self.assertEqual(gth(ann_module2), {})
1652 self.assertEqual(gth(ann_module3), {})
1653
1654 @skipUnless(PY36, 'Python 3.6 required')
1655 def test_get_type_hints_classes(self):
1656 self.assertEqual(gth(ann_module.C, ann_module.__dict__),
Guido van Rossum991d14f2016-11-09 13:12:51 -08001657 {'y': Optional[ann_module.C]})
1658 self.assertIsInstance(gth(ann_module.j_class), dict)
1659 self.assertEqual(gth(ann_module.M), {'123': 123, 'o': type})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001660 self.assertEqual(gth(ann_module.D),
Guido van Rossum991d14f2016-11-09 13:12:51 -08001661 {'j': str, 'k': str, 'y': Optional[ann_module.C]})
1662 self.assertEqual(gth(ann_module.Y), {'z': int})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001663 self.assertEqual(gth(ann_module.h_class),
Guido van Rossum991d14f2016-11-09 13:12:51 -08001664 {'y': Optional[ann_module.C]})
1665 self.assertEqual(gth(ann_module.S), {'x': str, 'y': str})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001666 self.assertEqual(gth(ann_module.foo), {'x': int})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001667 self.assertEqual(gth(NoneAndForward, globals()),
1668 {'parent': NoneAndForward, 'meaning': type(None)})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001669
1670 @skipUnless(PY36, 'Python 3.6 required')
1671 def test_respect_no_type_check(self):
1672 @no_type_check
1673 class NoTpCheck:
1674 class Inn:
1675 def __init__(self, x: 'not a type'): ...
1676 self.assertTrue(NoTpCheck.__no_type_check__)
1677 self.assertTrue(NoTpCheck.Inn.__init__.__no_type_check__)
1678 self.assertEqual(gth(ann_module2.NTC.meth), {})
1679 class ABase(Generic[T]):
1680 def meth(x: int): ...
1681 @no_type_check
1682 class Der(ABase): ...
1683 self.assertEqual(gth(ABase.meth), {'x': int})
1684
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001685 def test_get_type_hints_for_builtins(self):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001686 # Should not fail for built-in classes and functions.
1687 self.assertEqual(gth(int), {})
1688 self.assertEqual(gth(type), {})
1689 self.assertEqual(gth(dir), {})
1690 self.assertEqual(gth(len), {})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001691 self.assertEqual(gth(object.__str__), {})
1692 self.assertEqual(gth(object().__str__), {})
1693 self.assertEqual(gth(str.join), {})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001694
1695 def test_previous_behavior(self):
1696 def testf(x, y): ...
1697 testf.__annotations__['x'] = 'int'
1698 self.assertEqual(gth(testf), {'x': int})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001699 def testg(x: None): ...
1700 self.assertEqual(gth(testg), {'x': type(None)})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001701
Guido van Rossum991d14f2016-11-09 13:12:51 -08001702 def test_get_type_hints_for_object_with_annotations(self):
1703 class A: ...
1704 class B: ...
1705 b = B()
1706 b.__annotations__ = {'x': 'A'}
1707 self.assertEqual(gth(b, locals()), {'x': A})
1708
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001709 @skipUnless(PY36, 'Python 3.6 required')
1710 def test_get_type_hints_ClassVar(self):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001711 self.assertEqual(gth(ann_module2.CV, ann_module2.__dict__),
1712 {'var': typing.ClassVar[ann_module2.CV]})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001713 self.assertEqual(gth(B, globals()),
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001714 {'y': int, 'x': ClassVar[Optional[B]], 'b': int})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001715 self.assertEqual(gth(CSub, globals()),
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001716 {'z': ClassVar[CSub], 'y': int, 'b': int,
1717 'x': ClassVar[Optional[B]]})
Guido van Rossum991d14f2016-11-09 13:12:51 -08001718 self.assertEqual(gth(G), {'lst': ClassVar[List[T]]})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001719
Guido van Rossumf17c2002015-12-03 17:31:24 -08001720
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001721class CollectionsAbcTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001722
1723 def test_hashable(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001724 self.assertIsInstance(42, typing.Hashable)
1725 self.assertNotIsInstance([], typing.Hashable)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001726
1727 def test_iterable(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001728 self.assertIsInstance([], typing.Iterable)
Guido van Rossum1b669102015-09-04 12:15:54 -07001729 # Due to ABC caching, the second time takes a separate code
1730 # path and could fail. So call this a few times.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001731 self.assertIsInstance([], typing.Iterable)
1732 self.assertIsInstance([], typing.Iterable)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001733 self.assertNotIsInstance(42, typing.Iterable)
Guido van Rossum1b669102015-09-04 12:15:54 -07001734 # Just in case, also test issubclass() a few times.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001735 self.assertIsSubclass(list, typing.Iterable)
1736 self.assertIsSubclass(list, typing.Iterable)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001737
1738 def test_iterator(self):
1739 it = iter([])
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001740 self.assertIsInstance(it, typing.Iterator)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001741 self.assertNotIsInstance(42, typing.Iterator)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001742
Guido van Rossumac353df2016-10-21 16:12:17 -07001743 @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
Guido van Rossumf17c2002015-12-03 17:31:24 -08001744 def test_awaitable(self):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001745 ns = {}
1746 exec(
1747 "async def foo() -> typing.Awaitable[int]:\n"
1748 " return await AwaitableWrapper(42)\n",
1749 globals(), ns)
1750 foo = ns['foo']
Guido van Rossumf17c2002015-12-03 17:31:24 -08001751 g = foo()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001752 self.assertIsInstance(g, typing.Awaitable)
1753 self.assertNotIsInstance(foo, typing.Awaitable)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001754 g.send(None) # Run foo() till completion, to avoid warning.
1755
Guido van Rossumac353df2016-10-21 16:12:17 -07001756 @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001757 def test_coroutine(self):
1758 ns = {}
1759 exec(
1760 "async def foo():\n"
1761 " return\n",
1762 globals(), ns)
1763 foo = ns['foo']
1764 g = foo()
1765 self.assertIsInstance(g, typing.Coroutine)
1766 with self.assertRaises(TypeError):
1767 isinstance(g, typing.Coroutine[int])
1768 self.assertNotIsInstance(foo, typing.Coroutine)
1769 try:
1770 g.send(None)
1771 except StopIteration:
1772 pass
1773
1774 @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
Guido van Rossumf17c2002015-12-03 17:31:24 -08001775 def test_async_iterable(self):
1776 base_it = range(10) # type: Iterator[int]
1777 it = AsyncIteratorWrapper(base_it)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001778 self.assertIsInstance(it, typing.AsyncIterable)
1779 self.assertIsInstance(it, typing.AsyncIterable)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001780 self.assertNotIsInstance(42, typing.AsyncIterable)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001781
Guido van Rossumac353df2016-10-21 16:12:17 -07001782 @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
Guido van Rossumf17c2002015-12-03 17:31:24 -08001783 def test_async_iterator(self):
1784 base_it = range(10) # type: Iterator[int]
1785 it = AsyncIteratorWrapper(base_it)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001786 self.assertIsInstance(it, typing.AsyncIterator)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001787 self.assertNotIsInstance(42, typing.AsyncIterator)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001788
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001789 def test_sized(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001790 self.assertIsInstance([], typing.Sized)
1791 self.assertNotIsInstance(42, typing.Sized)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001792
1793 def test_container(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001794 self.assertIsInstance([], typing.Container)
1795 self.assertNotIsInstance(42, typing.Container)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001796
Guido van Rossumefa798d2016-08-23 11:01:50 -07001797 def test_collection(self):
1798 if hasattr(typing, 'Collection'):
1799 self.assertIsInstance(tuple(), typing.Collection)
1800 self.assertIsInstance(frozenset(), typing.Collection)
1801 self.assertIsSubclass(dict, typing.Collection)
1802 self.assertNotIsInstance(42, typing.Collection)
1803
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001804 def test_abstractset(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001805 self.assertIsInstance(set(), typing.AbstractSet)
1806 self.assertNotIsInstance(42, typing.AbstractSet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001807
1808 def test_mutableset(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001809 self.assertIsInstance(set(), typing.MutableSet)
1810 self.assertNotIsInstance(frozenset(), typing.MutableSet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001811
1812 def test_mapping(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001813 self.assertIsInstance({}, typing.Mapping)
1814 self.assertNotIsInstance(42, typing.Mapping)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001815
1816 def test_mutablemapping(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001817 self.assertIsInstance({}, typing.MutableMapping)
1818 self.assertNotIsInstance(42, typing.MutableMapping)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001819
1820 def test_sequence(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001821 self.assertIsInstance([], typing.Sequence)
1822 self.assertNotIsInstance(42, typing.Sequence)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001823
1824 def test_mutablesequence(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001825 self.assertIsInstance([], typing.MutableSequence)
1826 self.assertNotIsInstance((), typing.MutableSequence)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001827
1828 def test_bytestring(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001829 self.assertIsInstance(b'', typing.ByteString)
1830 self.assertIsInstance(bytearray(b''), typing.ByteString)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001831
1832 def test_list(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001833 self.assertIsSubclass(list, typing.List)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001834
Raymond Hettinger80490522017-01-16 22:42:37 -08001835 def test_deque(self):
1836 self.assertIsSubclass(collections.deque, typing.Deque)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001837 class MyDeque(typing.Deque[int]): ...
1838 self.assertIsInstance(MyDeque(), collections.deque)
1839
1840 def test_counter(self):
1841 self.assertIsSubclass(collections.Counter, typing.Counter)
Raymond Hettinger80490522017-01-16 22:42:37 -08001842
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001843 def test_set(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001844 self.assertIsSubclass(set, typing.Set)
1845 self.assertNotIsSubclass(frozenset, typing.Set)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001846
1847 def test_frozenset(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001848 self.assertIsSubclass(frozenset, typing.FrozenSet)
1849 self.assertNotIsSubclass(set, typing.FrozenSet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001850
1851 def test_dict(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001852 self.assertIsSubclass(dict, typing.Dict)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001853
1854 def test_no_list_instantiation(self):
1855 with self.assertRaises(TypeError):
1856 typing.List()
1857 with self.assertRaises(TypeError):
1858 typing.List[T]()
1859 with self.assertRaises(TypeError):
1860 typing.List[int]()
1861
Guido van Rossum1cea70f2016-05-18 08:35:00 -07001862 def test_list_subclass(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001863
1864 class MyList(typing.List[int]):
1865 pass
1866
1867 a = MyList()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001868 self.assertIsInstance(a, MyList)
Guido van Rossum1cea70f2016-05-18 08:35:00 -07001869 self.assertIsInstance(a, typing.Sequence)
1870
1871 self.assertIsSubclass(MyList, list)
1872 self.assertNotIsSubclass(list, MyList)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001873
1874 def test_no_dict_instantiation(self):
1875 with self.assertRaises(TypeError):
1876 typing.Dict()
1877 with self.assertRaises(TypeError):
1878 typing.Dict[KT, VT]()
1879 with self.assertRaises(TypeError):
1880 typing.Dict[str, int]()
1881
Guido van Rossum1cea70f2016-05-18 08:35:00 -07001882 def test_dict_subclass(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001883
1884 class MyDict(typing.Dict[str, int]):
1885 pass
1886
1887 d = MyDict()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001888 self.assertIsInstance(d, MyDict)
Guido van Rossum1cea70f2016-05-18 08:35:00 -07001889 self.assertIsInstance(d, typing.MutableMapping)
1890
1891 self.assertIsSubclass(MyDict, dict)
1892 self.assertNotIsSubclass(dict, MyDict)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001893
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001894 def test_defaultdict_instantiation(self):
1895 self.assertIs(type(typing.DefaultDict()), collections.defaultdict)
1896 self.assertIs(type(typing.DefaultDict[KT, VT]()), collections.defaultdict)
1897 self.assertIs(type(typing.DefaultDict[str, int]()), collections.defaultdict)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001898
Guido van Rossum1cea70f2016-05-18 08:35:00 -07001899 def test_defaultdict_subclass(self):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001900
1901 class MyDefDict(typing.DefaultDict[str, int]):
1902 pass
1903
1904 dd = MyDefDict()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001905 self.assertIsInstance(dd, MyDefDict)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001906
Guido van Rossum1cea70f2016-05-18 08:35:00 -07001907 self.assertIsSubclass(MyDefDict, collections.defaultdict)
1908 self.assertNotIsSubclass(collections.defaultdict, MyDefDict)
1909
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001910 @skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3')
1911 def test_chainmap_instantiation(self):
1912 self.assertIs(type(typing.ChainMap()), collections.ChainMap)
1913 self.assertIs(type(typing.ChainMap[KT, VT]()), collections.ChainMap)
1914 self.assertIs(type(typing.ChainMap[str, int]()), collections.ChainMap)
1915 class CM(typing.ChainMap[KT, VT]): ...
1916 self.assertIs(type(CM[int, str]()), CM)
1917
1918 @skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3')
1919 def test_chainmap_subclass(self):
1920
1921 class MyChainMap(typing.ChainMap[str, int]):
1922 pass
1923
1924 cm = MyChainMap()
1925 self.assertIsInstance(cm, MyChainMap)
1926
1927 self.assertIsSubclass(MyChainMap, collections.ChainMap)
1928 self.assertNotIsSubclass(collections.ChainMap, MyChainMap)
1929
1930 def test_deque_instantiation(self):
1931 self.assertIs(type(typing.Deque()), collections.deque)
1932 self.assertIs(type(typing.Deque[T]()), collections.deque)
1933 self.assertIs(type(typing.Deque[int]()), collections.deque)
1934 class D(typing.Deque[T]): ...
1935 self.assertIs(type(D[int]()), D)
1936
1937 def test_counter_instantiation(self):
1938 self.assertIs(type(typing.Counter()), collections.Counter)
1939 self.assertIs(type(typing.Counter[T]()), collections.Counter)
1940 self.assertIs(type(typing.Counter[int]()), collections.Counter)
1941 class C(typing.Counter[T]): ...
1942 self.assertIs(type(C[int]()), C)
1943
1944 def test_counter_subclass_instantiation(self):
1945
1946 class MyCounter(typing.Counter[int]):
1947 pass
1948
1949 d = MyCounter()
1950 self.assertIsInstance(d, MyCounter)
1951 self.assertIsInstance(d, typing.Counter)
1952 self.assertIsInstance(d, collections.Counter)
Raymond Hettinger80490522017-01-16 22:42:37 -08001953
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001954 def test_no_set_instantiation(self):
1955 with self.assertRaises(TypeError):
1956 typing.Set()
1957 with self.assertRaises(TypeError):
1958 typing.Set[T]()
1959 with self.assertRaises(TypeError):
1960 typing.Set[int]()
1961
1962 def test_set_subclass_instantiation(self):
1963
1964 class MySet(typing.Set[int]):
1965 pass
1966
1967 d = MySet()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001968 self.assertIsInstance(d, MySet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001969
1970 def test_no_frozenset_instantiation(self):
1971 with self.assertRaises(TypeError):
1972 typing.FrozenSet()
1973 with self.assertRaises(TypeError):
1974 typing.FrozenSet[T]()
1975 with self.assertRaises(TypeError):
1976 typing.FrozenSet[int]()
1977
1978 def test_frozenset_subclass_instantiation(self):
1979
1980 class MyFrozenSet(typing.FrozenSet[int]):
1981 pass
1982
1983 d = MyFrozenSet()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001984 self.assertIsInstance(d, MyFrozenSet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001985
1986 def test_no_tuple_instantiation(self):
1987 with self.assertRaises(TypeError):
1988 Tuple()
1989 with self.assertRaises(TypeError):
1990 Tuple[T]()
1991 with self.assertRaises(TypeError):
1992 Tuple[int]()
1993
1994 def test_generator(self):
1995 def foo():
1996 yield 42
1997 g = foo()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001998 self.assertIsSubclass(type(g), typing.Generator)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001999
2000 def test_no_generator_instantiation(self):
2001 with self.assertRaises(TypeError):
2002 typing.Generator()
2003 with self.assertRaises(TypeError):
2004 typing.Generator[T, T, T]()
2005 with self.assertRaises(TypeError):
2006 typing.Generator[int, int, int]()
2007
Guido van Rossume9ed5602017-01-18 13:10:31 -08002008 @skipUnless(PY36, 'Python 3.6 required')
2009 def test_async_generator(self):
2010 ns = {}
2011 exec("async def f():\n"
Guido van Rossum95919c02017-01-22 17:47:20 -08002012 " yield 42\n", globals(), ns)
Guido van Rossume9ed5602017-01-18 13:10:31 -08002013 g = ns['f']()
2014 self.assertIsSubclass(type(g), typing.AsyncGenerator)
2015
2016 @skipUnless(PY36, 'Python 3.6 required')
2017 def test_no_async_generator_instantiation(self):
2018 with self.assertRaises(TypeError):
2019 typing.AsyncGenerator()
2020 with self.assertRaises(TypeError):
2021 typing.AsyncGenerator[T, T]()
2022 with self.assertRaises(TypeError):
2023 typing.AsyncGenerator[int, int]()
2024
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002025 def test_subclassing(self):
2026
2027 class MMA(typing.MutableMapping):
2028 pass
2029
2030 with self.assertRaises(TypeError): # It's abstract
2031 MMA()
2032
2033 class MMC(MMA):
Guido van Rossumb47c9d22016-10-03 08:40:50 -07002034 def __getitem__(self, k):
2035 return None
2036 def __setitem__(self, k, v):
2037 pass
2038 def __delitem__(self, k):
2039 pass
2040 def __iter__(self):
2041 return iter(())
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002042 def __len__(self):
2043 return 0
2044
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002045 self.assertEqual(len(MMC()), 0)
Guido van Rossume2592672016-10-08 20:27:22 -07002046 assert callable(MMC.update)
2047 self.assertIsInstance(MMC(), typing.Mapping)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002048
2049 class MMB(typing.MutableMapping[KT, VT]):
Guido van Rossumb47c9d22016-10-03 08:40:50 -07002050 def __getitem__(self, k):
2051 return None
2052 def __setitem__(self, k, v):
2053 pass
2054 def __delitem__(self, k):
2055 pass
2056 def __iter__(self):
2057 return iter(())
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002058 def __len__(self):
2059 return 0
2060
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002061 self.assertEqual(len(MMB()), 0)
2062 self.assertEqual(len(MMB[str, str]()), 0)
2063 self.assertEqual(len(MMB[KT, VT]()), 0)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002064
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002065 self.assertNotIsSubclass(dict, MMA)
2066 self.assertNotIsSubclass(dict, MMB)
2067
2068 self.assertIsSubclass(MMA, typing.Mapping)
2069 self.assertIsSubclass(MMB, typing.Mapping)
2070 self.assertIsSubclass(MMC, typing.Mapping)
2071
Guido van Rossume2592672016-10-08 20:27:22 -07002072 self.assertIsInstance(MMB[KT, VT](), typing.Mapping)
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002073 self.assertIsInstance(MMB[KT, VT](), collections_abc.Mapping)
Guido van Rossume2592672016-10-08 20:27:22 -07002074
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002075 self.assertIsSubclass(MMA, collections_abc.Mapping)
2076 self.assertIsSubclass(MMB, collections_abc.Mapping)
2077 self.assertIsSubclass(MMC, collections_abc.Mapping)
Guido van Rossume2592672016-10-08 20:27:22 -07002078
2079 self.assertIsSubclass(MMB[str, str], typing.Mapping)
2080 self.assertIsSubclass(MMC, MMA)
2081
2082 class I(typing.Iterable): ...
2083 self.assertNotIsSubclass(list, I)
2084
2085 class G(typing.Generator[int, int, int]): ...
2086 def g(): yield 0
2087 self.assertIsSubclass(G, typing.Generator)
2088 self.assertIsSubclass(G, typing.Iterable)
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002089 if hasattr(collections_abc, 'Generator'):
2090 self.assertIsSubclass(G, collections_abc.Generator)
2091 self.assertIsSubclass(G, collections_abc.Iterable)
Guido van Rossume2592672016-10-08 20:27:22 -07002092 self.assertNotIsSubclass(type(g), G)
2093
Guido van Rossume9ed5602017-01-18 13:10:31 -08002094 @skipUnless(PY36, 'Python 3.6 required')
2095 def test_subclassing_async_generator(self):
2096 class G(typing.AsyncGenerator[int, int]):
2097 def asend(self, value):
2098 pass
2099 def athrow(self, typ, val=None, tb=None):
2100 pass
2101
2102 ns = {}
2103 exec('async def g(): yield 0', globals(), ns)
2104 g = ns['g']
2105 self.assertIsSubclass(G, typing.AsyncGenerator)
2106 self.assertIsSubclass(G, typing.AsyncIterable)
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002107 self.assertIsSubclass(G, collections_abc.AsyncGenerator)
2108 self.assertIsSubclass(G, collections_abc.AsyncIterable)
Guido van Rossume9ed5602017-01-18 13:10:31 -08002109 self.assertNotIsSubclass(type(g), G)
2110
2111 instance = G()
2112 self.assertIsInstance(instance, typing.AsyncGenerator)
2113 self.assertIsInstance(instance, typing.AsyncIterable)
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002114 self.assertIsInstance(instance, collections_abc.AsyncGenerator)
2115 self.assertIsInstance(instance, collections_abc.AsyncIterable)
Guido van Rossume9ed5602017-01-18 13:10:31 -08002116 self.assertNotIsInstance(type(g), G)
2117 self.assertNotIsInstance(g, G)
2118
Guido van Rossume2592672016-10-08 20:27:22 -07002119 def test_subclassing_subclasshook(self):
2120
2121 class Base(typing.Iterable):
2122 @classmethod
2123 def __subclasshook__(cls, other):
2124 if other.__name__ == 'Foo':
2125 return True
2126 else:
2127 return False
2128
2129 class C(Base): ...
2130 class Foo: ...
2131 class Bar: ...
2132 self.assertIsSubclass(Foo, Base)
2133 self.assertIsSubclass(Foo, C)
2134 self.assertNotIsSubclass(Bar, C)
2135
2136 def test_subclassing_register(self):
2137
2138 class A(typing.Container): ...
2139 class B(A): ...
2140
2141 class C: ...
2142 A.register(C)
2143 self.assertIsSubclass(C, A)
2144 self.assertNotIsSubclass(C, B)
2145
2146 class D: ...
2147 B.register(D)
2148 self.assertIsSubclass(D, A)
2149 self.assertIsSubclass(D, B)
2150
2151 class M(): ...
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002152 collections_abc.MutableMapping.register(M)
Guido van Rossume2592672016-10-08 20:27:22 -07002153 self.assertIsSubclass(M, typing.Mapping)
2154
2155 def test_collections_as_base(self):
2156
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002157 class M(collections_abc.Mapping): ...
Guido van Rossume2592672016-10-08 20:27:22 -07002158 self.assertIsSubclass(M, typing.Mapping)
2159 self.assertIsSubclass(M, typing.Iterable)
2160
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002161 class S(collections_abc.MutableSequence): ...
Guido van Rossume2592672016-10-08 20:27:22 -07002162 self.assertIsSubclass(S, typing.MutableSequence)
2163 self.assertIsSubclass(S, typing.Iterable)
2164
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002165 class I(collections_abc.Iterable): ...
Guido van Rossume2592672016-10-08 20:27:22 -07002166 self.assertIsSubclass(I, typing.Iterable)
2167
Serhiy Storchaka2e576f52017-04-24 09:05:00 +03002168 class A(collections_abc.Mapping, metaclass=abc.ABCMeta): ...
Guido van Rossume2592672016-10-08 20:27:22 -07002169 class B: ...
2170 A.register(B)
2171 self.assertIsSubclass(B, typing.Mapping)
2172
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002173
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002174class OtherABCTests(BaseTestCase):
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002175
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002176 def test_contextmanager(self):
2177 @contextlib.contextmanager
2178 def manager():
2179 yield 42
2180
2181 cm = manager()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002182 self.assertIsInstance(cm, typing.ContextManager)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002183 self.assertNotIsInstance(42, typing.ContextManager)
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002184
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02002185 @skipUnless(ASYNCIO, 'Python 3.5 required')
2186 def test_async_contextmanager(self):
2187 class NotACM:
2188 pass
2189 self.assertIsInstance(ACM(), typing.AsyncContextManager)
2190 self.assertNotIsInstance(NotACM(), typing.AsyncContextManager)
2191 @contextlib.contextmanager
2192 def manager():
2193 yield 42
2194
2195 cm = manager()
2196 self.assertNotIsInstance(cm, typing.AsyncContextManager)
2197 self.assertEqual(typing.AsyncContextManager[int].__args__, (int,))
2198 with self.assertRaises(TypeError):
2199 isinstance(42, typing.AsyncContextManager[int])
2200 with self.assertRaises(TypeError):
2201 typing.AsyncContextManager[int, str]
2202
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002203
Guido van Rossumeb9aca32016-05-24 16:38:22 -07002204class TypeTests(BaseTestCase):
2205
2206 def test_type_basic(self):
2207
2208 class User: pass
2209 class BasicUser(User): pass
2210 class ProUser(User): pass
2211
2212 def new_user(user_class: Type[User]) -> User:
2213 return user_class()
2214
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002215 new_user(BasicUser)
Guido van Rossumeb9aca32016-05-24 16:38:22 -07002216
2217 def test_type_typevar(self):
2218
2219 class User: pass
2220 class BasicUser(User): pass
2221 class ProUser(User): pass
2222
2223 U = TypeVar('U', bound=User)
2224
2225 def new_user(user_class: Type[U]) -> U:
2226 return user_class()
2227
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002228 new_user(BasicUser)
Guido van Rossumeb9aca32016-05-24 16:38:22 -07002229
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002230 def test_type_optional(self):
2231 A = Optional[Type[BaseException]]
2232
2233 def foo(a: A) -> Optional[BaseException]:
2234 if a is None:
2235 return None
2236 else:
2237 return a()
2238
2239 assert isinstance(foo(KeyboardInterrupt), KeyboardInterrupt)
2240 assert foo(None) is None
2241
Guido van Rossumeb9aca32016-05-24 16:38:22 -07002242
Guido van Rossum91185fe2016-06-08 11:19:11 -07002243class NewTypeTests(BaseTestCase):
2244
2245 def test_basic(self):
2246 UserId = NewType('UserId', int)
2247 UserName = NewType('UserName', str)
2248 self.assertIsInstance(UserId(5), int)
2249 self.assertIsInstance(UserName('Joe'), str)
2250 self.assertEqual(UserId(5) + 1, 6)
2251
2252 def test_errors(self):
2253 UserId = NewType('UserId', int)
2254 UserName = NewType('UserName', str)
2255 with self.assertRaises(TypeError):
2256 issubclass(UserId, int)
2257 with self.assertRaises(TypeError):
2258 class D(UserName):
2259 pass
2260
2261
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002262class NamedTupleTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002263
2264 def test_basics(self):
2265 Emp = NamedTuple('Emp', [('name', str), ('id', int)])
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002266 self.assertIsSubclass(Emp, tuple)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002267 joe = Emp('Joe', 42)
2268 jim = Emp(name='Jim', id=1)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002269 self.assertIsInstance(joe, Emp)
2270 self.assertIsInstance(joe, tuple)
2271 self.assertEqual(joe.name, 'Joe')
2272 self.assertEqual(joe.id, 42)
2273 self.assertEqual(jim.name, 'Jim')
2274 self.assertEqual(jim.id, 1)
2275 self.assertEqual(Emp.__name__, 'Emp')
2276 self.assertEqual(Emp._fields, ('name', 'id'))
Guido van Rossum83ec3022017-01-17 20:43:28 -08002277 self.assertEqual(Emp.__annotations__,
2278 collections.OrderedDict([('name', str), ('id', int)]))
2279 self.assertIs(Emp._field_types, Emp.__annotations__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002280
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002281 def test_namedtuple_pyversion(self):
2282 if sys.version_info[:2] < (3, 6):
2283 with self.assertRaises(TypeError):
2284 NamedTuple('Name', one=int, other=str)
2285 with self.assertRaises(TypeError):
2286 class NotYet(NamedTuple):
2287 whatever = 0
2288
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002289 @skipUnless(PY36, 'Python 3.6 required')
2290 def test_annotation_usage(self):
2291 tim = CoolEmployee('Tim', 9000)
2292 self.assertIsInstance(tim, CoolEmployee)
2293 self.assertIsInstance(tim, tuple)
2294 self.assertEqual(tim.name, 'Tim')
2295 self.assertEqual(tim.cool, 9000)
2296 self.assertEqual(CoolEmployee.__name__, 'CoolEmployee')
2297 self.assertEqual(CoolEmployee._fields, ('name', 'cool'))
Guido van Rossum83ec3022017-01-17 20:43:28 -08002298 self.assertEqual(CoolEmployee.__annotations__,
2299 collections.OrderedDict(name=str, cool=int))
2300 self.assertIs(CoolEmployee._field_types, CoolEmployee.__annotations__)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002301
Guido van Rossum2f841442016-11-15 09:48:06 -08002302 @skipUnless(PY36, 'Python 3.6 required')
Guido van Rossum3c268be2017-01-18 08:03:50 -08002303 def test_annotation_usage_with_default(self):
2304 jelle = CoolEmployeeWithDefault('Jelle')
2305 self.assertIsInstance(jelle, CoolEmployeeWithDefault)
2306 self.assertIsInstance(jelle, tuple)
2307 self.assertEqual(jelle.name, 'Jelle')
2308 self.assertEqual(jelle.cool, 0)
2309 cooler_employee = CoolEmployeeWithDefault('Sjoerd', 1)
2310 self.assertEqual(cooler_employee.cool, 1)
2311
2312 self.assertEqual(CoolEmployeeWithDefault.__name__, 'CoolEmployeeWithDefault')
2313 self.assertEqual(CoolEmployeeWithDefault._fields, ('name', 'cool'))
2314 self.assertEqual(CoolEmployeeWithDefault._field_types, dict(name=str, cool=int))
2315 self.assertEqual(CoolEmployeeWithDefault._field_defaults, dict(cool=0))
2316
2317 with self.assertRaises(TypeError):
2318 exec("""
2319class NonDefaultAfterDefault(NamedTuple):
2320 x: int = 3
2321 y: int
2322""")
2323
2324 @skipUnless(PY36, 'Python 3.6 required')
Guido van Rossum95919c02017-01-22 17:47:20 -08002325 def test_annotation_usage_with_methods(self):
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002326 self.assertEqual(XMeth(1).double(), 2)
2327 self.assertEqual(XMeth(42).x, XMeth(42)[0])
2328 self.assertEqual(str(XRepr(42)), '42 -> 1')
2329 self.assertEqual(XRepr(1, 2) + XRepr(3), 0)
2330
2331 with self.assertRaises(AttributeError):
2332 exec("""
2333class XMethBad(NamedTuple):
2334 x: int
2335 def _fields(self):
2336 return 'no chance for this'
2337""")
Guido van Rossum95919c02017-01-22 17:47:20 -08002338
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02002339 with self.assertRaises(AttributeError):
2340 exec("""
2341class XMethBad2(NamedTuple):
2342 x: int
2343 def _source(self):
2344 return 'no chance for this as well'
2345""")
2346
Guido van Rossum95919c02017-01-22 17:47:20 -08002347 @skipUnless(PY36, 'Python 3.6 required')
Guido van Rossum2f841442016-11-15 09:48:06 -08002348 def test_namedtuple_keyword_usage(self):
2349 LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int)
2350 nick = LocalEmployee('Nick', 25)
2351 self.assertIsInstance(nick, tuple)
2352 self.assertEqual(nick.name, 'Nick')
2353 self.assertEqual(LocalEmployee.__name__, 'LocalEmployee')
2354 self.assertEqual(LocalEmployee._fields, ('name', 'age'))
Guido van Rossum83ec3022017-01-17 20:43:28 -08002355 self.assertEqual(LocalEmployee.__annotations__, dict(name=str, age=int))
2356 self.assertIs(LocalEmployee._field_types, LocalEmployee.__annotations__)
Guido van Rossum2f841442016-11-15 09:48:06 -08002357 with self.assertRaises(TypeError):
2358 NamedTuple('Name', [('x', int)], y=str)
2359 with self.assertRaises(TypeError):
2360 NamedTuple('Name', x=1, y='a')
2361
Guido van Rossum557d1eb2015-11-19 08:16:31 -08002362 def test_pickle(self):
2363 global Emp # pickle wants to reference the class by name
2364 Emp = NamedTuple('Emp', [('name', str), ('id', int)])
2365 jane = Emp('jane', 37)
Serhiy Storchaka6d9e9232015-11-20 18:33:02 +02002366 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
2367 z = pickle.dumps(jane, proto)
2368 jane2 = pickle.loads(z)
2369 self.assertEqual(jane2, jane)
Guido van Rossum557d1eb2015-11-19 08:16:31 -08002370
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002371
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002372class IOTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002373
2374 def test_io(self):
2375
2376 def stuff(a: IO) -> AnyStr:
2377 return a.readline()
2378
2379 a = stuff.__annotations__['a']
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002380 self.assertEqual(a.__parameters__, (AnyStr,))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002381
2382 def test_textio(self):
2383
2384 def stuff(a: TextIO) -> str:
2385 return a.readline()
2386
2387 a = stuff.__annotations__['a']
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002388 self.assertEqual(a.__parameters__, ())
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002389
2390 def test_binaryio(self):
2391
2392 def stuff(a: BinaryIO) -> bytes:
2393 return a.readline()
2394
2395 a = stuff.__annotations__['a']
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002396 self.assertEqual(a.__parameters__, ())
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002397
2398 def test_io_submodule(self):
2399 from typing.io import IO, TextIO, BinaryIO, __all__, __name__
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002400 self.assertIs(IO, typing.IO)
2401 self.assertIs(TextIO, typing.TextIO)
2402 self.assertIs(BinaryIO, typing.BinaryIO)
2403 self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
2404 self.assertEqual(__name__, 'typing.io')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002405
2406
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002407class RETests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002408 # Much of this is really testing _TypeAlias.
2409
2410 def test_basics(self):
2411 pat = re.compile('[a-z]+', re.I)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002412 self.assertIsSubclass(pat.__class__, Pattern)
2413 self.assertIsSubclass(type(pat), Pattern)
Guido van Rossum4cefe742016-09-27 15:20:12 -07002414 self.assertIsInstance(pat, Pattern)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002415
2416 mat = pat.search('12345abcde.....')
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002417 self.assertIsSubclass(mat.__class__, Match)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002418 self.assertIsSubclass(type(mat), Match)
Guido van Rossum4cefe742016-09-27 15:20:12 -07002419 self.assertIsInstance(mat, Match)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002420
Guido van Rossum4cefe742016-09-27 15:20:12 -07002421 # these should just work
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002422 Pattern[Union[str, bytes]]
2423 Match[Union[bytes, str]]
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002424
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002425 def test_alias_equality(self):
2426 self.assertEqual(Pattern[str], Pattern[str])
2427 self.assertNotEqual(Pattern[str], Pattern[bytes])
2428 self.assertNotEqual(Pattern[str], Match[str])
2429 self.assertNotEqual(Pattern[str], str)
2430
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002431 def test_errors(self):
2432 with self.assertRaises(TypeError):
2433 # Doesn't fit AnyStr.
2434 Pattern[int]
2435 with self.assertRaises(TypeError):
2436 # Can't change type vars?
2437 Match[T]
2438 m = Match[Union[str, bytes]]
2439 with self.assertRaises(TypeError):
2440 # Too complicated?
2441 m[str]
Guido van Rossumd70fe632015-08-05 12:11:06 +02002442 with self.assertRaises(TypeError):
2443 # We don't support isinstance().
Guido van Rossumd70fe632015-08-05 12:11:06 +02002444 isinstance(42, Pattern[str])
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002445 with self.assertRaises(TypeError):
2446 # We don't support issubclass().
2447 issubclass(Pattern[bytes], Pattern[str])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002448
2449 def test_repr(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002450 self.assertEqual(repr(Pattern), 'Pattern[~AnyStr]')
2451 self.assertEqual(repr(Pattern[str]), 'Pattern[str]')
2452 self.assertEqual(repr(Pattern[bytes]), 'Pattern[bytes]')
2453 self.assertEqual(repr(Match), 'Match[~AnyStr]')
2454 self.assertEqual(repr(Match[str]), 'Match[str]')
2455 self.assertEqual(repr(Match[bytes]), 'Match[bytes]')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002456
2457 def test_re_submodule(self):
2458 from typing.re import Match, Pattern, __all__, __name__
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002459 self.assertIs(Match, typing.Match)
2460 self.assertIs(Pattern, typing.Pattern)
2461 self.assertEqual(set(__all__), set(['Match', 'Pattern']))
2462 self.assertEqual(__name__, 'typing.re')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002463
2464 def test_cannot_subclass(self):
2465 with self.assertRaises(TypeError) as ex:
2466
2467 class A(typing.Match):
2468 pass
2469
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002470 self.assertEqual(str(ex.exception),
Guido van Rossum4cefe742016-09-27 15:20:12 -07002471 "Cannot subclass typing._TypeAlias")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002472
2473
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002474class AllTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002475 """Tests for __all__."""
2476
2477 def test_all(self):
2478 from typing import __all__ as a
2479 # Just spot-check the first and last of every category.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002480 self.assertIn('AbstractSet', a)
2481 self.assertIn('ValuesView', a)
2482 self.assertIn('cast', a)
2483 self.assertIn('overload', a)
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002484 if hasattr(contextlib, 'AbstractContextManager'):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002485 self.assertIn('ContextManager', a)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07002486 # Check that io and re are not exported.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002487 self.assertNotIn('io', a)
2488 self.assertNotIn('re', a)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002489 # Spot-check that stdlib modules aren't exported.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002490 self.assertNotIn('os', a)
2491 self.assertNotIn('sys', a)
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002492 # Check that Text is defined.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002493 self.assertIn('Text', a)
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02002494 # Check previously missing classes.
2495 self.assertIn('SupportsBytes', a)
2496 self.assertIn('SupportsComplex', a)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002497
2498
2499if __name__ == '__main__':
2500 main()