当第三方库方法使用isinstance()
将对象与类进行比较时,它返回False
,因为它将对象的完全限定类名与启动的合格类名进行比较&# 34;更高"起来。
例如:isinstance()
发现对象类和类名不同:
预期:
' network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage'
实测值:
'的后端 .network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage'
并在给定代码段的情况下返回False
:
if not isinstance(value, self.type):
raise ValidationError('Expected type %s for field %s, '
'found %s (type %s)' %
(self.type, name, value, type(value)))
有没有办法更改类的完全限定名称(至少暂时)?
答案 0 :(得分:4)
要使其返回True,isinstance
的第一个参数必须是第二个的实例。为两个参数提供相同的类会导致False:
>>> isinstance( int, int)
False
>>> isinstance( int(1), int)
True
这里,int
是一个类,而一个类不是类的实例。
int(1)
是一个整数(int
的实例)。因此,第二个示例返回True。
让我们在应用于限定名称和非限定名称时比较isinstance
:
>>> import numpy
>>> from numpy import bool
>>> isinstance( numpy.bool, bool)
False
>>> isinstance( bool, numpy.bool)
False
>>> isinstance( bool(1), numpy.bool)
True
>>> isinstance( numpy.bool(1), bool)
True
名称限定不会影响结果。
答案 1 :(得分:4)
就Python而言,类network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage
和backend.network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage
并不相同。即使它们具有完全相同的定义也是如此,因为它们是从同一个文件中读取的!
你的错误不是isinstance
返回“错误”的答案,而是你能够通过两个不同的名称访问这两个类(也可能是其他类)。
导致该错误的问题可能有两个。首先,你可能在某处乱用了sys.path
。这本身并不坏,但是通过使backend
包的内容以两种不同的方式提供,首先直接(例如import network
)和backend
({{1 }})。你不想要这个。
您的错误的第二部分(可能是导致第一部分的激励因素)是,您实际上使用两种方式访问这些对象。你只需要一个,因此应该以错误的方式修复导入包的部分。