在条件语句中检查对象类型的正确方法是什么-python

时间:2018-06-30 11:08:21

标签: python debugging types pycharm conditional-statements

在条件语句中检查对象类型的正确方法是什么?

编辑:看来我误诊了这个问题。我的条件语句未触发,因为json.dumps代码无法正常运行。即使错误消息说o.__class__.nameint64,但在引发错误之前,它实际上从未具有该值(我通过逐步调试进行了检查)。我不太了解它是如何工作的,这是另一天的主题。我将在下面回答这个问题。

我可以按照下面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":[  

         ]
      }
   }
]

2 个答案:

答案 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 

是检查类型的有效方法。

如“编辑”问题中所述,我误解了我的问题。