gpt4 book ai didi

python - 对象不匹配

转载 作者:行者123 更新时间:2023-11-28 19:27:10 25 4
gpt4 key购买 nike

我正在用 python 为字典派生类 EPPI_dictDB 类编写一些 json 编码器,此类的对象可能存储为类解析器的某些实例的值。

但是当我编码时出现了问题,传递给特定编码器函数的类 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)

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

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

谁能给我解释一下发生了什么?

最佳答案

猜测一下:

JSON 编码器已经知道如何处理字典,因此它对待字典子类的方式与对待字典的方式相同。但是,当它到达 s["parser"] 时,它不知道如何处理该对象,所以它调用您的 default 方法。 IE。从您的代码中,它看到的是 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)):

关于python - 对象不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7487722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com