簡體   English   中英

python中的奇怪枚舉行為

[英]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.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匹配! 毫無疑問,我只是在斷點處停止后重新執行了同一行。

這里可能出什么問題了?

謝謝

我認為您想要IntEnum而不是Enum IntEnum按整數值進行比較,因此按對其他無關枚舉的可傳遞性進行比較。 您顯然希望ObjectNamesObjectPoses實例具有可比性,但我認為Enum不會那樣工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM