MCPcopy Index your code
hub / github.com/python/cpython / __subclasscheck__

Method __subclasscheck__

Lib/_py_abc.py:108–147  ·  view source on GitHub ↗

Override for issubclass(subclass, cls).

(cls, subclass)

Source from the content-addressed store, hash-verified

106 return any(cls.__subclasscheck__(c) for c in (subclass, subtype))
107
108 def __subclasscheck__(cls, subclass):
109 """Override for issubclass(subclass, cls)."""
110 if not isinstance(subclass, type):
111 raise TypeError('issubclass() arg 1 must be a class')
112 # Check cache
113 if subclass in cls._abc_cache:
114 return True
115 # Check negative cache; may have to invalidate
116 if cls._abc_negative_cache_version < ABCMeta._abc_invalidation_counter:
117 # Invalidate the negative cache
118 cls._abc_negative_cache = WeakSet()
119 cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter
120 elif subclass in cls._abc_negative_cache:
121 return False
122 # Check the subclass hook
123 ok = cls.__subclasshook__(subclass)
124 if ok is not NotImplemented:
125 assert isinstance(ok, bool)
126 if ok:
127 cls._abc_cache.add(subclass)
128 else:
129 cls._abc_negative_cache.add(subclass)
130 return ok
131 # Check if it's a direct subclass
132 if cls in getattr(subclass, '__mro__', ()):
133 cls._abc_cache.add(subclass)
134 return True
135 # Check if it's a subclass of a registered class (recursive)
136 for rcls in cls._abc_registry:
137 if issubclass(subclass, rcls):
138 cls._abc_cache.add(subclass)
139 return True
140 # Check if it's a subclass of a subclass (recursive)
141 for scls in cls.__subclasses__():
142 if issubclass(subclass, scls):
143 cls._abc_cache.add(subclass)
144 return True
145 # No dice; update negative cache
146 cls._abc_negative_cache.add(subclass)
147 return False

Callers 1

__instancecheck__Method · 0.45

Calls 3

WeakSetClass · 0.90
__subclasshook__Method · 0.45
addMethod · 0.45

Tested by

no test coverage detected