Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.4k
Closed
Description
Onmain
, anisinstance()
check againstSized
works just the same as it does on Python 3.11:
>>>from typingimport Sized>>>isinstance(1, Sized)False
However! If you first subclassSized
like this,TypeError
is raised on thatisinstance()
check!
>>>from typingimport Sized, Protocol>>>classFoo(Sized,Protocol):pass...>>>isinstance(1, Sized)Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\alexw\coding\cpython\Lib\typing.py", line 1153, in __instancecheck__ return self.__subclasscheck__(type(obj)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\alexw\coding\cpython\Lib\typing.py", line 1428, in __subclasscheck__ return issubclass(cls, self.__origin__) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen abc>", line 123, in __subclasscheck__ File "C:\Users\alexw\coding\cpython\Lib\typing.py", line 1793, in __subclasscheck__ return super().__subclasscheck__(other) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen abc>", line 123, in __subclasscheck__ File "C:\Users\alexw\coding\cpython\Lib\typing.py", line 1876, in _proto_hook raise TypeError("Instance and class checks can only be used with"TypeError: Instance and class checks can only be used with @runtime_checkable protocols
This was originally reported by@vnmabus inpython/typing_extensions#207.
Note that (because of theabc
-module cache), thisdoesn't reproduce if you do anisinstance()
checkbefore subclassingtyping.Sized
:
>>>import typing>>>isinstance(1, typing.Sized)False>>>classFoo(typing.Sized,typing.Protocol):pass...>>>isinstance(1, typing.Sized)False
Linked PRs
- gh-105144: Runtime-checkable protocols: move all 'sanity checks' to
_ProtocolMeta.__subclasscheck__
#105152 - gh-105144: abc: Suppress errors raised by unrelated other subclasses #105159
- [3.12] gh-105144: Runtime-checkable protocols: move all 'sanity checks' to
_ProtocolMeta.__subclasscheck__
(GH-105152) #105160