gh-104555: Runtime-checkable protocols: Don't let previous calls to isinstance() influence whether issubclass() raises an exception#104559
Merged
Conversation
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ABCMeta.__instancecheck__cachesisinstance()calls against classes that haveABCMetaas their metaclass. It uses these cache entries not only to inform how futureisinstance()calls behave, but also howissubclass()calls behave. That means that onmainwe now have some rather unfortunate behaviour when it comes to runtime-checkable protocols, due to the fact thattyping._ProtocolMetais a subclass ofABCMeta, andtyping._ProtocolMeta.__instancecheck__callssuper().__instancecheck__()too soon (following 47753ec):This PR fixes the incorrect behaviour. It means that these
isinstance()checks will be about twice as slow as they are onmain:But they'll still be much faster than they are on 3.11. Use of
ABCMeta.registerwith protocols is pretty rare anyway, as far as I know, sinceABCMeta.registerisn't supported by type checkers. Other kinds ofisinstance()checks do not suffer a significant performance regression.Fixes #104555.
(Skipping news, as this bug doesn't exist on any released version of Python.)
main#104555