{"record":{"id":"230492a069184f86","repo":"python/cpython","slug":"issubclass-arg-1-must-be-a-class","errorCode":null,"errorMessage":"issubclass() arg 1 must be a class","messagePattern":"issubclass\\(\\) arg 1 must be a class","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"Lib/_py_abc.py","lineNumber":111,"sourceCode":"        \"\"\"Override for isinstance(instance, cls).\"\"\"\n        # Inline the cache checking\n        subclass = instance.__class__\n        if subclass in cls._abc_cache:\n            return True\n        subtype = type(instance)\n        if subtype is subclass:\n            if (cls._abc_negative_cache_version ==\n                ABCMeta._abc_invalidation_counter and\n                subclass in cls._abc_negative_cache):\n                return False\n            # Fall back to the subclass check.\n            return cls.__subclasscheck__(subclass)\n        return any(cls.__subclasscheck__(c) for c in (subclass, subtype))\n\n    def __subclasscheck__(cls, subclass):\n        \"\"\"Override for issubclass(subclass, cls).\"\"\"\n        if not isinstance(subclass, type):\n            raise TypeError('issubclass() arg 1 must be a class')\n        # Check cache\n        if subclass in cls._abc_cache:\n            return True\n        # Check negative cache; may have to invalidate\n        if cls._abc_negative_cache_version < ABCMeta._abc_invalidation_counter:\n            # Invalidate the negative cache\n            cls._abc_negative_cache = WeakSet()\n            cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter\n        elif subclass in cls._abc_negative_cache:\n            return False\n        # Check the subclass hook\n        ok = cls.__subclasshook__(subclass)\n        if ok is not NotImplemented:\n            assert isinstance(ok, bool)\n            if ok:\n                cls._abc_cache.add(subclass)\n            else:\n                cls._abc_negative_cache.add(subclass)","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/python/cpython/blob/bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6/Lib/_py_abc.py#L93-L129","documentation":"Raised by ABCMeta.__subclasscheck__ (pure-Python _py_abc fallback; the C _abc raises the equivalent) when issubclass() is called with a first argument that is not a class. ABCs implement duck-typed virtual subclass checks that only make sense for classes, so issubclass(instance, MyABC) fails fast with TypeError instead of guessing.","triggerScenarios":"issubclass(obj, MyABC) where obj is an instance; passing a non-type (module, function, mock) to issubclass against any ABC; custom code that forwards user input into issubclass without checking it is a type. isinstance(instance, MyABC) does NOT raise — the error only comes from the issubclass path.","commonSituations":"Generic helper functions that want to accept 'class or instance' and call issubclass unconditionally; copy/paste swapping isinstance/issubclass; serialization frameworks dispatching on either a class or an instance; tests probing ABCs with fixtures.","solutions":["Use isinstance(obj, MyABC) when checking an instance","Branch on the argument kind: issubclass(x, MyABC) if isinstance(x, type) else isinstance(x, MyABC)","Validate external input before passing it to issubclass"],"exampleFix":"# before\nissubclass(widget, Drawable)   # widget is an instance -> TypeError\n\n# after\nisinstance(widget, Drawable)    # instance check\n# or, for either kind:\nisinstance(widget, Drawable) if not isinstance(widget, type) else issubclass(widget, Drawable)","handlingStrategy":"type-guard","validationCode":"def is_a(obj, abc) -> bool:\n    \"\"\"Works for both instances and classes.\"\"\"\n    if isinstance(obj, type):\n        return issubclass(obj, abc)\n    return isinstance(obj, abc)","typeGuard":"def is_klass(obj) -> bool:\n    return isinstance(obj, type)","tryCatchPattern":null,"preventionTips":["issubclass(A, B) takes two classes; isinstance(a, B) takes an instance","In generic helpers, branch on isinstance(obj, type) before choosing the check","Never forward unvalidated external input into issubclass against an ABC"],"tags":["abc","issubclass","typing","runtime"],"backgroundTag":null,"analyzedSha":"bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6","analyzedAt":"2026-08-14T22:01:13.976Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}