我目前正在使用pdb追踪来解决这个问题
ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>
为什么会发生这种情况?附注:
isinstance(var, type(var))
返回预期的 True
。我目前正在使用pdb追踪来解决这个问题
ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>
为什么会发生这种情况?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__
模块。如果在其他地方以真实名称导入,则使用不同的命名空间也可以使用该名称。
另一个猜测可能是您正在使用ABCs或使类具有__instancecheck__()
方法。
__str__
、__iter__
、__len__
。所以这不是问题所在。此外,这个类是object
的子类。 - evgeniuzid(type(var))
,type(var) is Type
等内容。 - Karl KnechtelType is var.__class__
,因为 Type is type(var)
可能会失败。这仍然是相关的,因为 distutils
类被 setuptools
打了猴子补丁。 - 0 _"autoreload"设置在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
imp.reload(module)
和重新实例化 x
之外,还有其他选项吗?我可以提出一个问题。 - OverLordGoldDragon我也遇到了这个问题,对我来说问题出在我的导入上。我从parent.child.Type
和child.Type
两次导入了Type
。我猜想当使用完整路径时,模块是从已安装的pip包中导入的,而使用相对路径时,它会作为一个新模块即时导入。
import
/reload
的特殊操作吗? - Roman Bodnarchukprint repr(var.__class__), repr(Type)
来检查。我通过将相对导入改为绝对导入来解决了这个问题。我会创建一个演示该问题的代码。 - Kenji Noguchi