在条件语句中检查对象类型的正确方法是什么?
编辑:看来我误诊了这个问题。我的条件语句没有触发,因为 json.dumps 代码没有像我想象的那样工作。尽管错误消息说的o.__class__.name
是int64
,但在引发错误之前它实际上从未具有该值(我通过逐步调试进行了检查)。它是如何工作的,我不太清楚,这是另一天的主题。我将在下面回答这个问题。
我可以按照以下 Lenik 的建议解决我遇到的问题。
背景:
执行时
from json import dumps
json.dumps(vars(my_object))
我收到一个错误
File "C:\ProgramData\Anaconda3\lib\json\encoder.py", line 180, in
default o.__class__.__name__)
TypeError: Object of type 'int64' is not JSON serializable
json.dumps
在 python 中使用时出错,在运行代码后,我使用该vars
语句将某些对象转换为字典。
我得出结论,在对象的某个地方我使用的是 numpyint64
而不是标准的 python int
,这导致了错误。
问题是 my_object 有很多层和地方可以看。
所以我认为聪明的做法是在第 180 行放置一个条件断点(我可以在 PyCharm 中做到这一点),C:\ProgramData\Anaconda3\lib\json\encoder.py
条件是
o.__class__.__name__ == "int64"
然后我可以在调试模式下运行代码,并希望找到有问题的层/变量。
我已经尝试过,以及在我的dumps
调用和调用堆栈中的最低点之间的几个点调用堆栈中,但我的断点从未被触发。
因此,我怀疑我没有使用正确的条件语句来检查正在序列化的对象的名称......?
因此我的问题是:在条件语句中检查对象类型的正确方法是什么?
这是导致问题的对象:
[
{
"combat_id":null,
"units":[
{
"unit_id":7,
"engagements":{
"front":[
8,
-20,
-20
],
"left":[
],
"right":[
],
"rear":[
]
}
},
{
"unit_id":8,
"engagements":{
"front":[
7,
-20,
80
],
"left":[
],
"right":[
],
"rear":[
]
}
}
],
"combat_log":{
"combat_id":null,
"full_log":[
[
{
"initiative_step":"asf",
"_load_printables":true,
"striker_names":[
"Pieka's Spear Boys",
"Coert's Pennyless Pokers"
],
"striker_descs":[
"High Elf Core Infantry",
"High Elf Core Infantry"
],
"striker_players":[
"Pieka",
"Coert"
],
"striker_qtys":[
25,
21
],
"target_names":[
"Coert's Pennyless Pokers",
"Pieka's Spear Boys"
],
"target_descs":[
"High Elf Core Infantry",
"High Elf Core Infantry"
],
"target_players":[
"Coert",
"Pieka"
],
"target_qtys":[
21,
25
],
"attack_types":[
"melee",
"melee"
],
"attacks":[
20,
21
],
"to_hit_dcs":[
4,
4
],
"hits":[
10,
10
],
"to_wound_dcs":[
4,
4
],
"savable_wounds":[
5,
5
],
"armor_dcs":[
5,
5
],
"armor_saves":[
1,
1
],
"ward_dcs":[
7,
7
],
"ward_saves":[
0,
0
],
"unsaved_wounds":[
4,
4
],
"remaining_wounds":[
17,
21
],
"input":[
""
],
"printables":[
"<dominus_core.objects.sub_classes.combat.init_step_log.PrintableEntry object at 0x000000000EA72B70>",
"<dominus_core.objects.sub_classes.combat.init_step_log.PrintableEntry object at 0x000000000EA92C88>"
],
"printable_strings":[
],
"longest_name":1,
"_longest_name":28
}
]
],
"easy_log":[
]
}
}
]
您可以为标准 json 序列化程序无法识别的对象创建序列化程序:
def my_json_serializer(obj):
if isinstance(obj, int64):
return int(obj) # or whatever other conversion you'd prefer
raise TypeError ("Type %s not serializable" % type(obj))
然后像这样使用它:
json.dumps( vars(my_object), default=my_json_serializer)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句