在条件语句中检查对象类型的正确方法是什么?
编辑:看来我误诊了这个问题。我的条件语句未触发,因为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
时出现错误。
我得出的结论是,对象中的某个地方我使用的是numpy int64
而不是标准的python int
,这会导致错误。
问题是my_object有很多层次和外观可供查看。
所以我认为明智的做法是在条件为C:\ProgramData\Anaconda3\lib\json\encoder.py
的第180行中放置一个条件断点(我可以在PyCharm中做到这一点)
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":[
]
}
}
]
答案 0 :(得分:1)
您可以为标准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)
答案 1 :(得分:0)
两者
my_object.__class__.__name__ == "int64"
和
type(my_object) == int64
是检查类型的有效方法。
如“编辑”问题中所述,我误解了我的问题。