From a412fc58ccb8c6739b179137321cbbb1abebcd2f Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 19 May 2023 14:30:02 +0100 Subject: [PATCH] Improve readability of `typing._ProtocolMeta.__instancecheck__` (#104649) --- Lib/typing.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Lib/typing.py b/Lib/typing.py index b60eb94351f..96393d6a028 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1801,9 +1801,11 @@ class _ProtocolMeta(ABCMeta): def __instancecheck__(cls, instance): # We need this method for situations where attributes are # assigned in __init__. - is_protocol_cls = getattr(cls, "_is_protocol", False) + if not getattr(cls, "_is_protocol", False): + # i.e., it's a concrete subclass of a protocol + return super().__instancecheck__(instance) + if ( - is_protocol_cls and not getattr(cls, '_is_runtime_protocol', False) and not _allow_reckless_class_checks(depth=2) ): @@ -1813,17 +1815,16 @@ class _ProtocolMeta(ABCMeta): if super().__instancecheck__(instance): return True - if is_protocol_cls: - getattr_static = _lazy_load_getattr_static() - for attr in cls.__protocol_attrs__: - try: - val = getattr_static(instance, attr) - except AttributeError: - break - if val is None and callable(getattr(cls, attr, None)): - break - else: - return True + getattr_static = _lazy_load_getattr_static() + for attr in cls.__protocol_attrs__: + try: + val = getattr_static(instance, attr) + except AttributeError: + break + if val is None and callable(getattr(cls, attr, None)): + break + else: + return True return False