pythonisinstance

Python: why can isinstance return False, when it should return True?


I'm currently in pdb trace to figure this out

ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>

Why can this happen?

P. S. isinstance(var, type(var)) returns True as expected


Solution

    1. I can only guess, but if you do in module

      class Type(object): pass
      var = Type()
      class Type(object): pass
      

      then both types look like <class 'module.Type'>, but are nevertheless different.

      You could check that with

      print(id(Type), id(var.__class__))
      

      or with

      print(Type is var.__class__)
      

      Note that these comparisons work for both old-, and new-style classes. For new-style classes, they are equivalent to print(Type is type(var)). But this is not the case for old-style classes.

    2. Another quite common trap is that you call this module with

      python -m module
      

      or

      python module.py
      

      making it known as __main__ module. If it is imported somewhere else under its true name, it is known under that name as well with a different name space.

    3. Another guess could be that you are working with ABCs or otherwise let the class have a __instancecheck__() method.