-
- Notifications
You must be signed in to change notification settings - Fork 33.1k
Labels
Description
PEP-695 protocols don't work as intended:
Here's the behaviour you get with protocols that use pre-PEP 695 syntax, which is correct:
>>> from typing import Protocol, runtime_checkable, TypeVar >>> T_co = TypeVar("T_co", covariant=True) >>> @runtime_checkable ... class SupportsAbsOld(Protocol[T_co]): ... def __abs__(self) -> T_co: ... ... ... >>> isinstance(0, SupportsAbsOld) True >>> issubclass(float, SupportsAbsOld) True
And here's the behaviour you get on main
with protocols that use PEP 695 syntax, which is incorrect:
>>> @runtime_checkable ... class SupportsAbsNew[T_co](Protocol): ... def __abs__(self) -> T_co: ... ... ... >>> isinstance(0, SupportsAbsNew) False >>> issubclass(float, SupportsAbsNew) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\alexw\coding\cpython\Lib\abc.py", line 123, in __subclasscheck__ return _abc_subclasscheck(cls, subclass) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\alexw\coding\cpython\Lib\typing.py", line 1875, in _proto_hook raise TypeError("Protocols with non-method members" TypeError: Protocols with non-method members don't support issubclass()