isinstance behavior with module reload

import, isinstance, python, reload

Solution

Reloading a module means re-executing its content, in this case `class A(object): pass`. So it creates another different class. It's the same behavior as:

class A(object):
    pass
a = A()
class A(object):          # a different class
    pass
print isinstance(a, A)    # False

This should be enough to explain why a bare `reload()` is usually a bad idea. I'm sure others could point to frameworks that implement more sophisticated reloading procedures, e.g. patching the old class to be considered equal to the new one.

Problem

Given the following two .py files: aclass.py ``` class A(object): pass ``` main.py ``` def importer(klass): """ Used to import classes from there python qalname """ import_ = lambda m, k: getattr(__import__(m, fromlist=k), k) klass = klass.split('.') module = '.'.join(klass[:-1]) klass = klass[-1] return import_(module, klass) from aclass import A import_A = importer('aclass.A') print isinstance(A(), import_A) # Expected to be true print isinstance(import_A(), A) # Expected to be true ``` At this stage, everything works fine (my program prints `True\nTrue`) But if I modify the `importer` method to enforce a reload, ie: this line: ``` import_ = lambda m, k: getattr(__import__(m, fromlist=k), k) ``` is replaced by: ``` import_ = lambda m, k: getattr(reload(__import__(m, fromlist=k)), k) ``` my programs returns ``` False False ``` And I do not understand this behavior.

Original source

Related problems