gh-104555: Fix isinstance() and issubclass() for runtime-checkable protocols that use PEP 695 (#104556)

Fixes #104555
This commit is contained in:
Alex Waygood 2023-05-16 17:38:10 +01:00 committed by GitHub
parent f40890b124
commit 1163782868
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 1 deletions

View File

@ -3134,6 +3134,24 @@ class ProtocolTests(BaseTestCase):
self.assertIsInstance(Test(), PSub)
def test_pep695_generic_protocol_callable_members(self):
@runtime_checkable
class Foo[T](Protocol):
def meth(self, x: T) -> None: ...
class Bar[T]:
def meth(self, x: T) -> None: ...
self.assertIsInstance(Bar(), Foo)
self.assertIsSubclass(Bar, Foo)
@runtime_checkable
class SupportsTrunc[T](Protocol):
def __trunc__(self) -> T: ...
self.assertIsInstance(0.0, SupportsTrunc)
self.assertIsSubclass(float, SupportsTrunc)
def test_init_called(self):
T = TypeVar('T')

View File

@ -1663,7 +1663,7 @@ class _TypingEllipsis:
_TYPING_INTERNALS = frozenset({
'__parameters__', '__orig_bases__', '__orig_class__',
'_is_protocol', '_is_runtime_protocol', '__protocol_attrs__',
'__callable_proto_members_only__',
'__callable_proto_members_only__', '__type_params__',
})
_SPECIAL_NAMES = frozenset({