gh-74690: Add more tests for runtime-checkable protocols (#103347)
This commit is contained in:
parent
04501ee57e
commit
800382a2b0
@ -2577,6 +2577,22 @@ class ProtocolTests(BaseTestCase):
|
||||
class PG(Protocol[T]):
|
||||
def meth(x): ...
|
||||
|
||||
@runtime_checkable
|
||||
class WeirdProto(Protocol):
|
||||
meth = str.maketrans
|
||||
|
||||
@runtime_checkable
|
||||
class WeirdProto2(Protocol):
|
||||
meth = lambda *args, **kwargs: None
|
||||
|
||||
class CustomCallable:
|
||||
def __call__(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
@runtime_checkable
|
||||
class WeirderProto(Protocol):
|
||||
meth = CustomCallable()
|
||||
|
||||
class BadP(Protocol):
|
||||
def meth(x): ...
|
||||
|
||||
@ -2586,8 +2602,15 @@ class ProtocolTests(BaseTestCase):
|
||||
class C:
|
||||
def meth(x): ...
|
||||
|
||||
self.assertIsInstance(C(), P)
|
||||
self.assertIsInstance(C(), PG)
|
||||
class C2:
|
||||
def __init__(self):
|
||||
self.meth = lambda: None
|
||||
|
||||
for klass in C, C2:
|
||||
for proto in P, PG, WeirdProto, WeirdProto2, WeirderProto:
|
||||
with self.subTest(klass=klass.__name__, proto=proto.__name__):
|
||||
self.assertIsInstance(klass(), proto)
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
isinstance(C(), PG[T])
|
||||
with self.assertRaises(TypeError):
|
||||
@ -2829,6 +2852,20 @@ class ProtocolTests(BaseTestCase):
|
||||
self.assertIsInstance(C(1), P)
|
||||
self.assertIsInstance(C(1), PG)
|
||||
|
||||
def test_protocols_isinstance_monkeypatching(self):
|
||||
@runtime_checkable
|
||||
class HasX(Protocol):
|
||||
x: int
|
||||
|
||||
class Foo: ...
|
||||
|
||||
f = Foo()
|
||||
self.assertNotIsInstance(f, HasX)
|
||||
f.x = 42
|
||||
self.assertIsInstance(f, HasX)
|
||||
del f.x
|
||||
self.assertNotIsInstance(f, HasX)
|
||||
|
||||
def test_protocol_checks_after_subscript(self):
|
||||
class P(Protocol[T]): pass
|
||||
class C(P[T]): pass
|
||||
|
Loading…
x
Reference in New Issue
Block a user