[ty] Exclude members starting with _abc_ from a protocol interface (#18467)

## Summary

As well as excluding a hardcoded set of special attributes, CPython at
runtime also excludes any attributes or declarations starting with
`_abc_` from the set of members that make up a protocol interface. I
missed this in my initial implementation.

This is a bit of a CPython implementation detail, but I do think it's
important that we try to model the runtime as best we can here. The
closer we are to the runtime behaviour, the closer we come to sound
behaviour when narrowing types from `isinstance()` checks against
runtime-checkable protocols (for example)

## Test Plan

Extended an existing mdtest
This commit is contained in:
Alex Waygood 2025-06-04 20:34:09 +01:00 committed by GitHub
parent e658778ced
commit 3a8191529c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 3 additions and 2 deletions

View file

@ -389,6 +389,7 @@ not be considered protocol members by type checkers either:
class Lumberjack(Protocol):
__slots__ = ()
__match_args__ = ()
_abc_foo: str # any attribute starting with `_abc_` is excluded as a protocol attribute
x: int
def __new__(cls, x: int) -> "Lumberjack":