python中的奇怪枚举行为

时间:2019-05-22 09:07:58

标签: python python-3.x enums

我有以下枚举(为了使示例更清晰,该枚举被截断了)

class ObjectNames(enum.Enum):
    full = 'full'

还有一个:

class ObjectPoses(enum.Enum):
    front = 'front'
    left = 'left'
    right = 'right'

这两个枚举具有以下关系:

class ObjectNamePoseMatcher:
    match = {
        ObjectNames.full: [ObjectPoses.front, ObjectPoses.right, ObjectPoses.left],
}

因此,它基本上在ObjectName和位姿之间创建关系。 这是设置。在某些时候,尝试进行KeyError查找时,我的代码因ObjectNamePoseMatcher.match而失败。具体来说,它失败并显示以下错误消息:

KeyError: <ObjectNames.full: 'full'> 在这里失败:

ObjectNamePoseMatcher.match[self._object_name]

但是

>>self._object_name
<ObjectNames.full: 'full'>

>>ObjectNamePoseMatcher.match {<ObjectNames.full: 'full'>: [<ObjectPoses.front: 'front'>, <ObjectPoses.right: 'right'>, <ObjectPoses.left: 'left'>]}

所以钥匙在那里。这很奇怪,所以我执行了以下代码段:

for k,v in ObjectNamePoseMatcher.match.items():
    print(k,k==self.object_name)
    print(hash(k)==hash(self.object_name))
    print(id(k)==id(self.object_name))
    print(id(type(k))==id(type(self.object_name)))

这导致: ObjectNames.full False True False False 因此ObjectNames.fullself._object_name具有相同的哈希值,但类型,ID和类型ID不同。但是哈希是一样的。

此后,我转到设置self._object_name字段的第一个地方。再次执行相同的代码片段,得到相同的结果。我在这一行之后执行了以下代码段:

d.object_name = ObjectNames.full 但是,如果我在此断点处重新执行此行

d.object_name = ObjectNames.full 然后执行上述代码段,我得到以下输出:

ObjectNames.full True True True True 因此,现在哈希,ID和类型ID匹配!毫无生气,我只是在断点处停下来重新执行了同一行。

这里可能出什么问题了?

谢谢

1 个答案:

答案 0 :(得分:0)

我认为您想要IntEnum而不是EnumIntEnum通过整数值进行比较,因此通过与其他无关枚举的传递性进行比较。您显然希望ObjectNamesObjectPoses的实例具有可比性,而我不认为Enum的工作如此。