Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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

like image 556
evgeniuz Avatar asked May 14 '12 11:05

evgeniuz


1 Answers

  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.

like image 200
glglgl Avatar answered Sep 24 '22 09:09

glglgl