Skip to content

Commit

Permalink
gh-110682: Ignore __match_args__ from __instancecheck__ in protoc…
Browse files Browse the repository at this point in the history
…ols (#110683)

Co-authored-by: Alex Waygood <[email protected]>
  • Loading branch information
sobolevn and AlexWaygood committed Oct 12, 2023
1 parent 88ecb19 commit 5257ade
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
33 changes: 33 additions & 0 deletions Lib/test/test_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -3801,6 +3801,39 @@ class E:

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):
self.assertIsSubclass(int, typing.SupportsInt)
self.assertNotIsSubclass(str, typing.SupportsInt)
Expand Down
3 changes: 2 additions & 1 deletion Lib/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -1669,7 +1669,8 @@ class _TypingEllipsis:
_SPECIAL_NAMES = frozenset({
'__abstractmethods__', '__annotations__', '__dict__', '__doc__',
'__init__', '__module__', '__new__', '__slots__',
'__subclasshook__', '__weakref__', '__class_getitem__'
'__subclasshook__', '__weakref__', '__class_getitem__',
'__match_args__',
})

# These special attributes will be not collected as protocol members.
Expand Down
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 5257ade

Please sign in to comment.