当fullyqualified对象类与限定类不同时,isinstance()返回false

2024-10-02 04:17:23 发布

您现在位置:Python中文网/ 问答频道 /正文

当第三方库方法使用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)))

有没有办法更改类的完全限定名(至少是暂时的)?在


Tags: 对象方法selfbackendfalsevalue代码段type
2条回答

就Python而言,network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage和{}类是不同的。即使它们具有完全相同的定义,因为它们是从同一个文件中读取的,也是如此!在

你的错误并不是isinstance返回了“错误”的答案,而是你可以用两个不同的名称访问这两个类(可能还有其他类)。在

可能导致两个错误的问题。首先,您可能在某个地方有一些代码正在与sys.path相混淆。这并不是什么坏事,但它通过两种不同的方式使backend包的内容可用,第一种是直接(例如import network)和通过backendfrom backend import network)来提供。你不想这样。在

bug的第二个部分(可能是导致第一个部分的动机因素),是您实际上在使用两种访问对象的方式。您只需要一个,因此应该修复导入包的错误方式的部件。在

要使其返回True,isinstance的第一个参数必须是第二个参数的实例。为两个参数提供相同的类会导致False:

>>> isinstance( int, int)
False
>>> isinstance( int(1), int)
True

这里,int是一个类,而一个类不是一个类的实例。在

相反,int(1)是一个整数(int的一个实例)。因此,第二个示例返回True。在

名称限定

让我们比较一下isinstance应用于限定名和非限定名时:

^{pr2}$

名称限定不影响结果。在

相关问题 更多 >

    热门问题