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

isinstance, python

Solution

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.

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.

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

Problem

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

Original source