Override for issubclass(subclass, cls).
(cls, subclass)
| 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 |
no test coverage detected