(original) (raw)
changeset: 105188:1e49abb03e0f branch: 3.5 parent: 105165:20f62e4a9c2f user: Guido van Rossum guido@python.org date: Sat Nov 19 10:32:41 2016 -0800 files: Lib/test/test_typing.py Lib/typing.py description: Issue #28556: two more small upstream changes by Ivan Levkivskyi (#329, #330) diff -r 20f62e4a9c2f -r 1e49abb03e0f Lib/test/test_typing.py --- a/Lib/test/test_typing.py Wed Nov 16 16:32:22 2016 -0800 +++ b/Lib/test/test_typing.py Sat Nov 19 10:32:41 2016 -0800 @@ -45,6 +45,10 @@ message += ' : %s' % msg raise self.failureException(message) + def clear_caches(self): + for f in typing._cleanups: + f() + class Employee: pass @@ -509,6 +513,13 @@ def test_protocol_instance_type_error(self): with self.assertRaises(TypeError): isinstance(0, typing.SupportsAbs) + class C1(typing.SupportsInt): + def __int__(self) -> int: + return 42 + class C2(C1): + pass + c = C2() + self.assertIsInstance(c, C1) class GenericTests(BaseTestCase): @@ -748,8 +759,12 @@ class CC: ... self.assertEqual(get_type_hints(foobar, globals(), locals()), {'x': List[List[CC]]}) T = TypeVar('T') - def barfoo(x: Tuple[T, ...]): ... - self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], Tuple[T, ...]) + AT = Tuple[T, ...] + def barfoo(x: AT): ... + self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], AT) + CT = Callable[..., List[T]] + def barfoo2(x: CT): ... + self.assertIs(get_type_hints(barfoo2, globals(), locals())['x'], CT) def test_extended_generic_rules_subclassing(self): class T1(Tuple[T, KT]): ... @@ -800,6 +815,8 @@ def test_type_erasure_special(self): T = TypeVar('T') + # this is the only test that checks type caching + self.clear_caches() class MyTup(Tuple[T, T]): ... self.assertIs(MyTup[int]().__class__, MyTup) self.assertIs(MyTup[int]().__orig_class__, MyTup[int]) diff -r 20f62e4a9c2f -r 1e49abb03e0f Lib/typing.py --- a/Lib/typing.py Wed Nov 16 16:32:22 2016 -0800 +++ b/Lib/typing.py Sat Nov 19 10:32:41 2016 -0800 @@ -1503,6 +1503,8 @@ """ def __instancecheck__(self, obj): + if _Protocol not in self.__bases__: + return super().__instancecheck__(obj) raise TypeError("Protocols cannot be used with isinstance().") def __subclasscheck__(self, cls): /guido@python.org