python中奇怪的枚举行为

2024-04-26 02:53:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下枚举(它被截断以使示例更清晰)

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和pose之间的关系。 这是设置。在尝试进行ObjectNamePoseMatcher.match查找时,KeyError会导致代码失败。具体来说,它会失败,并显示以下错误消息:

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匹配!没有理由,我只是在断点处停止后重新执行了同一行。你知道吗

这里可能会出什么问题?你知道吗

谢谢


Tags: nameselfrightidtrueobjectmatchleft
1条回答
网友
1楼 · 发布于 2024-04-26 02:53:44

我想你想要的是IntEnum而不是EnumIntEnum通过整数值进行比较,因此通过对其他不相关枚举的传递性进行比较。很明显,你期望ObjectNamesObjectPoses的实例是可比较的,我不认为Enum是这样工作的。你知道吗

相关问题 更多 >