我目前正在使用pdb跟踪来解决这个问题
ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>
为什么会发生这种情况?
P上。 S. isinstance(var, type(var))
按预期返回True
答案 0 :(得分:16)
我只能猜测,但如果你在module
class Type(object): pass
var = Type()
class Type(object): pass
然后这两种类型看起来都像<class 'module.Type'>
,但仍然不同。
您可以使用
进行检查print(id(Type), id(var.__class__))
或
print(Type is var.__class__)
请注意,这些比较适用于旧式和新式类。
对于新式课程,它们相当于print(Type is type(var))
。
但旧式的课程并非如此。
另一个相当常见的陷阱是您使用
调用此模块python -m module
或
python module.py
将其称为__main__
模块。如果它以其真实名称导入到其他地方,则在该名称下也可以使用不同的名称空间。
另一个猜测可能是您正在使用ABCs或者让该课程采用__instancecheck__()
方法。
答案 1 :(得分:1)
iPython中“自动重载”设置的用户可能会遇到这种情况。重新加载一个类时,它将成为具有完全相同名称的新类。旧类的实例不会更新其类型:
# 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