diff options
author | Alex Waygood <Alex.Waygood@Gmail.com> | 2023-05-19 13:30:02 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-19 13:30:02 (GMT) |
commit | a412fc58ccb8c6739b179137321cbbb1abebcd2f (patch) | |
tree | 3e25abf45d74651ce42ff189747f54db8a164dcd /Lib/typing.py | |
parent | 9c5aa8967bd7c1b02fb1da055c6b3afcccbbb251 (diff) | |
download | cpython-a412fc58ccb8c6739b179137321cbbb1abebcd2f.zip cpython-a412fc58ccb8c6739b179137321cbbb1abebcd2f.tar.gz cpython-a412fc58ccb8c6739b179137321cbbb1abebcd2f.tar.bz2 |
Improve readability of `typing._ProtocolMeta.__instancecheck__` (#104649)
Diffstat (limited to 'Lib/typing.py')
-rw-r--r-- | Lib/typing.py | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/Lib/typing.py b/Lib/typing.py index b60eb94..96393d6 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 |