]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Improve readability of `typing._ProtocolMeta.__instancecheck__` (#104649)
authorAlex Waygood <Alex.Waygood@Gmail.com>
Fri, 19 May 2023 13:30:02 +0000 (14:30 +0100)
committerGitHub <noreply@github.com>
Fri, 19 May 2023 13:30:02 +0000 (14:30 +0100)
Lib/typing.py

index b60eb94351f9bb29e19cb89f3095e97dc40ff539..96393d6a02815b6a3517de14d20bad9fe3d2c875 100644 (file)
@@ -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