プラグインが同じ基本クラス(つまりA)のサブクラス(つまりB)である、ある種のプラグインフレームワークを実装することを目的としていました。基本クラスは標準のインポートでロードされますが、サブクラスは既知のパッケージ(つまり、pkg)のパスからimp.load_module()でロードされます。
pkg/
__init__.py
mod1.py
class A
mod2.py
class B(pkg.mod1.A)
これは、実際のサブクラス、つまり、
# test_1.py
import pkg
from pkg import mod1
import imp
tup = imp.find_module('mod2', pkg.__path__)
mod2 = imp.load_module('mod2', tup[0], tup[1], tup[2])
print(issubclass(mod2.B, mod1.A)) # True
しかし、基本クラス自体をテストするときに問題が発生しました。
# test_2.py
import pkg
from pkg import mod1
import imp
tup = imp.find_module('mod1', pkg.__path__)
mod0 = imp.load_module('mod1', tup[0], tup[1], tup[2])
print(issubclass(mod0.A, mod1.A)) # False
ただし、mod0.Aとmod1.Aは、実際には同じファイル(pkg / mod1.py)の同じクラスです。
この問題は、Python2.7と3.2の両方で発生します。
ここで、質問は2つあります。a)期待される機能なのか、issubclass()のバグなのか、b)pkgの内容を変更せずにこれを取り除く方法は?