如何编写一个可以在in语句左侧使用的类?

时间:2019-06-18 11:17:05

标签: python python-3.x class

我有一个叫做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

1 个答案:

答案 0 :(得分:1)

您不应从问题代码中获取哈希错误。当Python尝试哈希对象以用作dict中的 key 时,会发生此错误,该对象的类未实现__has__。在您的代码中,所有键都是str,因此一切正常。

您实际上是否尝试将Mode的任何实例(例如,我想是SwSetHwRstHwSetSwRst)存储为specials中的键?另请注意,即使您从未尝试存储这样的无效密钥,仅查找无效密钥的操作也会导致相同的错误。即假设SwSetHwRst in specials的类型为SwSetHwRst,则Mode是非法的。