mirror of
https://github.com/python/cpython.git
synced 2025-09-25 09:50:37 +00:00
This commit is contained in:
commit
6e3f34b6b6
2 changed files with 21 additions and 2 deletions
|
@ -45,6 +45,10 @@ class BaseTestCase(TestCase):
|
||||||
message += ' : %s' % msg
|
message += ' : %s' % msg
|
||||||
raise self.failureException(message)
|
raise self.failureException(message)
|
||||||
|
|
||||||
|
def clear_caches(self):
|
||||||
|
for f in typing._cleanups:
|
||||||
|
f()
|
||||||
|
|
||||||
|
|
||||||
class Employee:
|
class Employee:
|
||||||
pass
|
pass
|
||||||
|
@ -509,6 +513,13 @@ class ProtocolTests(BaseTestCase):
|
||||||
def test_protocol_instance_type_error(self):
|
def test_protocol_instance_type_error(self):
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
isinstance(0, typing.SupportsAbs)
|
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):
|
class GenericTests(BaseTestCase):
|
||||||
|
@ -748,8 +759,12 @@ class GenericTests(BaseTestCase):
|
||||||
class CC: ...
|
class CC: ...
|
||||||
self.assertEqual(get_type_hints(foobar, globals(), locals()), {'x': List[List[CC]]})
|
self.assertEqual(get_type_hints(foobar, globals(), locals()), {'x': List[List[CC]]})
|
||||||
T = TypeVar('T')
|
T = TypeVar('T')
|
||||||
def barfoo(x: Tuple[T, ...]): ...
|
AT = Tuple[T, ...]
|
||||||
self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], 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):
|
def test_extended_generic_rules_subclassing(self):
|
||||||
class T1(Tuple[T, KT]): ...
|
class T1(Tuple[T, KT]): ...
|
||||||
|
@ -800,6 +815,8 @@ class GenericTests(BaseTestCase):
|
||||||
|
|
||||||
def test_type_erasure_special(self):
|
def test_type_erasure_special(self):
|
||||||
T = TypeVar('T')
|
T = TypeVar('T')
|
||||||
|
# this is the only test that checks type caching
|
||||||
|
self.clear_caches()
|
||||||
class MyTup(Tuple[T, T]): ...
|
class MyTup(Tuple[T, T]): ...
|
||||||
self.assertIs(MyTup[int]().__class__, MyTup)
|
self.assertIs(MyTup[int]().__class__, MyTup)
|
||||||
self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
|
self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
|
||||||
|
|
|
@ -1503,6 +1503,8 @@ class _ProtocolMeta(GenericMeta):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __instancecheck__(self, obj):
|
def __instancecheck__(self, obj):
|
||||||
|
if _Protocol not in self.__bases__:
|
||||||
|
return super().__instancecheck__(obj)
|
||||||
raise TypeError("Protocols cannot be used with isinstance().")
|
raise TypeError("Protocols cannot be used with isinstance().")
|
||||||
|
|
||||||
def __subclasscheck__(self, cls):
|
def __subclasscheck__(self, cls):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue