gh-110682: Ignore `__match_args__` from `__instancecheck__` in protocols (#110683)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
Nikita Sobolev 2023-10-12 05:20:20 +03:00 committed by GitHub
parent 88ecb190f3
commit 5257ade0bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 1 deletions

View File

@ -3801,6 +3801,39 @@ class ProtocolTests(BaseTestCase):
self.assertIsInstance(E(), D) self.assertIsInstance(E(), D)
def test_runtime_checkable_with_match_args(self):
@runtime_checkable
class P_regular(Protocol):
x: int
y: int
@runtime_checkable
class P_match(Protocol):
__match_args__ = ('x', 'y')
x: int
y: int
class Regular:
def __init__(self, x: int, y: int):
self.x = x
self.y = y
class WithMatch:
__match_args__ = ('x', 'y', 'z')
def __init__(self, x: int, y: int, z: int):
self.x = x
self.y = y
self.z = z
class Nope: ...
self.assertIsInstance(Regular(1, 2), P_regular)
self.assertIsInstance(Regular(1, 2), P_match)
self.assertIsInstance(WithMatch(1, 2, 3), P_regular)
self.assertIsInstance(WithMatch(1, 2, 3), P_match)
self.assertNotIsInstance(Nope(), P_regular)
self.assertNotIsInstance(Nope(), P_match)
def test_supports_int(self): def test_supports_int(self):
self.assertIsSubclass(int, typing.SupportsInt) self.assertIsSubclass(int, typing.SupportsInt)
self.assertNotIsSubclass(str, typing.SupportsInt) self.assertNotIsSubclass(str, typing.SupportsInt)

View File

@ -1669,7 +1669,8 @@ _TYPING_INTERNALS = frozenset({
_SPECIAL_NAMES = frozenset({ _SPECIAL_NAMES = frozenset({
'__abstractmethods__', '__annotations__', '__dict__', '__doc__', '__abstractmethods__', '__annotations__', '__dict__', '__doc__',
'__init__', '__module__', '__new__', '__slots__', '__init__', '__module__', '__new__', '__slots__',
'__subclasshook__', '__weakref__', '__class_getitem__' '__subclasshook__', '__weakref__', '__class_getitem__',
'__match_args__',
}) })
# These special attributes will be not collected as protocol members. # These special attributes will be not collected as protocol members.

View File

@ -0,0 +1,4 @@
:func:`runtime-checkable protocols <typing.runtime_checkable>` used
to consider ``__match_args__`` a protocol member in
``__instancecheck__`` if it was present on the protocol. Now, this attribute is
ignored if it is present.