[英]Strange enum behavior in 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和姿势之间创建关系。 这是设置。 在某些时候,尝试进行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.full
和self._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匹配! 毫无疑问,我只是在断点处停止后重新执行了同一行。
这里可能出什么问题了?
谢谢
我认为您想要IntEnum
而不是Enum
。 IntEnum
按整数值进行比较,因此按对其他无关枚举的可传递性进行比较。 您显然希望ObjectNames
和ObjectPoses
实例具有可比性,但我认为Enum
不会那样工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.