当第三方库方法使用isinstance()
将对象与类进行比较时,它返回False
,因为它将对象的完全限定类名与以“更高”开头的限定类名进行比较。在
例如:isinstance()
发现对象类和类名不同:
期望:
'network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage'
找到:
'backend.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)))
有没有办法更改类的完全限定名(至少是暂时的)?在
就Python而言,}类是不同的。即使它们具有完全相同的定义,因为它们是从同一个文件中读取的,也是如此!在
network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage
和{你的错误并不是
isinstance
返回了“错误”的答案,而是你可以用两个不同的名称访问这两个类(可能还有其他类)。在可能导致两个错误的问题。首先,您可能在某个地方有一些代码正在与
sys.path
相混淆。这并不是什么坏事,但它通过两种不同的方式使backend
包的内容可用,第一种是直接(例如import network
)和通过backend
(from backend import network
)来提供。你不想这样。在bug的第二个部分(可能是导致第一个部分的动机因素),是您实际上在使用两种访问对象的方式。您只需要一个,因此应该修复导入包的错误方式的部件。在
要使其返回True,
isinstance
的第一个参数必须是第二个参数的实例。为两个参数提供相同的类会导致False:这里,
int
是一个类,而一个类不是一个类的实例。在相反,
int(1)
是一个整数(int
的一个实例)。因此,第二个示例返回True。在名称限定
让我们比较一下
^{pr2}$isinstance
应用于限定名和非限定名时:名称限定不影响结果。在
相关问题 更多 >
编程相关推荐