我有一个叫做Mode的类,其中包含一个增强的变量;可以作为整数(0到6)或7个预定义字符串之一访问的单个变量。
我要写以下形式的声明:
specials = {'SW_SET_HW_RST': SwSetHwRst,
'HW_SET_SW_RST': HwSetSwRst}
if mode in specials:
specials[mode].code(f, setting)
其中mode是我的课程的实例。由于某些我不明白的原因,我收到了错误消息: TypeError:不可散列的类型:“模式”
我不能使用 hash 方法,因为它会返回一个整数。有人可以给我一些线索,用于在in的左侧和字典查找中使用时如何返回模式的字符串版本吗?
模式类的完整代码如下所示:
class Mode():
''' class to flexibly handle the access mode of a setting within a register
Whereas mode used to be int, which does not make the code very readable
MODE can now be accessed as an int or as a string, allowing self documenting code
'''
MODES = {0: 'RW',
1: 'R',
2: 'CONST',
3: 'SW_SET_HW_RST',
4: 'SW_SET_HW_UPD',
5: 'HW_SET_SW_RST',
6: 'W',
7: 'VRW'
}
MODE_INV = {v:k for k,v in MODES.items()}
def __init__(self, mode):
''' instantiation can take a legacy numeric key or a string key
'''
if mode not in self.MODES.keys() and mode not in self.MODE_INV.keys():
raise ValueError('Undefined register mode: %s' % (mode))
if mode in self.MODES.keys():
self._mode = mode
else:
self._mode = self.MODE_INV[mode]
def __eq__(self, other):
return self._mode == other if isinstance(other, int) else self.MODES[self._mode] == other
def __str__(self):
return self.MODES[self._mode]
def __repr__(self):
return self.MODES[self._mode]
@property
def is_read_only(self):
return self._mode in [1, 4, 5]
@property
def is_rw(self):
return self._mode in [0, 3, 7]
@property
def is_writable(self):
return self._mode not in [1, 2]
@property
def legacy(self):
''' for legacy use
'''
return self._mode
答案 0 :(得分:1)
您不应从问题代码中获取哈希错误。当Python尝试哈希对象以用作dict
中的 key 时,会发生此错误,该对象的类未实现__has__
。在您的代码中,所有键都是str
,因此一切正常。
您实际上是否尝试将Mode
的任何实例(例如,我想是SwSetHwRst
或HwSetSwRst
)存储为specials
中的键?另请注意,即使您从未尝试存储这样的无效密钥,仅查找无效密钥的操作也会导致相同的错误。即假设SwSetHwRst in specials
的类型为SwSetHwRst
,则Mode
是非法的。