对象不匹配

2024-09-30 18:16:56 发布

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

我正在用python为字典派生类EPPI\u dictDB编写一些json编码器,这个类的对象可以作为值存储在类解析器的一些实例中。你知道吗

但是当我编码出错时,传递给特定编码器函数的类EPPI\u dictDB的实例就变成了类解析器的实例!你知道吗

让我用一个例子来更好地解释。 如果我执行这个代码

import json
import raw.data_input as data_input
p = data_input.parser()
class data():
    def __str__(self):
        return self.name

data1 = data()
data1.name = "data1"
data1.proteins = ['acc1','acc2']
data1.peptides = [('acc1',['SEQTWO']),
                      ('acc2',['SEQONE'])]
p.parse(data1)
s = EPPI_dbopen('tmp.prj', flag='n')
s["parser"] = p

print s.__class__
print isinstance(s, EPPI_DictDB)
print isinstance(s, data_input.parser)

我得到这些结果:

<class '__main__.EPPI_DictDB'>
True
False

在我呼叫编码器之后:

print json.dumps(obj=s, cls=projectEncoder)

在编码的代码中,我放置了一些“指纹”来确定传递对象的性质:

class projectEncoder(json.JSONEncoder):
    def default(self, obj):

        print obj.__class__
        print isinstance(obj, EPPI_DictDB)
        print isinstance(obj, data_input.parser)

        if isinstance(obj, EPPI_DictDB):
            result = obj.__dict__
            if "parser" in result.keys():
                pars = result["parser"]
                result["parser"] = parserEncoder().encode(pars)
            if "selected" in results.keys():
                sel = result["selected"]
                result["selected"] = parserEncoder().encode(sel)
            return result
        return json.JSONEncoder.default(self, obj)

内部打印的结果是:

<class 'raw.data_input.parser'>
False
True

有人能解释一下发生了什么事吗?你知道吗


Tags: 实例selfjsonobjparserinputdataresult
1条回答
网友
1楼 · 发布于 2024-09-30 18:16:56

猜猜看:

JSON编码器已经知道如何处理dict,因此它将dict子类与dict处理的方式相同。但是,当它到达s[“parser”]时,它不知道如何处理对象,因此它会调用对象上的default方法。也就是说,从代码中,它看到的是p,而不是s。你知道吗

这似乎就是the docs所说的。你知道吗

编辑

看看你实际上在做什么,我认为应该有一个更简单的方法来实现这一点:

def default(self, obj):
    if isinstance(obj, data_input.parser):
        return parserEncoder().encode(obj)
    return super(projectEncoder, self).default(obj)

如果"selected"字段是另一种类型,那么只需将第二行更改为:

if isinstance(obj, (data_input.parser, type_of_selected)):

相关问题 更多 >