mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
[3.11] gh-103171: Revert undocumented behaviour change for runtime-checkable protocols decorated with @final
(#105445)
This commit is contained in:
parent
2ffeb0ecc7
commit
18e9fd80d9
3 changed files with 70 additions and 1 deletions
|
@ -3349,6 +3349,71 @@ class ProtocolTests(BaseTestCase):
|
|||
|
||||
Foo() # Previously triggered RecursionError
|
||||
|
||||
def test_empty_protocol_decorated_with_final(self):
|
||||
@final
|
||||
@runtime_checkable
|
||||
class EmptyProtocol(Protocol): ...
|
||||
|
||||
self.assertIsSubclass(object, EmptyProtocol)
|
||||
self.assertIsInstance(object(), EmptyProtocol)
|
||||
|
||||
def test_protocol_decorated_with_final_callable_members(self):
|
||||
@final
|
||||
@runtime_checkable
|
||||
class ProtocolWithMethod(Protocol):
|
||||
def startswith(self, string: str) -> bool: ...
|
||||
|
||||
self.assertIsSubclass(str, ProtocolWithMethod)
|
||||
self.assertNotIsSubclass(int, ProtocolWithMethod)
|
||||
self.assertIsInstance('foo', ProtocolWithMethod)
|
||||
self.assertNotIsInstance(42, ProtocolWithMethod)
|
||||
|
||||
def test_protocol_decorated_with_final_noncallable_members(self):
|
||||
@final
|
||||
@runtime_checkable
|
||||
class ProtocolWithNonCallableMember(Protocol):
|
||||
x: int
|
||||
|
||||
class Foo:
|
||||
x = 42
|
||||
|
||||
only_callable_members_please = (
|
||||
r"Protocols with non-method members don't support issubclass()"
|
||||
)
|
||||
|
||||
with self.assertRaisesRegex(TypeError, only_callable_members_please):
|
||||
issubclass(Foo, ProtocolWithNonCallableMember)
|
||||
|
||||
with self.assertRaisesRegex(TypeError, only_callable_members_please):
|
||||
issubclass(int, ProtocolWithNonCallableMember)
|
||||
|
||||
self.assertIsInstance(Foo(), ProtocolWithNonCallableMember)
|
||||
self.assertNotIsInstance(42, ProtocolWithNonCallableMember)
|
||||
|
||||
def test_protocol_decorated_with_final_mixed_members(self):
|
||||
@final
|
||||
@runtime_checkable
|
||||
class ProtocolWithMixedMembers(Protocol):
|
||||
x: int
|
||||
def method(self) -> None: ...
|
||||
|
||||
class Foo:
|
||||
x = 42
|
||||
def method(self) -> None: ...
|
||||
|
||||
only_callable_members_please = (
|
||||
r"Protocols with non-method members don't support issubclass()"
|
||||
)
|
||||
|
||||
with self.assertRaisesRegex(TypeError, only_callable_members_please):
|
||||
issubclass(Foo, ProtocolWithMixedMembers)
|
||||
|
||||
with self.assertRaisesRegex(TypeError, only_callable_members_please):
|
||||
issubclass(int, ProtocolWithMixedMembers)
|
||||
|
||||
self.assertIsInstance(Foo(), ProtocolWithMixedMembers)
|
||||
self.assertNotIsInstance(42, ProtocolWithMixedMembers)
|
||||
|
||||
|
||||
class GenericTests(BaseTestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue