31

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

6
  • 5
    There could be multiple types known as Type (say at different points in time). Could you produce a complete example that demonstrates the problem? Commented May 14, 2012 at 11:55
  • 17
    is there any import/reload magic in your code? Commented May 14, 2012 at 11:57
  • @RomanBodnarchuk, I don't think so. Can you provide examples of such magic? Commented May 14, 2012 at 12:01
  • @Shark docs.python.org/library/functions.html#reload Commented May 14, 2012 at 12:22
  • 8
    I just hit the same problem today. It was absolute import vs relative import. Try print repr(var.__class__), repr(Type). I resolved the problem by changing the relative import to absolute import. I will create a code that demonstrates the problem. Commented Feb 17, 2015 at 23:17

3 Answers 3

31
  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.

Sign up to request clarification or add additional context in comments.

5 Comments

I have defined only one Type across all of my source files. And I'm not fiddling with hidden methods. Only __str__, __iter__, __len__. So this is not the case. Also, this class is subclass of object.
BTW, I'm currently in pdb session. What should I check to determine cause?
You might consider taking a look at id(type(var)), type(var) is Type, etc.
for old-style classes, compare Type is var.__class__, because Type is type(var) can fail. This remains relevant, because of distutils classes that are monkey-patched by setuptools.
#2 Solved it for me. Changed from module.sub_module.thing import SpecificThing to import module.sub_module.thing as thing and then referenced thing.SpecificThing in the code and the problem was fixed. This was fixed even though I was using IPython autoreload as described below.
19

Users of the "autoreload" setting in iPython will probably run into this. When a class is reloaded, it will become a new class with the exact same name. Instances of the old class will not have their type updated:

# After reloading the Role class

[ins] In [19]: y = Role()

[ins] In [20]: isinstance(x, Role)
Out[20]: False

[nav] In [21]: isinstance(y, Role)
Out[21]: True

[ins] In [22]: type(x)
Out[22]: myproject.auth.Role

[ins] In [23]: type(y)
Out[23]: myproject.auth.Role

3 Comments

Any option aside imp.reload(module) and re-instantiating x? I could open a question
I had this when I used importlib.reload in the wrong order: library 1 called library 2, but I did importlib.reload for library 1 first before library 2, so every isinstance failed.
@Hubro you saved my life. I just ran into this problem and it took me over an hour to find your solution.
1

I encountered this problem as well, for me to problem laid in my imports. I imported Type once from parent.child.Type and once from child.Type. I assume that when using the full path the module is imported from the installed pip package, whereas using the relative path it is imported as a new module on the fly.

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.