>>> from typing import *
>>> @runtime_checkable
... class Foo(Protocol):
... x = 1
... @classmethod
... def __subclasshook__(cls, other):
... return hasattr(other, 'x')
...
>>> issubclass(object, Foo)
False
>>> from typing import *
>>> @runtime_checkable
... class Foo(Protocol):
... x = 1
... @classmethod
... def __subclasshook__(cls, other):
... return hsattr(cls, 'x')
...
>>> issubclass(object, Foo)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\alexw\coding\cpython\Lib\typing.py", line 1829, in __subclasscheck__
raise TypeError(
TypeError: Protocols with non-method members don't support issubclass()
I think I prefer the Python 3.11 behaviour here, since the whole point of allowing protocols to define custom __subclasshook__ methods is so that users can customise how issubclass() works on user-defined protocols.
Bug report
On Python 3.11:
On Python 3.12:
I think I prefer the Python 3.11 behaviour here, since the whole point of allowing protocols to define custom
__subclasshook__methods is so that users can customise howissubclass()works on user-defined protocols.Linked PRs
__subclasshook__methods #105976__subclasshook__methods (GH-105976) #106032