我目前正在 pdb 跟踪中解决这个问题
ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>
为什么会发生这种情况?
PS按预期isinstance(var, type(var))
返回True
我目前正在 pdb 跟踪中解决这个问题
ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>
为什么会发生这种情况?
PS按预期isinstance(var, type(var))
返回True
我只能猜测,但如果你这样做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__
模块。如果它是以其真实名称在其他地方导入的,那么它也以该名称以及不同的名称空间为人所知。
另一个猜测可能是您正在使用ABC或以其他方式让该类具有__instancecheck__()
方法。
iPython 中“autoreload”设置的用户可能会遇到这种情况。当一个类被重新加载时,它将成为一个具有完全相同名称的新类。旧类的实例不会更新其类型:
# 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
我也遇到了这个问题,因为我的进口问题。我Type
曾经parent.child.Type
从child.Type
. 我假设当使用完整路径时,模块是从已安装的 pip 包中导入的,而使用相对路径时,它会作为新模块即时导入。