summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2016-11-19 18:32:41 (GMT)
committerGuido van Rossum <guido@python.org>2016-11-19 18:32:41 (GMT)
commitca4b252fba0a0540475f2edebfcabdf80f5cecdf (patch)
tree861d6cb50354b5e32b39a6806afe116742fd6c53
parentc851817aaa0b1b5e1de6eff7c3c238a49bc970c0 (diff)
downloadcpython-ca4b252fba0a0540475f2edebfcabdf80f5cecdf.zip
cpython-ca4b252fba0a0540475f2edebfcabdf80f5cecdf.tar.gz
cpython-ca4b252fba0a0540475f2edebfcabdf80f5cecdf.tar.bz2
Issue #28556: two more small upstream changes by Ivan Levkivskyi (#329, #330)
-rw-r--r--Lib/test/test_typing.py21
-rw-r--r--Lib/typing.py2
2 files changed, 21 insertions, 2 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 12bbf16..0910fd4 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -45,6 +45,10 @@ class BaseTestCase(TestCase):
message += ' : %s' % msg
raise self.failureException(message)
+ def clear_caches(self):
+ for f in typing._cleanups:
+ f()
+
class Employee:
pass
@@ -509,6 +513,13 @@ class ProtocolTests(BaseTestCase):
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 GenericTests(BaseTestCase):
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 @@ class GenericTests(BaseTestCase):
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 --git a/Lib/typing.py b/Lib/typing.py
index fe22b2b..c7fe5dd 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1503,6 +1503,8 @@ class _ProtocolMeta(GenericMeta):
"""
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):