但是当我编码出错时,传递给特定编码器函数的类EPPI_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)
在编码的代码中,我放了一些'print'来确定传递对象的性质:
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
有人可以解释一下发生了什么吗?
答案 0 :(得分:0)
猜一点:
JSON编码器已经知道如何处理dicts,因此它以与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)):